1. 程式人生 > >微機實驗報告4 數碼轉換程式實驗

微機實驗報告4 數碼轉換程式實驗

     

班級  軟體工程16-1  學號  3162052051116  姓名  張識虔  同組實驗者              

實驗名稱             數碼轉換程式實驗                     

日期 2018 11 14

一、實驗目的:

掌握不同進位制數及編碼相互轉換的程式設計方法

二、實驗環境:

PC 微機一臺、TD-PITD 實驗系統一套。

三、實驗內容:

 

計算機輸入裝置輸入的資訊一般是由 ASCII 碼或 BCD 碼錶示的資料或字 符,CPU 一般均用二進位制數進行計算或其他資訊處理,處理結果的輸出又必須 依照外設的要求變為 ASCII 碼、BCD 碼或七段顯示碼等。因此,在應用軟體中, 各類數制的轉換和程式碼的轉換是必不可少的。計算機與外設間的數碼對應關係如 2-3-1 所示。數碼轉換關係如圖 2-3-1 所示。

 

2-3-1  計算機與外設間的數碼轉換關係

 

2-3-1  數碼轉換對應關係

 

  1. ASCII 碼錶示的十進位制數轉換為二進位制數

 

本實驗要求將緩衝區中的一個五位十進位制數 00012 ASCII 碼轉換成二進 制數,並將轉換結果顯示在螢幕上。轉換過程的參考流程如圖 2-3-2 所示,根據 流程圖編寫程式程式碼。

 

十進位制數可以表示為:Dn×10n+Dn-1×10n-1++D0×100=Di×10i 其中 Di 表十進位制數 12390

 

上式可以轉換為:Σ

Di×10i=(((Dn×10+Dn-1)×10)+Dn-2)×10++D1)× 10+D0

 

由上式可歸納十進位制數轉換為二進位制的方法:從十進位制數的最高位 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

 

 

 

  1. 將十進位制數的 ASCII 碼轉換為 BCD

 

本實驗要求將鍵盤輸入的一個五位十進位制數 54321 ASCⅡ碼存放在資料 區中,轉換為 BCD 碼後 ,並將轉換結果顯示於螢幕上 。若輸入的不是十進位制 數的 ASCⅡ碼,則輸出“FF”。提示:一位元組 ASCⅡ碼取其低四位即變為 BCD 碼。轉換部分的實驗流程參見 2-3-3,根據流程圖編寫程式程式碼。

  1. 將十六進位制數的 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 碼轉換為十進位制數參考流程

4BCD 碼轉換為二進位制碼 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) 更改資料區中的資料,反覆測試,驗證程式功能。

 

 

四、心得體會:

 

 

這個是第一次自己手打的實驗 的確很難  對組合語言還不是很熟悉   有時候答案出來了 還不是很理解是怎麼轉換的  很糾結