天天看點

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

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

  一、實驗目的

    1. 熟練掌握使用debug工具編寫和調試x86彙編指令的方法
    2. 掌握8086CPU、寄存器、記憶體的基礎知識
    3. 了解并掌握記憶體中多位元組資料的存放:小端法
    4. 了解并掌握「棧」記憶體空間的特性和使用
    5. 掌握指令mov, add, sub, jmp, push, pop的基礎用法

  二、實驗内容

1. 教材實驗1(P35)

練習教材P35-45「預備知識:Debug的使用」,學習debug啟動、退出及常用指令用法;  在練習基礎上,完成「2. 實驗任務」

2. 教材實驗2(P71)

練習「1.預備知識:Debug 的使用」在練習基礎上,完成「2. 實驗任務」

為了便于驗證明驗結果,對「2. 實驗任務」的(1)做如下兩點調整:

① 在使用 a 指令輸入指令調試之前,先使用 e 指令将記憶體單元 0022:0 ~0022:7連續 8 個位元組資料修改為 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H

② 将 P74 實驗任務(1)中第1行的 mov ax, ffff → 改為 mov ax, 0022

實驗前,請先從理論上分析指令執行後各個填空處的值,并記錄下來。

實驗時,通過在debug中調試,觀察實驗結果與理論分析是否一緻;如果存在不一緻的情形,嘗試  發現問題所在,并分析原因。

  四、實驗結論

     1. 教材實驗1結論

實驗任務(1)

将下面程式段寫入内

機器碼    彙編指令

b8 20 4e   mov ax,4E20H

05 16 14   add ax,1416H

bb 00 20      mov bx,2000H

01 d8      add ax,bx     

      •   用e指令将程式寫入記憶體,寫完之後可以使用u指令檢視彙編指令是否正确
實驗1 用機器指令和彙編指令程式設計

       d指令檢視記憶體

      

實驗1 用機器指令和彙編指令程式設計
      •  用a指令将程式寫入記憶體,可以直接以彙編語言的形式寫入記憶體,可操作性強

       

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

        用t指令進行單步調試,此時需要時CS:IP指向存儲程式的記憶體起始位址

       

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

         

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

       實驗任務(2)

用a指令寫入,并修改CS:IP指向2000:0

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

       

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

       

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

       成功計算出2^8=256(0100H),主要是通過jmp實作循環進行累加。

實驗任務(3)

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

       生産日期為1992.01.01,接下來進行修改操作

       

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

       進行修改操作,但是并沒有修改成功,因為C0000~FFFFF是隻讀存儲器(ROM)的位址,是以對其進行寫入資料的操作是無效的。 

實驗任務(4)

向記憶體B8100H開始的單元中填寫資料

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

       

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

       

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

       當修改資料的位址不變,裡面的資料變化時,圖案的形狀和顔色會有變化,圖案的位置不變,當隻改變位址,不改變裡面的資料時,

      圖案的位置會發生辯護,形狀和顔色不變。

      A0000~BFFFF為顯存位址空間,向該部分中寫入的資料,會被顯示卡輸出到顯示器上。

2. 教材實驗2結論

實驗任務(1)

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

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

② 截圖記錄:使用 a 指令輸入的 p74 指令

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

③ 截圖記錄:每一行指令單步調試(如單步調試步驟多,可分屏截圖,但不要有遺漏)

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

       

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

       

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

       

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

④ P74 中指令執行後各個寄存器填空結果,以在文檔中手工标注或手機拍照截圖方式複制在文檔中。    對于③單步調試的觀察,與理論上分析的結果進行比較,檢驗是否一緻。如不一緻,分析原因。

mov ax,[0]    ax=5150

add ax,[2]    ax=A4A2

mov bx,[4]    bx=5554

add bx,[6]    bx=ACAA

push ax     sp=00FE;  修改的記憶體單元的位址是 2200:00FE,  内容為 A4A2

push bx     sp=00FC;  修改的記憶體單元的位址是 2200:00FC,  内容為 ACAA

pop ax      sp=00FE;  ax=ACAA

pop bx      sp=0100;   bx=A4A2

push [4]       sp=00FE;  修改的記憶體單元的位址是 2200:00FE,  内容為 5554

push [6]       sp=00FC;  修改的記憶體單元的位址是 2200:00FC,  内容為 5756

經分析理論與實驗結論一緻

實驗任務(2)

① 截圖記錄圖 3.19 中使用 a指令輸入的 7 行指令,使用 e 指令修改 2000:0~2000:f 的值, 及修改後檢視的部分

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

② 單步調試每一行彙編指令的截圖。每一條指令單步調試後,都使用 d 指令檢視2000:0~2000:f 的值。觀察每一條指令執行後相關寄存器值的變化,及 2000:0~2000:f 單元值的變化,并思考原因。

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

       

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

       

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

以文字方式陳述:

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

mov ax,2000    将2000H傳入ax寄存器

mov ss,ax      将2000H通過ax寄存器傳入ss寄存器

mov sp,10     初試化棧頂,将棧頂偏移位址設定為0010H

初始時棧頂是 2000:0010H

   棧底是2000:000EH

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

Debug的T指令在執行修改寄存器SS的指令時,下一條指令也緊接着被執行。

       在2000:0開始的位址中,中間過程存儲了cs,ip,ax的值。

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