1. 程式人生 > 其它 >ex1用匯編指令編碼和除錯

ex1用匯編指令編碼和除錯

debug命令

D(顯示記憶體單元內容)

D 段地址:起始偏移地址 [結尾偏移地址] [L範圍]
D 0200:5 L 11 用 L 選擇範圍。檢視 0200H 段的 5 號單元到 15H 號單元共 17 個單元

E(修改記憶體單元內容)

-e b800:0 03 04 03 04 03 04 03 04 03 04

F(填充指定記憶體塊)

-f b800:0f00 0f9f 03 04

G(從起始地址開始執行到斷點地址)

G [=起始地址] [斷點地址]

實驗

實驗1

實驗2

使用d命令,修改後再用d命令

結論

不能修改,因為是ROM

實驗3

在debug中使用e命令修改記憶體單元的命令

在debug中使用f命令批量填充記憶體單元的命令

嘗試修改記憶體單元、資料後進行試驗

實驗4

-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 執行後,暫存器(sp) = 002E
push [2] ; 執行後,暫存器(sp) = 002C
push [4] ; 執行後,暫存器(sp) = 002A
push [6] ; 執行後,暫存器(sp) = 0028
pop [6] ; 執行後,暫存器(sp) = 002A
pop [4] ; 執行後,暫存器(sp) = 002C
pop [2] ; 執行後,暫存器(sp) = 002E
pop [0] ; 執行後,暫存器(sp) = 0039

q1 題目要求是把00220H ~ 0022fH用作棧空間。指令 mov ss, ax
mov sp, 30 執行後,

棧頂的邏輯地址和實體地址分別是?

棧頂的邏輯地址
0020H:0030H
棧頂的實體地址
0020H * 16 + 0030H = 00230H

q2 單步除錯到彙編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 檢視此時棧空間資料。

q3 彙編指令pop [0]執行結束後, pop [0] 指令執行結束後,使用d命令 d 20:0 7 檢視此時資料空間內的資料是否有變化。

q4 如果把最後四條指令改成截圖中的順序, pop [6] 指令執行結束後,使用d命令 d 20:0 7檢視此時資料空間內的資料是否有變化。

實驗5

q1 使用t命令單步執行 mov ss, ax
時,是單步執行完這一條指令就暫停了嗎?後面的指令 mov sp, 30 是什麼時候執行的?

mov ss,ax和mov sp,30 連續執行

q2 根據彙編指令,前三條指令執行後,00220H ~ 0022fH被設定為棧空間。並且,初始時,已通過f命令將初始棧空間全部填充為0。觀察單步除錯時,棧空間00220H ~ 0022fH記憶體單元值的變化,特別是圖示中黃色下劃線表示出的資料值。根據實驗觀察,嘗試思考和分析原因。

因為中斷,記錄的是程式段和程式碼段的入口地址

實驗6

assume cscode

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

masm,link,執行


給出在debug中檢視task5.exe的程式段字首PSP的截圖

實驗7

assume cs:code
code segment
	mov ax, cs	;程式碼段的起始位置是cs
	mov ds, ax
	mov ax, 0020h
	mov es, ax
	mov bx, 0
	mov cx, 17h	;line3~12位元組數
s: 	mov al, [bx]
	mov es:[bx], al
	inc bx
	loop s
	mov ax, 4c00h
	int 21h
code ends
end

使用g命令將程式執行到 loop s 之後、 mov ax, 4c00h之前

使用u命令對0:200開始的記憶體單元反彙編

實驗總結

  1. mov a, b中的b的16進位制要顯式給出
  2. 實體地址=段地址 * 16 + 偏移地址