1. 程式人生 > 其它 >組合語言程式設計實驗報告1

組合語言程式設計實驗報告1

實驗結論:

實驗任務二:

1、檢視生產日期

由上圖可看出生產日期為92年1月1日。

2、修改生產日期

觀察結果可知我們並未成功修改生產日期,原因在於生產日期位於ROM儲存器,即只讀儲存器中,其資料只能被讀取而無法被修改。

實驗任務三:

1、e命令修改記憶體單元

2、f命令批量填充記憶體單元

3、修改記憶體的資料

4、修改記憶體地址

綜上,我們可以得出以下結論:

(1)b8000~b8f9f 為視訊記憶體地址空間。

(2)顯示時為字型資料,一個字元佔兩個記憶體單元,低地址記憶體單元存放字元的ASCII碼,高地址記憶體單元存放的資料對應字元的顏色。

(3)字元在顯示器上顯示的位置與偏移地址對應。

為驗證結論(3),進行測試

經測試,可以認為結論(3)正確。由此可以發現,在當前環境下,顯示記憶體地址的大小與顯示器的尺寸相匹配。

實驗任務四:

問題1:邏輯地址:0020H:0030H 實體地址:00230H

問題2:

問題3:

問題4:

實驗任務五:

問題1:單步執行完mov ss, ax後,程式並不暫停,而是緊接著執行mov sp, 30。究其原因,在mov ss, ax指令執行後,CPU不響應任何中斷,包括單步中斷,所以Debug設定好的用來顯示暫存器狀態和等待輸入命令的中斷處理程式根本沒有得到執行,所以我們看不到預期的結果。CPU接著向下執行後面的指令mov sp, 30,然後響應單步中斷,我們才看到正常的結果。

問題2:觀察結果可知,CS和IP的值被壓入棧中。查詢資料得知,t命令是單步中斷,CPU會保護現場,即順序地標誌暫存器、CS,IP入棧。

實驗任務六:

原始碼:

 1 assume cs:code
 2 code segment
 3 
 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 
12     mov ah, 4ch
13     int 21h
14 
15 code ends
16 end start

編譯、連線、執行:

檢視程式段字首PSP:

實驗任務七:

完整原始碼:

 1 assume cs:code
 2 code segment
 3 
 4 start:
 5     mov ax, cs
 6     mov ds, ax
 7     mov ax, 0020h
 8     mov es, ax
 9     mov bx, 0
10     mov cx, 0017h
11 s:  mov al, [bx]
12     mov es:[bx], al
13     inc bx
14     loop s
15 
16     mov ax, 4c00h
17     int 21h
18 
19 code ends
20 end start

填寫過程:已知程式的功能是自身程式碼的自我複製,結合已有程式碼可知,暫存器ds中應儲存源始單元的地址,即程式的第一條指令的地址,亦即cx暫存器中的資料,所以第一空填cx。第二空需要填寫迴圈次數,由於程式功能為複製mov ax, 4cooh之前的指令,故迴圈次數應與相應的程式碼長度一致。此時有兩種方法,第一種是直接人工計算程式碼長度,第二種是先任意填一迴圈次數,隨後除錯時記錄程式碼總長度(cx暫存器中的內容),由此計算出正確的迴圈次數並重新填寫。第一種方法涉及的組合語言指令長度相關知識可見於總結,在此我選擇第二種方法:先令迴圈長度為0020H,除錯發現程式碼長度為001C,減去mov ax, 4cooh和int 21h兩條指令的長度共5個位元組,得出正確的迴圈次數為23次,即0017H,將其填回第二空,原始碼正式補充完整。

補充完原始碼後除錯:

實驗總結:

1、存於ROM中的資料只能被讀取而無法被使用。

2、當前環境下:

(1)b8000~b8f9f 為視訊記憶體地址空間。

(2)顯示時為字型資料,一個字元佔兩個記憶體單元,低地址記憶體單元存放字元的ASCII碼,高地址記憶體單元存放的資料對應字元的顏色。

(3)字元在顯示器上顯示的位置與偏移地址對應。

3、Debug的t命令在執行修改暫存器ss的指令時,下一條指令也緊跟著被執行。

4、組合語言指令長度參考:http://t.zoukankan.com/Java-Starter-p-10981728.html

5、真實模式:執行真實的指令;發往記憶體的地址是真實地址;真實模式下的暫存器都是16位的。

保護模式:相比於真實模式,將所有通用暫存器擴充套件到32位;通過對映表、特權級等方式實現了不同任務之間和同一任務內的保護。

長模式:基本與保護模式相同。

參考文章:https://blog.csdn.net/qq_48322523/article/details/119935422?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.highlightwordscore&spm=1001.2101.3001.4242.1