微機實驗報告4 數碼轉換程式實驗
桂 林 理 工 大 學
實 驗 報 告
班級 軟體工程16-1班 學號 3162052051116 姓名 張識虔 同組實驗者
實驗名稱 數碼轉換程式實驗
一、實驗目的:
掌握不同進位制數及編碼相互轉換的程式設計方法
二、實驗環境:
PC 微機一臺、TD-PITD 實驗系統一套。
三、實驗內容:
計算機輸入裝置輸入的資訊一般是由 ASCII 碼或 BCD 碼錶示的資料或字 符,CPU 一般均用二進位制數進行計算或其他資訊處理,處理結果的輸出又必須 依照外設的要求變為 ASCII 碼、BCD 碼或七段顯示碼等。因此,在應用軟體中, 各類數制的轉換和程式碼的轉換是必不可少的。計算機與外設間的數碼對應關係如 表 2-3-1 所示。數碼轉換關係如圖 2-3-1 所示。
圖 2-3-1 計算機與外設間的數碼轉換關係
表 2-3-1 數碼轉換對應關係
- 將 ASCII 碼錶示的十進位制數轉換為二進位制數
本實驗要求將緩衝區中的一個五位十進位制數 00012 的 ASCII 碼轉換成二進 制數,並將轉換結果顯示在螢幕上。轉換過程的參考流程如圖 2-3-2 所示,根據 流程圖編寫程式程式碼。
十進位制數可以表示為:Dn×10n+Dn-1×10n-1+…+D0×100=Di×10i 其中 Di 代 表十進位制數 1、2、3…9、0。
上式可以轉換為:Σ
由上式可歸納十進位制數轉換為二進位制的方法:從十進位制數的最高位 Dn 開始 作乘 10 加次位的操作,依次類推,則可求出二進位制數結果。
圖 2-3-2 十進位制 ASCII 轉換為二進位制數參考流程
DATA SEGMENT ;定義源資料段
MSR DB '00012'
LEN EQU $-MSR
DATA ENDS
CODE SEGMENT ;定義程式碼段
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS,AX
MOV SI, OFFSET MSR
MOV CX,LEN-1
MOV AL, DS:[SI] ;開始傳輸資料
MOV AH,0
SUB AX,30H
NEXT1: MOV BX, 0AH
MUL BX ; 將AX中的數乘以10,所得的結果高位儲存到DX中,低位儲存到AX中
INC SI
MOV DL,DS:[SI]
MOV DH,0
SUB DX,30H ;將數字對應的ASCII碼轉換成響應的二進位制數
ADD AX,DX
DEC CX
JNZ NEXT1
MOV CL,16 ; CL用作迴圈NEXT2的計數器,因為5位十進位制數轉化成二進位制只有十六位,所以迴圈次數為16次
MOV BX,AX
NEXT2: ROL BX,1
MOV DL,BL
AND DL,01H
ADD DL,30H ;把BX中的數以二進位制形式輸出
MOV AH,2H
INT 21H
DEC CL
JNZ NEXT2
MOV AX,4C00H
INT 21H
CODE ENDS
END START
- 將十進位制數的 ASCII 碼轉換為 BCD 碼
本實驗要求將鍵盤輸入的一個五位十進位制數 54321 的 ASCⅡ碼存放在資料 區中,轉換為 BCD 碼後 ,並將轉換結果顯示於螢幕上 。若輸入的不是十進位制 數的 ASCⅡ碼,則輸出“FF”。提示:一位元組 ASCⅡ碼取其低四位即變為 BCD 碼。轉換部分的實驗流程參見 2-3-3,根據流程圖編寫程式程式碼。
- 將十六進位制數的 ASCII 碼轉換為十進位制數
本實驗要求將緩衝區中存放的 000CH 的 ASCII 碼轉換成十進位制數,並將轉 換結果顯示在螢幕上。轉換部分的實驗流程如圖 2-3-4,根據流程圖編寫程式代 碼。
十六位二進位制數的值域為 0-65535,最大可轉換為五位十進位制數。五位十進 制數可表示為:ND=D4×104+D3×103+D2×102+D1×10+D0 因此,將十六位二進 制數轉換為五位 ASCⅡ碼錶示的十進位制數,就是求 D1-D4,並將它們轉化為 ASC Ⅱ碼。
圖 2-3-3 十進位制 ASCII 轉換為 BCD 碼數參考流程
DATA SEGMENT ;定義源資料段
STRING DB 'Input:','$'
MSR DB 6,?,6 DUP(?) ;資料段MSR用於接收從鍵盤輸入的五位十進位制數
DATA ENDS
CODE SEGMENT ;定義程式碼段
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX ; 裝載資料段暫存器
LEA DX, STRING
MOV AH, 09H
INT 21H
MOV DX, OFFSET MSR
MOV AH,0AH
INT 21H
MOV CL,[MSR+1] ;CL中儲存實際輸入的資料的位數,用於控制迴圈執行的次數
MOV SI,0002H
MOV BX, OFFSET MSR
NEXT1: MOV AL,[BX+SI] ;開始傳輸資料
CMP AL,40H
JNC LK1 ;大於等於40H則表明輸入的不是數字符,跳到LK1輸入F
CLC
CMP AL,30
JC LK1 ;小於30H則表明輸入的不是數字字元,到LK1輸出字元F
SUB AL,30H
MOV CH,0
PUSH CX
MOV CL,4
MOV DH,AL
SHL DH,CL
NEXT2: ROL DH,1
MOV DL,DH
AND DL,01H
ADD DL,30H
MOV AH,02H
INT 21H
DEC CL
JNZ NEXT2
POP CX
INC SI
DEC CL
JNZ NEXT1
LK1: JZ LK2
MOV DL,46H ;輸出字元F
MOV AH,02H
INT 21H
INC SI
DEC CL
JNZ NEXT1
LK2: MOV AX,4C00H
INT 21H
CODE ENDS
END START
圖 2-3-4 將十六進位制數的 ASCII 碼轉換為十進位制數參考流程
4.BCD 碼轉換為二進位制碼 本 實 驗 要 求 將 內 存 單 元 中 的 四 個 二 位 十 進 制 數 的 BCD 碼
01H,07H,03H,04H,05H,01H,06H,08H,轉換成二進位制數碼存入其後的記憶體單元中, 轉換結束,送螢幕顯示。轉換部分的實驗流程參見 2-3-5,根據流程圖編寫程式 程式碼。
圖 2-3-5 BCD 碼轉換為二進位制碼
DATA SEGMENT ;定義源資料段
STRING DB 'Input:','$'
MSR DW 000CH
MDR DB 5 DUP(?),'$'
DATA ENDS
CODE SEGMENT ;定義程式碼段
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET MDR
MOV SI, 5
MOV AX,[MSR] ;將資料000CH儲存到AX當中
NEXT1: DEC SI
MOV DX,0
MOV CX,0AH
DIV CX
ADD DL,30H
MOV [BX+SI],DL
CMP AX,0
JNE NEXT1
CMP SI,0 ;判斷SI是否為零,為零則表明五位十進位制數的每一位都不為零,否則應給前面為零的位上補上零
JE NEXT3
NEXT2: DEC SI
MOV AL,30H
MOV [BX+SI],AL
CMP SI,0
JNE NEXT2
NEXT3: MOV DX,OFFSET MDR
MOV AH,09H
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
2.3.4 實驗步驟 (1) 按照各實驗要求分別編寫實驗程式。
(2) 對實驗程式進行編譯、連結。
(3) 使用除錯功能除錯程式,觀察在除錯過程中,程式指令執行之後各寄存 器及資料區的內容。
(4) 更改資料區中的資料,反覆測試,驗證程式功能。
四、心得體會:
這個是第一次自己手打的實驗 的確很難 對組合語言還不是很熟悉 有時候答案出來了 還不是很理解是怎麼轉換的 很糾結 唉