实验任务:
使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
(为了便于验证实验结果,对「2. 实验任务」中的(1)做如下两点调整:① 在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H ② 将 P74 实验任务(1)中第 1行的 mov ax, ffff → 改为 mov ax, 0021)
实验结果:
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= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 6462H
push bx ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 6c6AH
pop ax ;sp= 00FEH ,ax= 6c6AH
pop bx ;sp= 0100H ,bx= 6462H
push [4] ;sp= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 3534
push [6] ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 3736
实验截图:
(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
第一行汇编指令功能:将2000送入AX寄存器
第二行:将ax的值赋给ss
第三行:将0100赋给ss
初始时栈顶和栈底分别是2000:0010和2000:000E。
并且2000:0~2000:f的内容发生改变是因为在debug使用t等指令引发了中断造成的,中断过程使用当前栈空间存放cpu关键数据,所以,你的栈里就有些不是你操作的数据了。