現在是學習匯編語言的第八周,要完成實驗任務二和三,因為我的一時疏忽一開始沒有加入教學班,所以實驗任務一雖然寫了隨便但是並沒有提交記錄……
不過這也算給自己一個教訓,剛開始學習並沒有很重視,但是看到了同班同學寫的博客感覺觸動挺大,很多人已經不僅僅局限於課堂上的學習知識了,自己在學習上也應該更加主動了
實驗任務二
實驗任務(1)
按實驗結果填空:
mov ax,0021
mov ds,ax
mov ax,2000
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=3130
add ax,[2] ;ax=6462
mov bx,[4] ;bx=3534
add bx,[6] ;bx=6C6A
push ax ;sp=00FE;修改的內存單元的地址是2200:00FE內容為3130
push bx ;sp=00FC;修改的內存單元的地址是2200:00FC內容為6462
pop ax ;sp=00FC;ax=6122
pop bx ;sp=00FC;bx=5CCA
push [4] ;sp=00FC;修改的內存單元的地址是:00FE內容為3130
push [6] ;sp=00FC;修改的內存單元的地址是:00FC內容為6264
為了方便輸入先用R CS:IP指令將CS:IP指向修改為指向1000:0000,再用e命令輸入e 0021:0 30 31 32 33 34 35 36 37
用D命令查看內存中的內容,發現已經修改成功
再用A命令輸入要求的指令,用T命令單步執行並觀察每一步指令的執行情況:
可以看到,雖然有15條指令但是只執行了14步,可以看到再執行完 mov ss,ax后,寄存器SP的值也被更改成了 0100,而這一步本應該是下一步要執行的命令。T指令都是只執行一步的。
關於這點書上給的是:Debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接着被執行。日后的課程會進一步解釋“中斷機制”,今天先寫在這里。
實驗(2)
用Debug工具使用A命令寫入指令並如實驗要求執行:
然后使用 e 命令修改 0021:0~0021:f 數據,及修改后查看是否正確寫入的操 作 使用 a 命令輸入的 p74中的指令,用T命令單步執行並且每次執行后查看2000:f中的變化:
前三段指令的功能:
2000進入AX寄存器,
AX中的值賦值給SS,
SP的值改為0010。
變化的原因為:
因為T命令是單步中斷,而CPU執行中斷時會保留現場,即將標志寄存器CS,IP等入棧,而實驗中棧的地址正好是要查詢的內存地址,但是里面的值會因為保留現場而被更改。
2.總結體會
通過觀察T命令的單步執行過程,對出棧入棧有了更深入的理解,同時初步了解到了中斷機制。