实验任务1:
(1)使用debug,将下面的程序写入内存,逐条执行,根据指令执行后的实际运行情况填空
mov ax,0021 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;ax=3130 add ax,[2] ;ax=6462 mov bx,[4] ;bx=3534 add bx,[6] ;bx=6C6A push ax ;sp=00FE;修改后的内存单元的地址是220FE 内容为 6462 push bx ;sp=00FC;修改后的内存单元的地址是220FC 内容为 646A pop ax ;sp=00FE;ax=6C6A pop bx ;sp=0100;bx=6462 push [4] ;sp=00FE;修改后的内存单元的地址是220FE 内容为 3534 push [6] ;sp=00FC;修改后的内存单元的地址是220FC 内容为 3736
1.使用e命令修改0021:0~0021:f 数据,及修改后查看是否正确写入:
2.使用a命令输入指令
3.对每一行指令进行单步调试
检验一致
实验任务2
观察实验过程,分析为什么2000:0~2000:f中的内容会发生改变?
1.使用a命令输入7行指令,使用e命令修改2000:0~2000:f的值,及修改后查看的部分
2.单步调试每一步,并同时查看2000:0~2000:f的值
分析:
前三行汇编指令的功能为:将20000H~2000FH这段空间当做栈,初始化栈顶为2000:0010
栈底为栈顶+2 即2000:0012
基于单步调试观察到的变化,我觉得:
因为我们一开始将2000:0~2000:f的这段空间作为一个栈来使用
所以对这个栈进行的操作就会体现在这段空间里,因此内容肯定会发生变化
总结与体会:
栈作为一个逻辑上的数据结构,具有后进先出的特性。我们可以安排任意何时的段作为内存,本质上都是
二进制数据,区别有寄存器决定,如CS,IP决定指令,SS,SP决定栈段。
push和pop实质上是内存转移指令,在栈空时,栈顶为栈底-2,存储时都以字为单位存储。