其中第2題是這樣的:
(2) 仔細(xì)觀察圖3.19中的實(shí)驗(yàn)過(guò)程,然后分析:為什么2000:0~2000:f中的內(nèi)容會(huì)發(fā)生改變?
可能要再做些實(shí)驗(yàn)才能發(fā)現(xiàn)其中的規(guī)律。如果你在這里就正確回答了這個(gè)問(wèn)題,那么要恭喜你,因?yàn)槟阌泻芎玫奈蛐浴4蠖鄶?shù)的學(xué)習(xí)者對(duì)這個(gè)問(wèn)題還是比較迷惑的,不過(guò)不要緊,因?yàn)殡S著課程的進(jìn)行,這個(gè)問(wèn)題的答案將逐漸變得顯而易見(jiàn)。
對(duì)這道問(wèn)題,我看到網(wǎng)上的前輩基本上一致認(rèn)可的答案是:因?yàn)橛肨指令進(jìn)行調(diào)試時(shí),會(huì)產(chǎn)生中斷。而為了保護(hù)現(xiàn)場(chǎng),CPU則先將標(biāo)志寄存器進(jìn)棧、再把當(dāng)前CS的值進(jìn)棧,最后將IP的值進(jìn)棧。所以內(nèi)容也就是:IP-CS-EFlags-棧底.
這個(gè)答案是對(duì)的,不過(guò)我做了很多次實(shí)驗(yàn),發(fā)現(xiàn)棧中不僅僅是這些內(nèi)容,還壓了另外兩個(gè)寄存器:BP和AX。大家可以通過(guò)以下代碼實(shí)驗(yàn):
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
結(jié)果如下:
也就是棧里面內(nèi)容有:AX-BP-IP-CS-EFlags-自己push的內(nèi)容-棧底。
疑問(wèn)就是為什么要保存ax和bp呢?