1. 程式人生 > 實用技巧 >實驗1 用機器指令和彙編指令程式設計

實驗1 用機器指令和彙編指令程式設計

1. 教材實驗1

  • 實驗任務(1)

使用Debug,將下面的程式段寫入記憶體,逐條執行,觀察每條指令執行後CPU中相關寄存中內容的變化。

方法一

使用E命令將機器碼寫入記憶體,指定記憶體地址從10000H開始。

可以使用D命令,檢視記憶體中的機器碼是否改寫正確。

再使用U命令,進行反彙編,將記憶體中的機器碼翻譯成彙編指令並顯示出來。

最後使用T命令進行單步追蹤,注意此時的CS:IP是否與想要執行的彙編指令的起始地址一致。如不一致,可以使用R命令修改CS、IP的值,也可以使用T=CS:IP命令直接指定想要開始執行的地址。

  ①R命令修改CS、IP值

  ②T命令直接指定CS:IP

方法二

使用A命令,將彙編指令寫入指定記憶體中。

使用T命令逐條執行,同樣要注意CS:IP的指向。相關暫存器中內容的變化如下圖所示。

  • 實驗任務(2)

將下面3條指令寫入記憶體從2000:0開始的記憶體單元中,利用這3條指令計算2的8次方。

由於單步除錯較多,只截除錯開始,和調試出正確結果的部分。

28=256 轉化為十六進位制:0100H,對應AX=0100。

  • 實驗任務(3)

檢視記憶體中的內容。PC機主機板上的ROM中寫有一個生產日期,在記憶體 FFF00H~FFFFFH 的某幾個單元中,請找到這個生產日期並試圖改變它。

經觀察得到生產日期寫在從 FFFF0H 開始的16個記憶體單元中,日期為92年1月1日,然後嘗試改寫它,發現記憶體單元中的內容沒有發生改變。

說明:8086PC機記憶體地址空間分配如圖所示,我們向地址C0000~FFFFF 的記憶體單元中寫入資料的操作是無效的,因為這等同於改寫只讀儲存器中的內容。

  • 實驗任務(4)

向記憶體從 B8100H 開始的單元中填寫資料,如:

-e B810:0000 01 01 02 02 03 03 04 04

先填寫不同的資料,觀察產生的現象:再改變填寫的地址,觀察產生的現象。

改變資料:

改變地址:

說明:向地址 A0000~BFFFF 的記憶體單元中寫資料,就是向視訊記憶體中寫入資料,這些資料會被顯示卡輸出到顯示器上。改變寫入的資料可以改變顯示的內容,改變寫入的地址可以改變顯示的位置。


2. 教材實驗2

  • 實驗任務(1)

使用Debug,將下面的程式段寫入記憶體中,逐條執行,根據指令執行後的實際情況填空。

mov ax,0022
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100

mov ax,[0]        ;ax=5150
add ax,[2]        ;ax=A4A2
mov bx,[4]        ;bx=5554
add bx,[6]        ;bx=ACAA

push ax           ;sp=00FE ;修改的記憶體單元的地址是0022:00FE 內容為A4A2
push bx           ;sp=00FC ;修改的記憶體單元的地址是0022:00FC 內容為ACAA
pop ax            ;sp=00FE ;ax=ACAA
pop bx            ;sp=0100 ;bx=A4A2

push [4]          ;sp=00FE ;修改的記憶體單元的地址是0022:00FE 內容為5554
push [6]          ;sp=00FC ;修改的記憶體單元的地址是0022:00FC 內容為5756

①使用 e 命令修改 記憶體單元0022:0~0022:f 中的資料,及修改後檢視是否正確 寫入的操作。

②使用 a 命令輸入的彙編指令。

③每一行指令單步除錯。

經對比,除錯結果與計算結果一致。

  • 實驗任務(2)

仔細觀察圖中的實驗過程,然後分析:為什麼 2000:0~2000:f中的內容會發生改變?

①使用 a命令輸入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值, 修改後檢視記憶體。

②單步除錯每一行彙編指令,每一條指令單步除錯後,都使用 d 命令檢視 2000:0~2000:f 的值。觀察每一條指令執行後相關暫存器值的變化,及 2000:0~2000:f 單元值的變化。

執行完 mov ss,ax 和 mov sp,10 後,2000:0~2000:f 的值開始發生變化。

① 前3行彙編指令的功能,特別是,mov sp, 10意味著什麼?初始時棧頂和棧底分別是?

前2行指令是在設定棧的段地址,SS=2000H,不能直接向段暫存器SS中送入資料,所以用AX中轉。mov sp,10 是在設定棧頂的偏移地址,SP=0010H。初始時棧頂是 SS:SP ⇨ 2000:0010,棧空時棧底是 SS:SP-2⇨ 2000:000E。

② 基於單步除錯觀察到的變化,給出你對此的思考及可能原因分析。

棧可以在執行指令時進行相關暫存器資料的暫存,棧中暫存的資料有CS:IP,AX等,01A3可能是其他暫存器的資料。


實驗總結

  • 熟悉了debug的常用命令。

  • 對8086CPU提供的棧機制有了更深刻的理解,通過除錯,知道執行每一行指令時,相關暫存器的值是如何變化的。能夠進行手工計算,並自行編寫指令通過debug除錯工具進行驗證。

入棧操作(push):
①棧頂上移兩個單元,即 SP <—— SP-2
②存入資料

出棧操作(pop):
①取出字資料
②棧頂下移兩個單元,即 SP <——SP+2

說明:棧為空的時候,棧頂指向棧底+2

  • 熟悉 mov、add、sub等彙編指令以及相關暫存器。