2.1顯示程式實驗
2.1.3 實驗內容及說明
一般來說,有很多程式需要顯示輸出提示執行的狀況和結果,有的還需要將
資料區中的內容顯示在螢幕上。本實驗要求將指定資料區的資料以十六進位制數形
式顯示在螢幕上,並利用 DOS 功能呼叫完成一些提示資訊的顯示。通過本實驗,
初步掌握實驗系統配套操作軟體的使用。
實驗中常使用的 DOS 功能呼叫(INT 21H)說明如下。
(1) 顯示單個字元輸出
入口:AH=02H
呼叫引數:AL=輸出字元
例如:
MOV AH ,02H
INT 21H
(2) 顯示字串
入口:AH=09H
呼叫引數:DS:DX=串地址,’$’為結束字元
例如:
MOV AH ,09H
INT 21H
(3) 鍵盤輸入並回顯
入口:AH=01H
返回引數:AL=輸出字元
例如:
MOV AH ,01H
INT 21H
(4) 返回 DOS 系統
入口:AH=4CH
22
呼叫引數:AL=返回碼
例如:
MOV AH ,4CH
INT 21H
組合語言源程式包含指令和偽指令。如 ADD AL,BL 和 MOV AX,1000
都是指令。在彙編過程中偽指令並不形成任何程式碼,常用的偽指令有:
(1) 確定 CPU 的偽指令.586/.586 P。為了使組合語言準確執行,要求在彙編
語言源程式的開頭用偽指令“.586”或者“.586 P”來表示當前的程式是在 Pentium
系統中執行。否則彙編程式採用預設值“.8086”;
- 標號賦值偽指令 EQU;
(3) 定義儲存單元偽指令 DB、DW、DD、DQ 和 DT。DB 定義位元組,DW
定義字,DD 定義雙字,DQ 定義四字,DT 定義 10 個位元組;
(4) 定義儲存單元型別偽指令 BYTE、WORD、DWORD;
(5) 段定義偽指令 SEGMENT、ENDS、ASSUME 和 ORG。偽指令 SEGMENT
和 ENDS 總是成對使用,用這一對偽指令可將組合語言與程式分成幾個段,通
常分為資料段、堆疊段和程式碼段。ASSUME 是告訴彙編程式哪個段為資料段,
哪個段為堆疊段,哪個段為程式碼段;
(6) 簡約段定義偽指令.DATA/.STACK/.CODE;
(7) 過程定義偽指令 PROC、ENDP、NEAR、FAR。定義過程的偽指令 PROC
和 ENDP 總是成對出現,這兩條偽指令中間的內容作為一個子程式;
- 程式結束偽指令 END。
從儲存區域讀出的資料為十六進位制資料,本程式設計的難點在於將十六進位制
的數字轉換成 ASCII 碼顯示。數值與 ASCII 的關係:0~9 轉換成 ASCII 碼時直
接在數值上加上 30H 即可,A~F 轉換成 ASCII 碼時直接在數值上
根據上述流程圖編寫實驗程式(例程檔名:A1.ASM)
STACK1 SEGMENT STACK ;堆疊段開始
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT ;資料段開始
MES DB 'Press any key to exit!',0AH,0DH,0AH,0DH,'$'
MES1 DB 'Show a as hex:',0AH,0DH,'$'
SD DB 'a'
DATA ENDS
CODE SEGMENT ;程式碼段開始
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA ;設定 DS 暫存器
MOV DS,AX
MOV DX,OFFSET MES ;取字串首地址,顯示退出提示
MOV AH,09H ;在 DOS 介面顯示字串
INT 21H
MOV DX,OFFSET MES1 ;取字串首地址,顯示字串
24
MOV AH,09H
INT 21H
MOV SI,OFFSET SD
MOV AL,DS:[SI] ;把’a’送到 AL 中
AND AL,0F0H ;取位元組的高 4 位
MOV CL,4
SHR AL,CL
CMP AL,0AH ;判斷是否是 A 以上的數
JB C2
ADD AL,07H ;大於等於 A,數值加 7H
C2: ADD AL,30H ;數值加 30H,轉換成 ASCII 碼
MOV DL,AL
MOV AH,02H ;將轉換的相應 ASCII 碼在 DOS 介面下顯示
INT 21H
MOV AL,DS:[SI]
AND AL,0FH ;取位元組的低 4 位
CMP AL,0AH
JB C3
ADD AL,07H
C3: ADD AL,30H
MOV DL,AL ;顯示字元
MOV AH,02H
INT 21H
KEY: MOV AH,1 ;判斷是否有按鍵按下?
INT 16H ;(為觀察執行結果,使程式有控制的退出)
JZ KEY
MOV AX,4C00H ;結束程式,退出
INT 21H
CODE ENDS
END START
2.1.4 實驗步驟
1.使用 MASM5.0 實現
(1) 編輯原始碼
原始碼的編輯可在.txt 文件中直接編寫,程式編寫完成後將檔名改成
A1.asm,並儲存在 E 盤目錄下的 MYCODE 資料夾中,如:E:\MYCODE\A1.asm。
(2) 編譯 A1.asm 檔案
在 DOS 下開啟 MASM5.0 所在目錄。方法:開始->執行輸入 cmd 可進入 DOS
系統,依次輸入 E: 回車,進入 E 盤根目錄,然後輸入 E:\>CD MYCODE 回車,可
打 開 E:\MYCODE 目錄。開啟檔案目錄後輸入命令: E:\MYCODE>
D:\MASM5.0\MASM A1.ASM ,之後連續 3 次回車。程式無錯則在 E:\MYCODE
25
中增加檔案 A1.OBJ。
(3) 連結 A1.obj 檔案
生成的 obj 檔案並不是一個可執行檔案,還需要經過 LINK 連結之後才能生
成 A1.exe 檔案。在介面輸入 E:\MYCODE>D:\MASM5.0\LINK A1.OBJ 之後連續 3
次回車,可生成.exe 檔案。
本實驗的結果就是將 ASCII 碼‘a’的十六進位制數值在螢幕上顯示出來。從
螢幕上看顯示結果可知實驗完成。但是執行 a1.exe 檔案的速度非常之快,我們無
法知道程式執行的過程,下面將介紹使用 DEBUG 除錯來檢視程式的執行步驟。
(4) DEBUG 除錯
DEBUG 命令式作業系統的一個外部命令,不是 MASM5.0 的命令。
進入 DEBUG,可以對程式進行一步一步的跟蹤執行,可以檢視每條指令執
行後,CPU 暫存器的變化,記憶體單元的變化,可以修改暫存器內容和儲存單元
內容,可以連續執行多條指令或全速執行程式等。
常用的除錯命令如下:
-u 反彙編
-r 顯示暫存器內容
-g [=address1][address2][address3] 執行到斷點行,如:-g 12 為執行到第 12
行
-t [=address][value] 跟蹤,配合-g 使用 如:-t 12 1 為從第 12 行開始,每執
行 1 條指令後停下來
-e address [list] 修改地址 address 處的值為 list,list 不寫時預設為
-d 檢視資料
-q 退出返回作業系統
下面我們除錯 a1.exe 檔案。
輸入命令 E:\MYCODE> DEBUG A1.EXE 回車可進入除錯系統,先輸入命令
- u 對檔案進行反彙編。
輸入命令-g 8 回車可將程式執行到地址為 0008 處的指令 MOV AH,09 停 止,再用-t 回車命令單步跟蹤,觀察 AX 暫存器的值。
由地址 0013 處的程式 MOV SI,002C,可知 ASCII 碼’a’的數值存放在偏移地 址為 002C 的位置上,通過命令 d 可查詢。輸入命令-g 16 回車將程式執行到偏移 地址為 0016 處,輸入命令-d 002C 回車,可檢視記憶體中的資料,數值為 61H。
可輸入命令-e 002C 55 回車,將偏移地址 002C 處的 61,改成 55,通過命令 -d 002C 回車 d 002C 檢視更改後的結果為 55,輸入命令-g 回車回車可全速執行 程式到程式結束,可見執行結果為 55,正是之前修改過的值。
- 使用 Tdpit 整合操作軟體實現
- 執行 Tdpit 整合操作軟體,進入編輯除錯整合環境。
- 根據程式設計使用語言不同,在“語言設定”選單項中設定所使用的語 言。該項一經設定,會再下次啟動後仍保持不變。
- 開始新建檔案進行程式設計。點選“檔案”選單項中的“新建”,可以新建一 個空白文件。預設名為 Td-pit1。
- 編寫程式,如圖 2-1-11 所示,並儲存,此時軟體會提示輸入新的檔名, 輸入檔名後點擊儲存。
- 點選 ,編譯檔案,若程式編譯無誤,然後再點選 ,連線程式。 編譯連線成功會在輸出資訊欄顯示輸出資訊,
- 編譯連線成功後可以點選 ,執行程式,檢視執行結果。
- 可以點選 ,除錯程式,進入除錯介面,進行程式的除錯。