匯編語言第一次試驗


匯編語言第一次實驗

1.實驗任務1

  使用masm,link得到8086匯編可執行程序及運行程序方法。

操作截圖:
image

2.實驗任務2

PC機主板上的ROM中有一個生產時期,在內存FFF00H ~ FFFFFH的某幾個單元中,請找到這個生產時期,並試圖修改它。

1、在debug中,使用d命令查看生產日期

操作截圖:
image

使用d命令得到生產日期為92/01/01。

2、使用e命令修改生產時期所在的內存單元,修改后,再次使用d命令查看

操作截圖

image

結論:

無法修改生產日期。

理由:

根據下圖1.9可知,C0000~FFFFF屬於ROM地址區,ROM一般指只讀存儲器,因此無法向這部分地址空間寫入信息。

image

3.實驗任務3

1.給出在debug中使用e命令修改內存單元的命令,及,效果截圖

​ 在debug中,使用e命令,向內存單元填寫數據。

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

image

2.給出在debug中使用f命令批量填充內存單元的命令,及,效果截圖

在debug中,使用f命令,向內存單元批量填寫數據。

-f b800:0f00 0f9f 03 04

image

3.嘗試修改內存單元,或,數據后的效果截圖

在debug中,改變顯存空間地址中的數據,得到屏幕上的輸出結果。

image

4.實驗任務4

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

image

在debug環境中,按順序錄入以下內容,單步跟蹤調試,觀察寄存器和內存空間00200H~00207H,以

及,棧空間00220 ~ 0022fH內容變化情況。記錄實驗結果。回答問題,驗證和你的理論分析結果是否一

致。

image

1.單步執行,在執行push指令和pop指令時,觀察並記錄棧頂偏移地址的寄存器sp值的變化情況。

image

image

image

sp通過mov sp,30指令設置為0030

每進行一次push操作:sp = sp - 2

每進行一次pop操作:sp = sp + 2

(2) push [6] 指令執行結束后, pop [6] 指令執行結束前,使用d命令 d 20:20 2f 查看此時棧空間的

數據。

image

可以看出從0020:002A后的內容為被改寫。

內容解釋:以棧中10 20為例,由於push指令將字單位20 10壓入棧中,20先進入棧,所以棧中為10 20。

image

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

image

00200~00207中內容依然是起初定義的數據,未發生變化。

(4) 如果把最后四條指令改成截圖中的順序, pop [6] 指令執行結束后,使用d命令 d 20:0 7 查看此時

數據空間內的數據是否有變化。

image

image

已經執行了:

​ pop [0]

​ pop [2]

​ pop [4]

即,將棧頂內容出棧至[0],[2],[4],起初棧頂為:70 80,因此[0]處為70 80。后面的字單位同理。

5.實驗任務5

在debug環境中,實踐以下內容。

image

1.使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?后面的指令 mov

sp, 30 是什么時候執行的?

​ Debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接着被執行。

2.根據匯編指令,前三條指令執行后,00220H ~ 0022fH被設置為棧空間。並且,初始時,已通

過f命令將初始棧空間全部填充為0。觀察單步調試時,棧空間00220H ~ 0022fH內存單元值的變化,特

別是圖示中黃色下划線表示出的數據值。根據實驗觀察,嘗試思考和分析原因。

執行結果:
image

執行至第一次push ax后結果:

image

image

執行至第二次push ax后結果:

image

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。

結果:

image

image

7.實驗任務7

下面程序的功能是,完成自身代碼的自我復制:把 mov ax, 4c00h 之前的指令復制到內存0:200開始的

連續的內存單元。

補全程序,並在debug中調試驗證,確認是否正確實現了復制要求。

image

(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

執行結果:

image

由於程序起始地址為cs,則賦讓ax為cs。

cx的值為程序返回時的偏移地址,要復制指令“mov ax,4c00h”的指令,得減去“ int 21h”(占用2個字節),“mov ax,4c00h”(占用3個字節),共五個字節。

image

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

對0:200h開始的內存單元反匯編,確認是否把task7.asm中line3-line12的代碼復制到了目標內存空間。

image


免責聲明!

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



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