1. 程式人生 > 實用技巧 >assembly language 實驗2 彙編源程式編寫與彙編、除錯

assembly language 實驗2 彙編源程式編寫與彙編、除錯


實驗內容

實驗任務1
使用任意一款文字編輯器,編寫8086彙編源程式ex1.asm。原始碼如下:

;ex1.asm
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov byte ptr ds:[0], 1
mov byte ptr ds:[1], 1
mov byte ptr ds:[2], 2
mov byte ptr ds:[3], 2
mov byte ptr ds:[4], 3
mov byte ptr ds:[5], 3
mov byte ptr ds:[6], 4
mov byte ptr ds:[7], 4
mov ah, 4ch
int 21h
code ends
end

要求:使用8086彙編程式編寫、彙編、連結、執行、除錯方法,對ex1.asm進行彙編、連結、執行,使
用debug工具除錯可執行檔案。
實驗步驟

編寫ex1.asm
編譯ex1.asm
連線
檢視psp
反彙編
g命令執行
p命令執行
ex1執行結果
如上圖所示ex1.exe的執行結果是螢幕上出現三個字元。如果在debu中使用g命令除錯,則可能看不到螢幕上出現的變換。這是因為螢幕滾動重新整理顯示的原因,當輸入g命令之後,螢幕向下滾動三行,正好將顯示的字元重新整理掉,所以無法看到。

實驗任務2
使用任意一款文字編輯器,編寫8086彙編源程式ex2.asm。原始碼如下:

ex2.asm
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov bx, 0
mov ax, 101H
mov cx, 4
s: mov [bx], ax
add bx, 2
add ax, 101H
loop s
mov ah, 4ch
int 21h
code ends
end

要求:

  • 使用8086彙編程式編寫、彙編、連結、執行、除錯方法,對ex2.asm進行彙編、連結、執行,使用debug工具除錯可執行檔案
    • 實驗步驟

      ex2.asm
      ex2編譯
      ex2連線
      反彙編
      g命令除錯
      p命令除錯
      最後兩步除錯
      ex2執行結果
      修改後的ex2
      修改後ex2執行結果
      對比ex1和未修改的ex2的執行結果,二者的結果一致,說明這兩個程式通過不使用和使用loop實現了相同的結果。修改後的ex2只是顯示的字元多了一些。 在程式碼書寫上,ex1.asm採用順序結構,ex2.asm採用迴圈結構。

      實驗任務3
      綜合使用loop,[bx],編寫完整彙編程式,實現向記憶體b800:07b8開始的連續16個字單元重複填充字資料
      0237H。
      要求:

      • 編寫彙編源程式
      • 給出執行結果截圖

      執行步驟

      ex3.asm
      ex3執行結果
      把填充的字資料改成0239H
      把填充的字資料改成0437H
      根據實驗結果,猜測字資料的高位儲存的是字元的顏色,低位儲存的是字元的ASCII碼。

      實驗任務4

      • 編寫完整彙編源程式,實現向記憶體0:200~0:23F依次傳送資料0~63(3FH)。
      • 綜合使用[bx]和loop,編寫彙編源程式
      • 靈活使用debug的t命令、g命令、p命令除錯。在程式退出前,用d命令檢視
      • 0:200~0:23F,確認是否將0~3F傳送至此段記憶體區域。
      ex4.asm
      ex4執行結果

      實驗任務5
      該程式的功能是將 "mov ax, 4c00h" 之前的指令複製到 0:200 處,待補全程式碼如下:

      assume cs:code
      code segment
           mov ax, _____
           mov ds, ax
       
           mov ax, 0020h
           mov es, ax
           mov bx, 0
           mov cx, _____
      s:   mov al, [bx]
           mov es:[bx], al
           inc bx
           loop s
       
           mov ax, 4c00h
           int 21h
       code ends
       end
      

      填空內容為:

      • mov ax,cs
      • mov cx,17h
      根據cx的值減去最後兩行程式碼所佔用的5個位元組,能夠得到賦給cx的值,即直到“mov ax,4ch”之前的指令的長度。