dssg segment stack
aa dw 512dup(?)
dssg ends
一般的说,当PUSH/POP指令不频繁时用系统堆栈就可以了,但是当需要堆栈存储大量数据,如作为子程序传替参数时就要定义一个堆栈,而且一般来说一个段的内容不能超过64K,因为偏移地址最大只能表示64K,所以定义的堆栈也不能是无限大,如果超过了64K,就定义两个吧!
堆栈在汇编中对于初学者用的很少,一般小程序都不需要用的!用起来也不是很难,就是注意下,在子程序调用时,什么时候是返回地址,什么时候是寄存器值!总之,记住先进后出,再做题时画个堆栈图,应该不会很难的!
assume cs:code,ss:stack,ds:data 段说明, 自己定义的code对应代码段, stack对应堆栈段, data对应数据段
stack segment stack 堆栈段的定义
byte 64 dup(0)
stack ends
data segment 数据段的定义
msg byte 'hello world!$'
data ends
code segment代码段的定义
start:
mov ax,data
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
=============以上是一个常见的定义=============
masm 5.0 以后也支持简化定义如 .data 为数据段 .code表示代码段, 形式如下:
.model small
.stack 200h定义堆栈段大小
.data定义数据段
szMsg db 'Hello World!',13,10,'$'
.CODE代码段的定义
START:
mov ax,@data
mov ds,ax
mov es,ax
mov si,0
mov es:[bx+1+si],ah
lea dx,szMsg
mov ah,9
int 21h
暂停,任意键关闭
mov ah,1
int 21h
mov ah,4ch 结束,可以修改al设置返回码
int 21h
END START
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)