实验二 用机器指令和汇编指令编程


1、使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

实验截图:

 

 

mov ax,0021     将0021赋值给ax

mov ds,ax     通过ax将0021赋给ds寄存器

mov ax,2200     将2200赋值给ax

mov ss,ax      通过ax将2200赋值给ss

mov sp,0100   将0100赋值给sp,则栈段为2200:0100

mov ax,[0]       ax=3130    此刻我们将0021:0000处的数据赋值给ax

add ax,[2]       ax=6462     即ax+0021:0002

mov bx,[4]      bx=3534      将0021:0004处的数据赋值给bx

add bx,[6]       bx=6C6A      即bx+0021:0006

push ax           sp=00FE ;修改的内存单元地址是 2200:0100内容为6462;入栈

push bx           sp=00FC;修改的内存单元地址是2200:00FC内容为6C6A;入栈

pop ax             sp=00FE;ax=6C6A;将栈顶的数据出栈赋值给ax

pop bx             sp=0100;bx=6462;将栈顶的数据出栈赋值给bx

push [4]          sp=00FE;修改的内存单元地址是 2200:0100内容为3534  ;入栈

push [6]          sp=00FC;修改的内存单元地址是2200:00FC内容为3736;入栈

 

2、观察截图的实验过程,分析为什么2000:0~2000:f中的内容会发生改变

 

mov ax,2000

mov ss,ax   //相当于将2000赋值给ss,即栈的段地址

mov sp,10   //相当于将0010赋值给sp,即栈的偏移地址

那么初始的栈顶为2000:0010,而栈底则为2000:000E

截图上看,我们在执行指令已经将2000:0 f内的数据全都赋值为零,而在进行栈的初始化后,其中的字节发生了改变,这是为什么呢?

t命令实际是引发了单步中断,执行中断例程时,CPU会将一些中断例程使用的的寄存器变量自动压栈到栈中,此例中就包括了上述的寄存器变量的值。

以上是我在网上搜索的结果,按照这种说法,CPU在执行初始化指令是将寄存器变量自动压栈,那么其中的数据也就改变了。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM