1. 程式人生 > >【匯編語言】實驗2 用機器指令和匯編指令編程(2)

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

http 會同 display 出棧 ima ext lock ble body

四、實驗結論

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

1.使用r命令查看各寄存器初始值。

技術分享圖片

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

技術分享圖片

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

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

4.分析

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

指令 ax bx ss sp
mov ax,ffff FFFF 0000 073F 00FD
mov ds,ax FFFF 0000 073F 00FD
mov ax,2200 2200 0000 073F 00FD
mov ss,ax 2200 0000 2200 0100
mov sp,0100
mov ax,[0] C0EA 0000 2200 0100
add ax,[2] C0FC 0000 2200 0100
mov bx,[4] C0FC 30F0 2200 0100
add bx,[6] C0FC 6021 2200 0100
push ax C0FC 6021 2200 00FC
push bx C0FC 6021 2200 00FC
pop ax 6021 6021 2200 00FE
pop bx 6021 C0FC 2200 0100
push [4] 6021 C0FC 2200 00FE
push [6] 6021 C0FC 2200 00FC

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

6.書後習題

技術分享圖片

內存單元地址: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。

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


五、總結與體會

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

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

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