一、實驗要求
利用PROTEUS平臺,建立8086 的十六進制轉BCD例子。
二、實驗目的
1、熟悉實驗系統的編程和使用。
2、掌握簡單的數值轉換算法。
3、基本瞭解數值各種表達方法。
三、實驗說明
計算機中的數值有各種表達方式,這是計算機的基礎。掌握各種數制之間的轉換是一種基本功。有興趣的同學可以試試將BCD轉換成十六進制碼。
四、實驗程序流程圖
五、實驗步驟
a.仿真代碼
;將AX拆爲5個BCD碼,並存入RESULT開始的5個單元
;AX=0FFFFH=65535
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX,0000H
MOV AX, 65535 ;被轉換的數字
MOV CX, 10000
DIv CX ; DIV用AX除以CX
MOV RESULT, AL ; 除以 10000, 得WAN位數,AL中存的是商
MOV AX,DX ; DX中存儲的是餘數
MOV DX,0000H
MOV CX, 1000
DIv CX
MOV RESULT+1, AL ; 除以 1000, 得QIAN位數
MOV AX,DX
MOV DX,0000H
MOV CX, 100
DIv CX
MOV RESULT+2, AL ; 除以 100, 得BAI位數
MOV AX,DX
MOV DX,0000H
MOV CX, 10
DIv CX
MOV RESULT+3, AL ; 除以 10, 得SHI位數
MOV RESULT+4, DL ; 得GE位數
JMP $
CODE ENDS
DATA SEGMENT
RESULT Db 5 DUP(?)
DATA ENDS
END START
b.調試、驗證
首先AX=65535=FFFFH,CX=10000=2710H
執行完DIV CX後,AX中存儲65535/10000的商6,DX存儲餘數159FH=5535.
然後商6H作爲萬位結果,存入內存。
將DX內的餘數移入AX後,將DX重置爲0,再將CX設置爲1000=3E8H。
執行完DIV CX後,AX中存儲5535/1000的商5,DX存儲餘數217H=535.
然後商5H作爲千位結果,存入內存。
將DX內的餘數移入AX後,將DX重置爲0,再將CX設置爲100=64H。
執行完DIV CX後,AX中存儲535/100的商5,DX存儲餘數23H=35.
然後商5H作爲百位結果,存入內存。
將DX內的餘數移入AX後,將DX重置爲0,再將CX設置爲10=AH。
執行完DIV CX後,AX中存儲35/10的商3,DX存儲餘數5H=5.
然後商5H作爲十位結果,存入內存。
餘數可以直接作爲個位結果存入內存。
六. 實驗結果和體會
實驗結果如上,可以發現內存中存儲了十進制表示的65535.成功實現了十六進制到BCD碼的轉換。
然而該程序仍存在不小缺陷,其對各位的處理是定死在程序中的,對於大於一個字節的十六進制就無能爲力了。如果轉成循環結構,既能應對更長的數據處理,又能節省程序內存。
七. 擴展題目程序和實驗結果
;將12345轉成16進制,並存入RESULT
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX,0000H
MOV AX, 12345
MOV CX, 1000H
DIv CX
MOV RESULT, AL ; 除以 1000H, 得QIAN位數
MOV AX,DX
MOV DX,0000H
MOV CX, 100H
DIv CX
MOV RESULT+1, AL ; 除以 100H, 得BAI位數
MOV AX,DX
MOV DX,0000H
MOV CX, 10H
DIv CX
MOV RESULT+2, AL ; 除以 10H, 得SHI位數
MOV RESULT+3, DL ; 得GE位數
JMP $
CODE ENDS
DATA SEGMENT
RESULT Db 5 DUP(?)
DATA ENDS
END START
相比原程序,該程序只改動了AX初始化的數值爲12345,並將各除數從十進制改爲十六進制。並且由於在十六進制下只有四位數,故刪去了一次除法。實際上不刪的話也只是在最前方多了個0.
實驗未開始時的內存
還沒初始化時寄存器全爲0
程序執行完後,內存多了3039H=12345
而此時的寄存器保存着最後一次除法的結果,39H/10H的商爲3H,餘數爲9H,分別在AX與DX中。CX中存着除數10H。