关于汇编语言问题,入栈出栈什么用

一个程序开始的时候,下面指令什么意思
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, DAT
MOV DS, AX

第1个回答  2016-01-24
对于现代的计算机来说,栈是一种非常关键、极其重要的数据结构。
栈就相当于一个细长的装弹珠的瓶子(瓶口、瓶身内部截面均只能通过一个弹珠),不同颜色的弹珠只能从瓶口装入,也只能从瓶口取出,在瓶内的弹珠的顺序是不能改变的。这些弹珠具有“先进后出、后进先出”的特性。瓶子有一定的长度,装满弹珠后就不能再装了,再装就直接滚跑了(溢出)。
程序不都是线性的,有分支、有循环,有主程序、也有子程序。在子程序中,栈通常用来保存现场(进栈--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进行入口参数设置。
第2个回答  2010-11-14
去看雪
相似回答