关于汇编语言问题,入栈出栈什么用
一个程序开始的时候,下面指令什么意思PUSHDSSUBAX,AXPUSHAXMOVAX,DATMOVDS,AX...
一个程序开始的时候,下面指令什么意思
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, DAT
MOV DS, AX 展开
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, DAT
MOV DS, AX 展开
展开全部
对于现代的计算机来说,栈是一种非常关键、极其重要的数据结构。
栈就相当于一个细长的装弹珠的瓶子(瓶口、瓶身内部截面均只能通过一个弹珠),不同颜色的弹珠只能从瓶口装入,也只能从瓶口取出,在瓶内的弹珠的顺序是不能改变的。这些弹珠具有“先进后出、后进先出”的特性。瓶子有一定的长度,装满弹珠后就不能再装了,再装就直接滚跑了(溢出)。
程序不都是线性的,有分支、有循环,有主程序、也有子程序。在子程序中,栈通常用来保存现场(进栈--push、pusha、pushf),在栈中定义局部变量,执行完成后要恢复现场(出栈--popf、popa、pop)。没有栈这种数据结构,很难想象现在的软件是个什么样子。
例:
用汇编语言(masm)编写程序段,实现从键盘输入十个一位10进制数后累加以非压缩BCD码形式存放在AH和AL中。
code segment
assume cs:code
org 100h
start:
jmp bbb
lfcr db 13,10,'$'
bbb:
push cs
pop ds
call inputnum
mov ah,9
lea dx,lfcr
int 21h
lea si,array
mov ch,0
mov cl,byte ptr[num]
mov ax,0
lp:
add ax,word ptr[si]
daa ; 十进制加法调整指令
inc si
inc si
loop lp
call dispnum
mov ah,4ch
int 21h
dispnum proc near
; 将要显示的数据放入AL中
mov dl,al ; 将AL暂存在DL中
and al,0Fh ; 取AL的低4位
mov bl,al ; 非压缩的bcd码
add bl,30h ; 转成ASCii码
mov al,dl ; 取回AL 并经以下4次右移取出AL的高4位
shr al,1
shr al,1
shr al,1
shr al,1
mov bh,al ; 非压缩的bcd码
add bh,30h ; 转成ASCii码
mov ax,bx ; 非压缩的两位数的ASCii码存放在AX中
mov byte ptr[y+4],al
mov byte ptr[y+3],ah
mov ah,9
lea dx,y
int 21h
ret
y db 10,13,0,0,0,'$'
dispnum endp
inputnum proc near
; 输入的数据以一个空格分隔,以回车符结束输入
lea di,array ;将数组第一个元素的有效地址置入DI
mov byte ptr[num],0
stin:
mov ax,0
push ax
again1:
mov ah,1
int 21h
mov byte ptr[char],al
cmp al,13
je line0
cmp al,' '
je line0
sub al,30h
mov ah,0
mov si,ax
pop ax
mov cl,10
mov ch,0
mul cx
add ax,si
push ax
jmp again1
line0:
pop ax
mov word ptr[di],ax
inc byte ptr[num]
cmp byte ptr[char],13
je stinend
inc di
inc di
jmp stin
stinend:
ret
array dw 100 dup(0)
num db 0
char db ?
inputnum endp
code ends
end start
请注意inputnum子程序,在开始部分执行了 push ax,就是为了保存寄存器ax的值,因为在int 21H中断子程序中要用ax进行入口参数设置。
栈就相当于一个细长的装弹珠的瓶子(瓶口、瓶身内部截面均只能通过一个弹珠),不同颜色的弹珠只能从瓶口装入,也只能从瓶口取出,在瓶内的弹珠的顺序是不能改变的。这些弹珠具有“先进后出、后进先出”的特性。瓶子有一定的长度,装满弹珠后就不能再装了,再装就直接滚跑了(溢出)。
程序不都是线性的,有分支、有循环,有主程序、也有子程序。在子程序中,栈通常用来保存现场(进栈--push、pusha、pushf),在栈中定义局部变量,执行完成后要恢复现场(出栈--popf、popa、pop)。没有栈这种数据结构,很难想象现在的软件是个什么样子。
例:
用汇编语言(masm)编写程序段,实现从键盘输入十个一位10进制数后累加以非压缩BCD码形式存放在AH和AL中。
code segment
assume cs:code
org 100h
start:
jmp bbb
lfcr db 13,10,'$'
bbb:
push cs
pop ds
call inputnum
mov ah,9
lea dx,lfcr
int 21h
lea si,array
mov ch,0
mov cl,byte ptr[num]
mov ax,0
lp:
add ax,word ptr[si]
daa ; 十进制加法调整指令
inc si
inc si
loop lp
call dispnum
mov ah,4ch
int 21h
dispnum proc near
; 将要显示的数据放入AL中
mov dl,al ; 将AL暂存在DL中
and al,0Fh ; 取AL的低4位
mov bl,al ; 非压缩的bcd码
add bl,30h ; 转成ASCii码
mov al,dl ; 取回AL 并经以下4次右移取出AL的高4位
shr al,1
shr al,1
shr al,1
shr al,1
mov bh,al ; 非压缩的bcd码
add bh,30h ; 转成ASCii码
mov ax,bx ; 非压缩的两位数的ASCii码存放在AX中
mov byte ptr[y+4],al
mov byte ptr[y+3],ah
mov ah,9
lea dx,y
int 21h
ret
y db 10,13,0,0,0,'$'
dispnum endp
inputnum proc near
; 输入的数据以一个空格分隔,以回车符结束输入
lea di,array ;将数组第一个元素的有效地址置入DI
mov byte ptr[num],0
stin:
mov ax,0
push ax
again1:
mov ah,1
int 21h
mov byte ptr[char],al
cmp al,13
je line0
cmp al,' '
je line0
sub al,30h
mov ah,0
mov si,ax
pop ax
mov cl,10
mov ch,0
mul cx
add ax,si
push ax
jmp again1
line0:
pop ax
mov word ptr[di],ax
inc byte ptr[num]
cmp byte ptr[char],13
je stinend
inc di
inc di
jmp stin
stinend:
ret
array dw 100 dup(0)
num db 0
char db ?
inputnum endp
code ends
end start
请注意inputnum子程序,在开始部分执行了 push ax,就是为了保存寄存器ax的值,因为在int 21H中断子程序中要用ax进行入口参数设置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
去看雪
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询