【實驗二】用機器指令和匯編指令編程(2)


四、實驗結論

任務一:使用debug,將下面程序段寫入內存,逐條執行,根據指令執行后的實際運行情況填空。

1.使用e命令修改0021:0處連續8個字節的值。

2.使用a命令編寫匯編指令。

3.使用t命令單步執行。

①(注意圖①,最后一步單步執行中,sp的變化

4.分析

此實驗使用棧實現了寄存器值的交換

指令 ax bx ss sp
mov ax,0021 0021 0000 073F 00FD
mov ds,ax

0021

(此時之后,ds=0021)

0000 073F 00FD
mov ax,2200   2200 0000 073F 00FD
mov ss,ax   2200 0000 2200 0100
mov sp,0100
mov ax,[0] 3130 0000 2200 0100
add ax,[2] 6462 0000 2200 0100
mov bx,[4] 6462 3534 2200 0100
add bx,[6] 6462 6C6A 2200 0100
push ax 6462 6C6A 2200 00FE
push bx 6462 6C6A 2200 00FC
pop ax 6C6A 6C6A 2200 00FE
pop bx 6C6A 6462 2200 0100
push [4] 6C6A 6462 2200 00FE
push [6] 6C6A 6462 2200 0000

  注:背景塗色的兩行代碼,在使用t命令單步執行時,同時進行。

6.書后習題

(圖中,藍色字體是mov ax,ffff的后續結果;紅色字體是mov ax,0021的后續結果)

更正:圖中內存單元地址的段地址,由2200更正為0021。

內存單元地址:DS:[ ]

棧地址:SS:SP

 

任務二:仔細觀察圖3.19中的實驗過程,然后分析,為什么2000:0~2000~f中的內容會發生改變?

1.使用a命令輸入匯編指令;

使用e命令修改2000:0段內存單元的值,使之為0;

使用d命令查看修改后的內存單元的值。

 

2.使用t命令單步執行;

使用d命令查看2000:0段內存單元的值。

 

3.分析

ss:sp,意味着棧頂指針,匯編指令mov修改了ss:sp,使之變為2000:0。

前三步初始化棧。

棧頂:2000:0100

棧底:2000:0000

注意第二步第三步同時執行。

當對棧進行操作時,ss:sp隨着入棧出棧的操作變化,會改變這一段內存單元的值。


五、總結與體會

通過任務一,我了解到,匯編指令對ss和sp是同時進行操作的,當兩條語句在相鄰的上下行時,使用t命令單步執行,這兩個指令會同時進行;我還進一步理解了,當使用到內存單元的地址[ ]時,默認以DS寄存器里的值作為段地址,去訪問DS:[ ];我還知道了,pop ax是把棧頂元素的值,彈到ax里,不是之前的錯誤理解(以為把ax彈出,其實一點都講不通)。

通過實驗二,我加深了對棧頂指針SS:SP的理解,明白了在編寫匯編指令時,要注意棧內存單元的選取,不能影響其他正常的操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM