汇编程序中如何使用堆栈

汇编程序中如何使用堆栈,第1张

首先在程序头部定义程序堆栈的大小

比如.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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12325573.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存