实验二

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关键数据,所以,你的栈里就有些不是你操作的数据了。 

原文地址:https://www.cnblogs.com/xinqimisa/p/9864609.html