匯編語言程序設計實驗一:8086匯編指令編碼和調試


8086匯編指令編碼和調試

實驗任務2

  • 在debug中,使用D命令加上起始地址進行生產日期的查找,實驗截圖如下:

  • 然后用E命令對生產時期所在的內存單元內容進行修改,修改后再用D命令進行查看

實驗結論

最終並不能修改生產時期所在的內存單元,其值仍為最初值不變,這是由於日期所在內存單元的存儲權限為只讀,故不能進行修改。

實驗任務3

  • 在debug中,使用e命令,從b800:0開始的內存單元開始,依次寫入十六進制數據04 03,重復寫5次,實驗代碼及效果截圖如下:

  • 使用f命令,向內存單元區間b800:0f00 ~ b800:0f9f的連續160個字節依次重復填充十六進制數據03 04,實驗代碼及效果截圖如下:

  • 其他關於修改內存地址或數據的嘗試代碼及截圖如下:


實驗任務4

  • 在debug中按順序錄入代碼,內容如下圖:

  • 填空

-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 執行后,寄存器(sp) = 2e
push [2] ; 執行后,寄存器(sp) = 2c
push [4] ; 執行后,寄存器(sp) = 2a
push [6] ; 執行后,寄存器(sp) = 28
pop [6] ; 執行后,寄存器(sp) = 2a
pop [4] ; 執行后,寄存器(sp) = 2c
pop [2] ; 執行后,寄存器(sp) = 2e
pop [0] ; 執行后,寄存器(sp) = 30
  • 回答問題

    • 指令mov ss,ax和mov sp,30執行后,棧頂的邏輯地址為0020:0030H,物理地址為00230H。

    • 單步調試到匯編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 查看此
      時棧空間數據,實驗截圖如下:

    • 匯編指令 pop [0] 執行結束后,使用d命令 d 20:0 7 查看此時數據空間內的數據,發現並無變化,實驗截圖如下:

    • 把最后四條指令的順序更改,最終代碼如下圖:


      pop [6] 指令執行結束后,使用d命令 d 20:0 7查看此時數據空間內的數據,發現數據有變化,實驗截圖如下:

實驗任務5

  • 實踐內容如下圖:

  • 觀察並思考

    • 問題1:單步執行完mov ss,ax之后指令並沒有暫停,后面那條指令也是隨即立即執行了。debug的單步調試是一種中斷,但由於CPU在執行期間不響應中斷請求,所以debug顯示的是CPU執行完棧段和棧頂指針分配后的情況。

    • 問題2:08 01是偏移地址,3F 07是程序段地址,因為在單步調試,所以存在中斷,需要暫存程序現在的入口。

實驗任務6

  • 用任意一款編輯器編寫8086匯編程序源碼如下:

      assume cs:code
      code segment
       start:
          mov cx, 10
          mov dl, '0'
          s: mov ah, 2
          int 21h
          add dl, 1
          loop s
          mov ah, 4ch
          int 21h
      code ends
      end start
    
  • 對程序匯編鏈接截圖(需注意在鏈接時需通過設置將生成可執行文件指定為task5),如下圖:

  • 對task6.asm生成的可執行文件task5.exe運行及結果截圖:

  • 使用d命令,查看task5.exe的程序段前綴,觀察這256個字節的內容如下圖,並成功驗證前兩個字節是CD 20

實驗任務7

  • 補全代碼如下:
  assume cs:code
  code segment
  mov ax,  cs
  mov ds, ax
  mov ax, 0020h
  mov es, ax
  mov bx, 0
  mov cx, 17h
  s: mov al, [bx]
  mov es:[bx], al
  inc bx
  loop s
  mov ax, 4c00h
  int 21h
  code ends
  end
  • 填寫依據:首先,程序代碼段地址是cs,要將寄存器cs中的內容賦值給ax,然后再存入段地址ds;其次,先賦值給cx進行debug,r命令得到cx是21h,故cx=21h-5h=17h。

  • 補全程序后生成可執行文件task7如下圖:


    繼續在debug中調試,使用g命令將程序執行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令對0:200h開始的內存單元反匯編,確認是否把task7.asm中line3-line12的代碼復制到了目標內存空間。如下圖:

實驗總結

  • 實驗需要細心,在審題及編寫代碼及運行測試時需要踏實的一步一步操作,才能事半功倍
  • 書本知識有限,我自己掌握的也不夠牢固,以后需要多通過書籍、網絡等途徑強化鞏固知識並擴展知識面,才能做好每一次實驗
  • 這次實驗也鞏固了之前所學,對復習與鞏固有積極作用


免責聲明!

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



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