其中第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呢?