
比如.stack 64
那么堆栈的大小就是64个字节,而每个堆栈单元默认是两个字节(也就是一个字WORD),那么64/sizeof(WORD) = 64/2 = 32也就是有32个单元。
根据计算机体系的不同,有的栈是从低位往高位存储的,而在大姿芦多数的Intel机器上,栈的存储是从低位往高位存储的。
随后就可以在程序中使用堆栈指令
比如push ax将一个16位的ax寄存器(在Intel体系中也称为16位累加器),压入栈,那么栈顶指针ss-sizeof(WORD)=ss-2(Intel体系栈从高位往低位存储)
使用pop ax语句就是将ss所指向的单元d出给ax寄存器,同时ss+2。雀迟
栈的 *** 作遵守先进后出(FILO)原则,顷册李下面据个例子:
进栈
push ax
push bx
push cx
.... 若干语句
出栈(注意顺序)
pop cx
pop bx
pop ax
如果是系统默认,那你这程序有何意义?所以程序应使用你自己定义的堆栈,这也是你的目的。雹姿碰回到你问题,册启你之前有 assume ss:XX ,但编译器并不会就此认为 XX 就是你定义的堆栈,你得有所表示,所以你在源程序中一定要有语句表明你的意图,例如:MOV AX,XX MOV SS,AX
这样,源谈XX 就跟堆栈段 SS 联系起来了,程序也就知道你定义的堆栈在哪了。
下面给一个简单例子,将数据段data的内容逆序存放到堆栈段stack中
ASSUME CS:CODE, DS:DATA, SS:STACK
DATA SEGMENT
DW 1,2,3,4,5,6,7,8
DATA ENDS
STACK SEGMENT
DW 0,0,0,0,0,0,0,0
STACK ENDS
CODE SEGMENT
START: MOV AX,DATA这里将自定义的数据段 DATA 与 DS 联系起来
MOV DS,AX
MOV AX,STACK 这里将自定义的堆栈段 STACK 与 SS 联系起来
MOV SS,AX
MOV SP,10H
MOV BX,0
MOV CX,8
S:PUSH [BX]
ADD BX,2
LOOP S
MOV AX,4C00H
INT 21H
CODE ENDS
END START
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)