楼主:第二步执行:mov ss,ax-->mov sp,0100 (这里的sp,0100应该是0010)
额,你的猜想是我认为一部分是对的。
我猜想 单元2000:e f=0547 里的数据可能和我的电脑有关没有和书上一样! --这里是标志寄存器
我猜想 单元2000:c d=0b39 里的数据是CS中的数据
我猜想 单元2000:a b=010b 里的数据是IP中的数据
为什么会这样呢?
在debug下,我们用t命令时,每次都会产生单步中断,会把标志寄存器,CS,IP依次入栈。
0b39:0100 mov ax,2000
0b39:0103 mov ss,ax
0b39:0105 mov sp,10
这三句将栈顶设置成了2000:10 ,而栈是而高往低增长的,入栈过程呢是先增长而后入栈。
(你执行PUSH语句时注意SP的变化)。
所以当你执行mov等不改变栈的语句时,SP不变,标志寄存器,CS,IP还是被压入2000:10的地方,而执行完单步中断,又把原来压入的标志寄存器,CS,IP出栈(出栈操作只改变SP)。
0b39:0108 mov ax,3123
0b39:010b push ax
而当你执行PUSH语句时,先执行PUSH语句,然后将标志寄存器,CS,IP入栈,此时呢栈的情况为
2000:0000 ……(SP指向IP)IP CS 标志寄存器 23 31
当中断程序执行完,将IP CS 标志寄存器出栈,此时SP指向3123,
至于IP往前的单元和AX中的数据一样,不排除windows下Debug执行单步中断时把其它寄存器也压入栈中。(个人猜想,也可以在实模式DOS下对比下)
关于中断可以看书本12章 |