汇编 实验二

实验任务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,存储时都以字为单位存储。

原文地址:https://www.cnblogs.com/wtblogwt/p/9851855.html