實驗1 8086匯編指令編碼和測試


匯編語言實驗

一、8086匯編指令編碼和調試

2. 實驗任務2 

  1. 使用 d 命令在 debug 模式下查看內存內容,代碼如下:
    1 -d FFF0:0 FF

    得到結果:

     查得日期:01/01/92

  2. 使用 e 命令修改內存中的內容,並使用 d 命令查看結果,代碼如下:
    -e FFF0:00F0 01 02 03 04 05 06 07 08 09 
    -d FFFF:0 F

    得到結果:

     發現沒有發生修改,FFF00H~FFFFFH 對應地址空間為 ROM地址空間,意為只讀不寫,進行寫入操作不會改變內存內容3.實驗

3.實驗任務3

  1. 用 e 命令,向內存單元b800:0重復寫入數據03 04,指令如下,意為從 b8000:0 開始的內存單元開始,依次寫入十六進制數據 04 03,重復寫 5 次
    1 -e b800:0 03 04 03 04 03 04 03 04 03 04

     得到結果如下,顯示在左上角:

  2.  

    用 f 命令,向內存單元批量填寫數據,指令如下,意為把內存單元區間b800:0f00~b800:0f9f連續 160 個字節依次重復填充十六進制數據03 04:

    1 -f b800:0f00 0f9f 03 04

    得到結果:顯示在下方:

     

4. 實驗任務4

已知內存單元 00201H ~ 00207H 分別存放數據(如下圖所示),00220H ~ 0022fH 用作棧空間。

  1. 按順序錄入以下內容,觀察結果:
     1 -a
     2 mov ax, 20
     3 mov ds, ax
     4 mov ss, ax
     5 mov sp, 30
     6 push [0] ; 執行后,寄存器(sp) = _002E___
     7 push [2] ; 執行后,寄存器(sp) = _002C__
     8 push [4] ; 執行后,寄存器(sp) = _002A__
     9 push [6] ; 執行后,寄存器(sp) = _0028__
    10 pop [6] ; 執行后,寄存器(sp) = _002A___
    11 pop [4] ; 執行后,寄存器(sp) = __002C__
    12 pop [2] ; 執行后,寄存器(sp) = __002E__
    13 pop [0] ; 執行后,寄存器(sp) = __0030__

     

  2. push [6] 指令執行結束后,pop [6] 指令執行結束前,使用 d 命令查看此時棧空間的數據,指令如下:

    1 -d 20:20 2f

    查看數據變化情況:

     

  3. pop [0] 指令執行結束后,使用 d 命令查看此時數據空間內的數據是否有變化,指令如下:

    1 -d 20:0 7

    查看數據變化情況:

     

  4.  把最后四條指令改成截圖中的順序, pop [6] 指令執行結束后,使用d命令查看此時數據空間內的數據是否有變化,指令如下:

    1 -d 20:0 7

    查看數據變化情況:

     

5. 實驗任務5

先使用f命令,把 00220H ~ 0022fH 區間的 16 個字節內存單元值全部修改為 0,並使用 d 命令查看確認,然后使用 a 命令、r 命令、t 命令寫入匯編指令並單步調試。

  1. 使用 t 命令單步執行 mov ss, ax 時,不是單步執行完這一條指令就暫停,后面的指令 mov sp, 30 在執行 mov ss, ax 后執行。實驗結果:

     

  2. 根據匯編指令,前三條指令執行后,00220H~0022FH 被設置為棧空間,並且初始時已通過 f 命令將初始棧空間全部填充為 0。觀察單步調試時,棧空間 00220H~0022FH內存單元值的變化,特別是圖示中黃色下划線表示出的數據值,得到結果如下:

     分析:進行t命令的單步執行操作時發生中斷時,使用棧空間存儲CS IP,存放cpu關鍵中斷數據。

6. 實驗任務6

  1. 使用任何一款文本編輯器,編寫8086匯編程序源碼。

 

 1 ; task6.asm
 2 assume cs:code
 3 code segment
 4 start:
 5     mov cx, 10
 6     mov dl, '0'
 7 s:  mov ah, 2
 8     int 21h
 9     add dl, 1
10     loop s
11     mov ah, 4ch
12     int 21h
13 code ends
14 end start

使用 masm、link,匯編、鏈接,得到可執行文件 task6.exe,運行程序,得到結果:

 

得到結果0123456789,表示從0到9輸出(dl循環10次+1操作)。

 

 2. 

使用 debug 工具,調試 task6.exe。根據第 4 章所學知識,任何可執行程序在執行時,都有一個引導程序負責將其加載到內存,並將CPU控制權移交給它,也即將 CS IP 指向可執行程序中第一條機器指令。在加載可執行程序時,可執行前面 512 字節是程序段前綴PSP(Program Segment Prefix),用於記錄程序一些相關信息。 在debug中,使用 d 命令,查看 task6.exe 的程序段前綴,觀察這 256 個字節的內容,證實實驗結果:兩個字節為 CD 20,實驗過程如圖:

 

7. 實驗任務7

完成自身代碼的自我復制,把 mov ax, 4c00h之前的指令復制到內存 0:200 開始的連續的內存單元,代碼如下:

 1 assume cs:code
 2 code segment
 3     mov ax, _cs_
 4     mov ds, ax
 5     mov ax, 0020h
 6     mov es, ax
 7     mov bx, 0
 8     mov cx, _17h_
 9 s:  mov al, [bx]
10     mov es:[bx], al
11     inc bx
12     loop s
13     mov ax, 4c00h
14     int 21h
15 code ends
16 end

分析:代碼段寄存器cs:存放程序的段地址,用寄存器ax將代碼段寄存器cs的值賦給數據端寄存器ds;代碼到mov ax, 4c00h的長度共23個字節,轉換16進制 -> 17h。

在 debug 中調試,使用 g 命令:將程序執行到 loop s 之后、 mov ax, 4c00h 之前:

 

 然后,使用 u 命令對 0:200h 開始的內存單元反匯編:

 

確認把 task7.asm 中 line3-line12 的代碼復制到了目標內存空間。


免責聲明!

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



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