1. 预备知识
-
栈是一种具有先进后出性质的数据结构,元素的入栈(push)和出栈(pop)都在栈顶进行。
-
在 8086CPU 中,入栈和出栈的操作都以字为单位。
-
使用段寄存器 SS 和寄存器 SS 来指示栈顶位置,栈顶从高地址往低地址方向增长。即,入栈时 SP 的值减小、出栈时 SP 的值增大。栈为空时,SS:SP 指向栈空间最高地址的下一单元。
- 在定义栈时只指定了栈空时的地址,栈顶超界可能导致其他内存单元数据被更改而产生意向不到的情况,8086CPU 不提供限制栈顶超界的情况。
2. 实验任务
如图所示,将 10000H~1000FH 中的 8 个字逆序拷贝到 20000H~2000F 中。
由于每次入栈和出栈以字为单位,涉及两个内存单元。
2.1 实验分析
将图左部分内容逆序传入右图单元,以右图所示区域为基础构建栈空间。由预备知识及图可知,栈空时 SS:SP 指向的内存单元地址为 20010H,即段地址为 2000H、偏移地址为 0010H。然后,从 10000H 处开始每次取 1 个字的数据,依次 push 进栈中即可。整体代码为:
assume cs:code
code segment
start:
mov ax,1000H
mov ds,ax ;段寄存器DS指向源单元
mov ax,2000H
mov ss,ax
mov sp,0010H ;初始化空栈
mov cx,8 ;循环次数
mov ax,0 ;用于循环单元
s:
push ds:[bx] ;压入寄存器BX表示的偏移地址的内容
add bx,2H ;每次偏移2个字节取一个字的内容
loop s ;循环
mov ax,4c00h
int 21h
code ends
end start
2.2 实验结果
程序运行前,内存 1000:0000~1000:000F 的值的存放情况:
编译,链接并运行可执行文件。程序运行后,内存 2000:0000~2000:000F 的值的存放情况:
3. 总结
-
栈是一种具有先进后出性质的数据结构,入栈和出栈都在栈顶进行。在 8086CPU 中,入栈和出栈以字为单位,且 SS:SP 指向栈顶
-
除本文介绍的内容外,栈的重要作用还包括后续在子程序调用中用于保护现场和恢复现场
-
参考:1. 参考:汇编语言/王爽著.——北京:清华大学出版社,2003