其中第2题是这样的:
(2) 仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
可能要再做些实验才能发现其中的规律。如果你在这里就正确回答了这个问题,那么要恭喜你,因为你有很好的悟性。大多数的学习者对这个问题还是比较迷惑的,不过不要紧,因为随着课程的进行,这个问题的答案将逐渐变得显而易见。
对这道问题,我看到网上的前辈基本上一致认可的答案是:因为用T指令进行调试时,会产生中断。而为了保护现场,CPU则先将标志寄存器进栈、再把当前CS的值进栈,最后将IP的值进栈。所以内容也就是:IP-CS-EFlags-栈底.
这个答案是对的,不过我做了很多次实验,发现栈中不仅仅是这些内容,还压了另外两个寄存器:BP和AX。大家可以通过以下代码实验:
mov ax,2000h
mov bx,3000h
mov cx,4000h
mov dx,5555h
mov bp,6666h
mov si,7777h
mov di,8888h
mov ds,bx
mov es,cx
mov bx,3333h
mov cx,9999h
mov ss,ax
mov sp,10h
mov ax,2222h
push ax
push bx
push cx
mov ax,6869h
结果如下:
也就是栈里面内容有:AX-BP-IP-CS-EFlags-自己push的内容-栈底。
疑问就是为什么要保存ax和bp呢?