匯編語言第一次實驗
1.實驗任務1
使用masm,link得到8086匯編可執行程序及運行程序方法。
操作截圖:
2.實驗任務2
PC機主板上的ROM中有一個生產時期,在內存FFF00H ~ FFFFFH的某幾個單元中,請找到這個生產時期,並試圖修改它。
1、在debug中,使用d命令查看生產日期
操作截圖:
使用d命令得到生產日期為92/01/01。
2、使用e命令修改生產時期所在的內存單元,修改后,再次使用d命令查看
操作截圖:
結論:
無法修改生產日期。
理由:
根據下圖1.9可知,C0000~FFFFF屬於ROM地址區,ROM一般指只讀存儲器,因此無法向這部分地址空間寫入信息。
3.實驗任務3
1.給出在debug中使用e命令修改內存單元的命令,及,效果截圖
在debug中,使用e命令,向內存單元填寫數據。
-e b800:0 03 04 03 04 03 04 03 04 03 04
2.給出在debug中使用f命令批量填充內存單元的命令,及,效果截圖
在debug中,使用f命令,向內存單元批量填寫數據。
-f b800:0f00 0f9f 03 04
3.嘗試修改內存單元,或,數據后的效果截圖
在debug中,改變顯存空間地址中的數據,得到屏幕上的輸出結果。
4.實驗任務4
已知內存單元00201H ~ 00207H分別存放數據(如下圖所示),00220H ~ 0022fH用作棧空間。
在debug環境中,按順序錄入以下內容,單步跟蹤調試,觀察寄存器和內存空間00200H~00207H,以
及,棧空間00220 ~ 0022fH內容變化情況。記錄實驗結果。回答問題,驗證和你的理論分析結果是否一
致。
1.單步執行,在執行push指令和pop指令時,觀察並記錄棧頂偏移地址的寄存器sp值的變化情況。
sp通過mov sp,30指令設置為0030
每進行一次push操作:sp = sp - 2
每進行一次pop操作:sp = sp + 2
(2) push [6] 指令執行結束后, pop [6] 指令執行結束前,使用d命令 d 20:20 2f 查看此時棧空間的
數據。
可以看出從0020:002A后的內容為被改寫。
內容解釋:以棧中10 20為例,由於push指令將字單位20 10壓入棧中,20先進入棧,所以棧中為10 20。
(3) pop [0] 指令執行結束后,使用d命令 d 20:0 7 查看此時數據空間內的數據是否有變化。
00200~00207中內容依然是起初定義的數據,未發生變化。
(4) 如果把最后四條指令改成截圖中的順序, pop [6] 指令執行結束后,使用d命令 d 20:0 7 查看此時
數據空間內的數據是否有變化。
已經執行了:
pop [0]
pop [2]
pop [4]
即,將棧頂內容出棧至[0],[2],[4],起初棧頂為:70 80,因此[0]處為70 80。后面的字單位同理。
5.實驗任務5
在debug環境中,實踐以下內容。
1.使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?后面的指令 mov
sp, 30 是什么時候執行的?
Debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接着被執行。
2.根據匯編指令,前三條指令執行后,00220H ~ 0022fH被設置為棧空間。並且,初始時,已通
過f命令將初始棧空間全部填充為0。觀察單步調試時,棧空間00220H ~ 0022fH內存單元值的變化,特
別是圖示中黃色下划線表示出的數據值。根據實驗觀察,嘗試思考和分析原因。
執行結果:
執行至第一次push ax后結果:
執行至第二次push ax后結果:
0020:0020~0020:0030 此處空間可能為ax的空間,棧底入棧時,將ax里的內容向前推。
6.實驗任務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
在debug中,使用d命令,查看task5.exe的程序段前綴,觀察這256個字節的內容,驗證前兩個字節是
否是CD 20。
結果:
7.實驗任務7
下面程序的功能是,完成自身代碼的自我復制:把 mov ax, 4c00h 之前的指令復制到內存0:200開始的
連續的內存單元。
補全程序,並在debug中調試驗證,確認是否正確實現了復制要求。
(1) 補全程序。說明這樣填寫的依據。
assume cs:code
code segment
mov ax, cs
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
sub cx, 5
s: mov al, [bx]
mov es:[bx], al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
執行結果:
由於程序起始地址為cs,則賦讓ax為cs。
cx的值為程序返回時的偏移地址,要復制指令“mov ax,4c00h”的指令,得減去“ int 21h”(占用2個字節),“mov ax,4c00h”(占用3個字節),共五個字節。
(2) 在debug中調試,使用g命令將程序執行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令
對0:200h開始的內存單元反匯編,確認是否把task7.asm中line3-line12的代碼復制到了目標內存空間。