1. 程式人生 > >2.1顯示程式實驗

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”;

 

  1. 標號賦值偽指令 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 總是成對出現,這兩條偽指令中間的內容作為一個子程式;

 

  1. 程式結束偽指令 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,正是之前修改過的值。

 

  1. 使用 Tdpit 整合操作軟體實現
  1. 執行 Tdpit 整合操作軟體,進入編輯除錯整合環境。
  2. 根據程式設計使用語言不同,在“語言設定”選單項中設定所使用的語 言。該項一經設定,會再下次啟動後仍保持不變。
  3. 開始新建檔案進行程式設計。點選“檔案”選單項中的“新建”,可以新建一 個空白文件。預設名為 Td-pit1。
  4. 編寫程式,如圖 2-1-11 所示,並儲存,此時軟體會提示輸入新的檔名, 輸入檔名後點擊儲存。
  5. 點選 ,編譯檔案,若程式編譯無誤,然後再點選 ,連線程式。 編譯連線成功會在輸出資訊欄顯示輸出資訊,
  6. 編譯連線成功後可以點選 ,執行程式,檢視執行結果。
  7. 可以點選 ,除錯程式,進入除錯介面,進行程式的除錯。