一、8086匯編指令編碼和調試
2. 實驗任務2
-
1 -d FFF0:0 FF
得到結果:
查得日期:01/01/92
- 使用 e 命令修改內存中的內容,並使用 d 命令查看結果,代碼如下:
-e FFF0:00F0 01 02 03 04 05 06 07 08 09
-d FFFF:0 F得到結果:
發現沒有發生修改,FFF00H~FFFFFH 對應地址空間為 ROM地址空間,意為只讀不寫,進行寫入操作不會改變內存內容3.實驗
3.實驗任務3
- 用 e 命令,向內存單元b800:0重復寫入數據03 04,指令如下,意為
1 -e b800:0 03 04 03 04 03 04 03 04 03 04
得到結果如下,顯示在左上角:
:
-
用 f 命令,向內存單元批量填寫數據,指令如下,意為
1 -f b800:0f00 0f9f 03 04
得到結果:顯示在下方:
4. 實驗任務4
- 按順序錄入以下內容,觀察結果:
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__
-
push [6] 指令執行結束后,pop [6] 指令執行結束前,使用
d
命令查看此時棧空間的數據,指令如下:1 -d 20:20 2f
查看數據變化情況:
-
pop [0] 指令執行結束后,使用 d 命令查看此時數據空間內的數據是否有變化,指令如下:
1 -d 20:0 7
查看數據變化情況:
-
1 -d 20:0 7
查看數據變化情況:
5. 實驗任務5
先使用f命令,把 00220H ~ 0022fH 區間的 16 個字節內存單元值全部修改為 0,並使用 d 命令查看確認,然后使用 a 命令、r 命令、t 命令寫入匯編指令並單步調試。
-
使用 t 命令單步執行 mov ss, ax 時,不是單步執行完這一條指令就暫停,后面的指令 mov sp, 30 在執行 mov ss, ax 后執行。實驗結果:
分析:進行t命令的單步執行操作時發生中斷時,使用棧空間存儲CS IP,存放cpu關鍵中斷數據。
6. 實驗任務6
- 使用任何一款文本編輯器,編寫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.
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;共23個字節,轉換16進制 -> 17h。
在 debug 中調試,使用 g 命令:將程序執行到 loop s 之后、 mov ax, 4c00h 之前:
然后,使用 u 命令對 0:200h 開始的內存單元反匯編:
確認把 task7.asm 中 line3-line12 的代碼復制到了目標內存空間。