实验二
1、使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax,0021
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax= 3130H
add ax,[2] ;ax= 6462H
mov bx,[4] ;bx= 3534H
add bx,[6] ;bx= 6C6AH
push ax ;sp= 00FE ,修改的内存单元地址是 2200:00FE 内容为 6462H
push bx ;sp= 00FC ,修改的内存单元地址是 2200:00FC 内容为 6C6AH
pop ax ;sp= 00FE ,ax= 6C6AH
pop bx ;sp= 0100 ,bx= 6462A
push [4] ;sp= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 3534H
push [6] ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 3736H
使用e命令修改0021:0~0021:7内存单元数据,并用d命令查看是否正确修改,如下图:
用a命令写入汇编指令,如图:
用t命令逐条执行,如下图:
在用t命令执行mov ss,ax语句的时候,它的下一条指令mov sp,0100也紧跟着执行了;
2、仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生变化?
前三行指令是给指向栈顶元素的SS:SP赋值,SS=2000H,SP=0010H。初始时栈顶和栈底都被e命令赋值为0。
为什么2000:0~2000:f中的内容发生变化(这个不会,百度的)
因为在debug使用t等指令引发了中断造成的,中断过程使用当前栈空间存放cpu关键数据,所以,你的栈里就有些不是你操作的数据了。