包含多个段的程序:在代码段中使用栈
2018-08-16 本文已影响30人
柠檬就是酸
问题:
利用栈,将程序中定义的数据逆序存放
assume cs:codeseg
codeseg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fdeH,0cbaH,0987H
?
code ends
end
代码:
assume cs:codeseg
codeseg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fdeH,0cbaH,0987H
dw 0,0,0,0,0,0,0,0 ;用dw来定义8个字型数据,在程序加载后,
;将取得8个字的内存空间,存放这8个数据,在后面的
;程序中,将这段空间作为栈来使用
start: mov ax,cx
mov ss,ax
mov sp,32 ;设置栈顶指向cs:32
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s ;以上代码将0~15单元中的数据依次压栈
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0 ;以上代码将0~15单元中的数据依次出栈
codeseg ends
end start
代码分析:
- 首先从内存的角度看,本程序的首地址为cs,然后后面跟着16个字型数据,逻辑地址下,cs地址为0,之后的0~31共32个内存单元存放的是这些数据,根据栈的要求,栈顶指针指向cs:32。之后的程序都是在这32个内存单元中进行的。
- 接下来的几行代码是循环使数据入栈,由于是字型数据,所以bx每次增加2。接下来是这些数据依次出栈,注意bx要重新设为0。因为出栈的第一个元素是原来内存中的最后一个。
- 其余说明在代码注释中有。