預備知識:
一個匯編語言程序從寫出到執行的簡要過程:
一:編寫匯編源程序;
二:對源程序進行編譯連接;可執行文件包含兩部分內容:1.程序(指令機械碼)和數據(程序定義的數據)、2.相關信息描述
三:執行可執行文件中的程序
課本P94:
(1) 將下面的程序保存為t1.asm文件,將其生成可執行文件t1.exe。
assume cs:codesg
codesg segment
mov ax,2000H
mov ss,ax
mov sp,0
add sp,10
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax, 4c00h
int 21H
codesg ends
end
(2) 用DEBUG跟蹤t1.exe的執行過程,寫出第一步執行后,相關寄存器的內容和棧頂內容。
前四條指令只用了三次t命令,初始化棧地址為:SS:SP=2000:10;
使用棧操作命令先是把棧中數據段(2000:0~E)的內容放置到ax(01A3),bx(0000)中再使用Push命令堆回去,使得棧中偏移地址為0~ E數據內容顛倒,再使用Pop命令導出到ax,bx中可見,ax=0000H,bx=01A3H。
(3)PSP的頭兩個字節是CD 20,用DEBUG加載t1.exe,查看PSP的內容。
PSP和物理地址連續,然而,卻有不同的地址!
實驗內容;
1. 練習 1
第 1 步,編寫匯編源程序 t1.asm, 源程序代碼如圖 1-1 所示。
圖 1-1 匯編源程序 t1.asm 源代碼
第 2 步,對源程序 t1.asm 進行匯編、連接、運行、調試
(1) 運行程序,觀察程序輸出結果是什么?
在masm集成環境中寫入代碼:
運行結果:
Dos窗口左上方出現36數字,疑似與dl數據段有關。
(2) 將 line4 和 line9 種寄存器 dl 的值分別修改為 0~9 中任何一個數字,重新匯編→ 連接→運行,觀察結果的變化。
分別進行修改成5和9,得執行結果如圖:
這次dos窗口左上方出現了數字59,由兩次執行結果易知5對應第一次int 21H之前得dl數據5,9對應第二次int 21H 之前得dl數據內容9。
(3) 用 debug 對生成的可執行文件 t1.exe 進行調試。
① 使用 r 命令查看。觀察寄存器 cx 的值是 多少;觀察寄存器 ds 和 cs 的值是多少,它們之間是否滿足關系(cs)=(ds)+10H?
由圖可知:CX =0016H,CS=076AH,ds=075AH,滿足(cs)=(ds)+10H;
② PSP(程序段前綴)的頭兩個字節是 CD 20, 用debug 查看 PSP 的內容,驗證是否如此。
如圖:
③ 使用 u 命令對 t1.exe 進行反匯編,觀察反匯編得到的源代碼。
④ 使用 t 命令和 p 命令(遇到 int 命令時,用 p 命令)單步調試,觀察結果。
單步調試如圖:
觀察到每遇到一次int 21H, 在執行命令P下方即出現dl所對應得數值。
2. 練習 2
第 1 步,編寫匯編源程序 t2.asm,源程序代碼如圖 1-2 所示。
注*:
圖 1-2 匯編源程序 t2.asm 源代碼
line6-7 相當於 mov [0],0433h line9-10 相當於 mov [2], 0436h
至於為什么這樣使用兩條指令,而不直接簡化寫成上面的形式,有兩個原因。其中一個是方便以后循環;另一個原因,留待第 5 章再解釋說明。暫時,先這樣使用。
第 2 步,對源程序 t2.asm 進行匯編、連接、運行、調試
(1) 對 t2.asm 進行匯編、連接后,得到可執行文件 t2.exe。運行 t2.exe,觀察程序運行結果,驗證是否在屏幕左上方出現紅色的數值 36。
注*)經測試,有些平台在 dosbox 下運行這個程序時有些問題,如果屏幕左上方沒有輸出結果,請運行程序 t2.exe 前,先輸入 cls 命令清空一下屏幕,然后再執行 t2.exe。
程序運行出現錯誤,如圖:
修改成mov [0],0433h mov [2] ,0436h 亦生錯誤:
然而,使用debug編譯連接,無錯誤發生:
產生文件如下:
在Debug中運行得結果:
在左上角出現紅色數字36
(2) 如果(1)結果得到驗證,重新打開 t2.asm,嘗試將源代碼中 line7 的 0433h→0432h,
line10 的 0436h→0439h, 然后重新匯編、連接,得到可執行文件 t2.exe。使用 cls 命令清屏后,再次觀察程序運行結果。
用記事本對其進行更改:
修改后需重新編譯連接:
執行:
左上方出現紅色數字29
(3) 如果(1)結果得到驗證,重新打開 t2.asm,嘗試將源代碼中 line7 的 0433h→0333h,
line10 的 0436h→0336h, 然后重新匯編、連接,得到可執行文件 t2.exe。使用 cls 命令清屏后,再次觀察程序運行結果。
同(2)再次進行修改-編譯-連接,得執行結果如圖:
由(1)(2)不難得知,顯示出的數字與數據段中末尾值相關,而如今修改了前三位數值后,數字顏色發生變化,由043變化至033,顏色由紅變天藍色。
總結:綜上可知,int 21H似乎與屏幕顯示有關,根據ax,bx所指向啊不同,進行不同的輸出,int 是interupt 中斷的縮寫,int 21H是指dos的中斷調用命令。根據目前所學,至ax=4C00h,再調用int 21H,程序結束,而有實驗可知ax=2時,調用int 21h會使字符輸出。
關於練習2使用masm集成實驗環境運行t2時,為何出錯,出現mov [bx],0433h指令無效的錯誤,]本人不知所以,如有所知,期待有所解答。