
可以看到生產日期存儲在內存單元FFF0:00F0到00FF之間,使用-e命令嘗試對其進行修改后發現該內存單元的值並沒有改變。因為該部分內存是受到保護的,為了安全並不支持程序員對其進行修改。

內存區域b800:0~b800:0FFF是顯存區域,修改此處的值可以直接在窗口中看到輸出。
值得注意的是上述例子中03表示16進制下字符ASCII碼的值,04表示顏色參數。分別對其進行修改可以看到不同的結果輸出。例如:

1 -a 2 mov ax, 20 3 mov ds, ax 4 mov ss, ax 5 mov sp, 30 6 push [0] ; 執行后,寄存器(sp) = 002E 7 push [2] ; 執行后,寄存器(sp) = 002C 8 push [4] ; 執行后,寄存器(sp) = 002A 9 push [6] ; 執行后,寄存器(sp) = 0028 10 pop [6] ; 執行后,寄存器(sp) = 002A 11 pop [4] ; 執行后,寄存器(sp) = 002C 12 pop [2] ; 執行后,寄存器(sp) = 002E 13 pop [0] ; 執行后,寄存器(sp) = 0030





對寄存器ss賦值之后cpu不會相應中斷,會直接跳到下一步執行,故指令 mov ss, ax 單步執行完成后,后一條指令 mov sp, 30 會馬上執行。
1 assume cs:code 2 3 code segment 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 code ends 15 end start
執行結果如下:
程序功能為依次輸出 0~9 共10個字符。
使用debug工具,調試task6.exe。根據第4章所學知識,任何可執行程序在執行時,都有一個引導程序負責將其加載到內存,並將CPU控制權移交給它,也即將CS:IP指向可執行程序中第一條機器指令。在加載可執行程序時,可執行前面512字節是程序段前綴PSP(Program Segment Prefix),用於記錄程序一些相關信息。

1 assume cs:code 2 3 code segment 4 mov ax, __ 5 mov ds, ax 6 mov ax, 0020h 7 mov es, ax 8 mov bx, 0 9 mov cx, __ 10 s: mov al, [bx] 11 mov es:[bx], al 12 inc bx 13 loop s 14 15 mov ax, 4c00h 16 int 21h 17 code ends 18 end
(1) 補全程序。說明這樣填寫的依據。
因為要復制程序指令,將程序段初始地址賦值給數據段,故第一個空填cs。
第二個空隨便填寫一個數據,debug時反匯編程序,如下圖:
注意到方框中的字節數為23,表示所復制部分指令的字節數。轉換為16進制為0017H,故第二空填0017H。
補全程序如下:
1 assume cs:code 2 3 code segment 4 mov ax, cs 5 mov ds, ax 6 mov ax, 0020h 7 mov es, ax 8 mov bx, 0 9 mov cx, 0017h 10 s: mov al, [bx] 11 mov es:[bx], al 12 inc bx 13 loop s 14 15 mov ax, 4c00h 16 int 21h 17 code ends 18 end


可以看到代碼已經復制到了目標內存空間。
五、實驗總結
匯編語言編寫程序是直接對內存進行操作,可以節省很多存儲空間和運行時間。但是程序編寫時的邏輯相對復雜,以及匯編語言默認的16進制數字並不符合我們常用數字的習慣,這使得匯編語言的學習中需要考慮的面更加多了。匯編程序的編寫也需要投入更大量的經歷。