ex1用匯編指令編碼和除錯
阿新 • • 發佈:2021-10-23
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開始的記憶體單元反彙編
實驗總結
- mov a, b中的b的16進位制要顯式給出
- 實體地址=段地址 * 16 + 偏移地址