實驗內容:
-
練習1:編寫第一個源程序,學會編程,編譯,連接,跟蹤
(1)首先在文本文檔里面編寫源程序:
(2)然后在dosbox下進行編譯,連接,執行
可以看到輸出結果為36
(3)將源程序的line4和line9的值進行修改,源程序修改如下:
(我將line4的3改為了6,將line9的6改為了7)
(4)編譯,連接,執行以上修改后的源程序:
可以看到輸出結果為67
(5)用debug對生成的可執行文件t1.exe進行調試:
- 先用r命令查看:
可以觀察到:
- cx寄存器的值為0016h,即源程序的長度為28個字節;
- 寄存器ds的值為075Ah,cs的值為076Ah,滿足關系(cs)=(ds)+10h,即076Ah=075Ah+10h,這10h的區域則是PSP(程序段前綴)。
- 用d命令查看PSP的內容:
可以觀察到PSP的頭兩個字節確實是CD
- 用u命令對t1.exe進行反匯編,可以觀察到源代碼:
- 使用t命令和p命令進行單步調試:
一個小結:
可以觀察到單步執行下兩次的輸出結果分別為3和6;
每次遇上int的時候都用p命令,實際上是調用了子程序的結果。
-
練習2:編寫第二個源程序,進行編譯,連接,執行
(1)進行源程序的編寫:
(2)對程序進行編譯,連接
(然后清屏再執行一下)
可以觀察到左上方輸出了紅色的36
(3)修改源程序,將line7的0433h修改為0432h,將line10的0436h修改為0439h
(4)再執行修改后的程序
可以觀察到左上方出現紅色的29
(5)再次修改源程序,將line7的0433h→0333h,將line10 的 0436h→0336h
(6)再執行以上源程序
可以觀察到左上方出現了藍綠色的36
延伸思考和分析:
- 練習2與實驗一任務4的聯系:都是向b800后的內存單元寫入數據,即將數據輸入了顯存,所以會在顯示屏上出現不同色彩的圖案。
- 我對源程序的理解:
assume cs:code code segment mov ax,0b800h mov ds,ax ;將顯存內存單元的段地址傳給ds mov bx,0 mov [bx],0433h ;向以ds為段地址,0為偏移地址的內存單元存入0433h, ;其代表了紅色的3 add bx,2 mov [bx],0436h ;向以ds為段地址,2為偏移地址的內存單元存入0436h, ;其代表了紅色的6 mov ax,4c00h int 21h code ends end
- 練習1在顯示數據時通過執行程序段本身來達到顯示的效果,而練習2是通過將數據寫入顯存而達到顯示的效果
總結與體會:
- 我對練習1程序段的顯示方法很感興趣,於是上網搜查了一下,mov ah,2 ... int 21h有顯示字符的功能,輸出的是dl的值,但由於顯示的時候要轉換ASCII碼值,所以要注意dl中的值;而在練習1中的程序段,3的ASCII碼值為33h,6的ASCII碼值為36h,所以最后通過該程序段能將“3”和“6”分別輸出;由於輸出的是dl的值,所以要顯示“36”,就只能分為兩次輸出。
- 通過本次實驗,我熟悉了用dosbox來實現對匯編程序的編譯,連接與跟蹤執行的過程,熟悉了匯編程序的結構,對下一個實驗進行的程序編寫有很大的幫助。