汇编语言实验 2:栈

414 阅读2分钟

1. 预备知识

  1. 栈是一种具有先进后出性质的数据结构,元素的入栈(push)和出栈(pop)都在栈顶进行。

  2. 在 8086CPU 中,入栈和出栈的操作都以字为单位。

  3. 使用段寄存器 SS 和寄存器 SS 来指示栈顶位置,栈顶从高地址往低地址方向增长。即,入栈时 SP 的值减小、出栈时 SP 的值增大。栈为空时,SS:SP 指向栈空间最高地址的下一单元。

  1. 在定义栈时只指定了栈空时的地址,栈顶超界可能导致其他内存单元数据被更改而产生意向不到的情况,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. 总结

  1. 栈是一种具有先进后出性质的数据结构,入栈和出栈都在栈顶进行。在 8086CPU 中,入栈和出栈以字为单位,且 SS:SP 指向栈顶

  2. 除本文介绍的内容外,栈的重要作用还包括后续在子程序调用中用于保护现场和恢复现场

  3. 参考:1. 参考:汇编语言/王爽著.——北京:清华大学出版社,2003