汇编语言实验二

时间:2021-12-14 12:59:46

---恢复内容开始---

(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= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 6462

push bx       ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 6c6A

pop ax        ;sp= 00FEH ,ax= 6c6A

pop bx        ;sp= 0100H ,bx= 6462

以上为按要求1和2完成实验后得到的结果,下面为运行截图

汇编语言实验二

 汇编语言实验二

汇编语言实验二

 汇编语言实验二

汇编语言实验二

汇编语言实验二

汇编语言实验二

汇编语言实验二

汇编语言实验二

 汇编语言实验二

汇编语言实验二

这一段程序段中,最开始用ax作为中转分别将ds和ss两个段地址赋值为0021和2200,在sp被赋值为0100后,栈顶就被设为2200:0100。之后四段指令修改了ax,bx的值。在这一段ax和bx的值是从0021:0,即我们修改的那一段开始取的,由于8086cpu是小端发。我们不难理解ax在mov ax,【0】执行后变为了ax=3130h,再加上3332h最后ax=6462h,同样的bx=3534h+3736h=6c6ah。之后push ax和push bx 依次将ax bx 压入栈中,压入栈中的过程中栈顶自然会发生变化这也就是为何在执行这一段时,sp每次缩减两个字节的原因。同样再pop将栈中数值弹出到ax和bx后,sp再次回到了原来的0100h。然而我们可以发现ax和bx交换了数值,这就是栈后进先出的实例,之前操作中我们后让bx进栈所以pop ax执行时将后入栈的6c6ah弹出到ax,先入栈的6462h弹出到bx。之后push 【4】和push【6】则是将我们通过e修改的值再次入栈,不再多说。

(2)75页3.19中的代码是一个将栈顶设置为2000:10,然后修改ax的值在入栈的一个操作

开始时通过e命令将所有数据修改为0,但在执行完mov ss,ax后我们发现我们还并没有对2000:0之后这一段地址进行操作,但它已经发生了改变,在书本73页的内容我们知道在寄存器ss被修改时,它的下一条指令会自动执行。这也就不难理解mov sp,10被执行了。但2000:0里的数据发生改变,而且仔细观察会发现cs,ip和ax三个寄存器的值被入栈了。查阅资料后我了解到就比如说在执行完ss寄存器传送数据的指令之后,即便是发生了中断,CPU也不会响应,这样做的原因就在于ss:sp需要联合的去指向栈顶,对它们的设置应该去连续的完成,不然的话,如果我们在执行完设置ss的指令之后,CPU响应中断,引发了中断过程,要在栈中压入标志寄存器、CS和IP的值,而这个时候ss改变了,sp没有改变肯定会出错。所以CPU在执行完设置ss的指令之后不去响应中断。这里可以解释cs和IP会被压入栈中原因是cpu响应了中断,但在图例中mov sp,10却是自动执行的,这样说cpu应该并没有响应中断才对。这就又是一个新的问题。

 

 

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---