/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/a5fcfaf6a09cd93e730eeca8.html
;從鍵盤輸入四位16進制數,以2進制、10進制輸出
;=============================================
DATA SEGMENT
STR1 DB 'INPUT A HEX NUM: $'
HEX DB 5 ;計劃輸入的字符個數(含回車符)
NNN DB 0 ;存放實際輸入的字符個數
DB 5 DUP(?)
BIN DW ? ;輸入數字的二進制形式的存放單元
ERR DB 0AH, 0DH, ' ERROR !'
DB 0AH, 0DH, ' I HAVE NO TIME TO PLAY WITH YOU ! $'
STR2 DB 13, 10, 'BINARY IS: $'
DATA ENDS
;--------------------------------------------
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
;--------------------------------------------
CODE SEGMENT
ASSUME CS:CODE, SS:STACK, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, STACK
MOV SS, AX
LEA DX, STR1 ;'INPUT A HEX NUM'
MOV AH, 9 ;顯示字符串
INT 21H
LEA DX, HEX
MOV AH, 10 ;等著輸入四位HEX數
INT 21H
;---------------------------------------
;下面進行轉換
MOV BIN, 0 ;先把二進制數字單元清零
LEA SI, HEX + 2;取輸入字符串的首地址
MOV CH, NNN ;取輸入字符的個數,用來控制循環處理的次數
CONV:
MOV BL, [SI] ;取來壹個字符
CMP BL, 0DH ;和回車符進行比較
JZ END0 ;是, 即結束
CMP BL, '0'
JB ERROR ;小於'0'轉移
CMP BL, 'F'
JA ERROR ;大於'F'轉移
CMP BL, '9'
JNA A2B ;不大於'9', 就去變換
CMP BL, 'A'
JNB A2B ;不小於'A', 就去變換
JMP ERROR ;其它符號都是錯誤
;---------------------------------------
A2B:
SUB BL, 30H ;ASC-->BIN
CMP BL, 10
JB A2B_END
SUB BL, 07H ;ASC-->BIN
A2B_END:
;---------------------------------------
MOV BH, 0 ;弄成16位數
PUSH CX
MOV AX, BIN ;把原來的數字乘以16
MOV CX, 16
MUL CX
ADD AX, BX ;加上新輸入的
MOV BIN, AX ;存結果,這就是二進制數
INC SI
POP CX
DEC CH ;處理次數減壹
JNZ CONV ;非零轉移
;---------------------------------------
DISP:
LEA DX, STR2 ;'BINARY IS: $'
MOV AH, 9 ;顯示字符串
INT 21H
;---------------------------------------
MOV AX, BIN ;取來數字
MOV CX, 16 ;顯示16位數
DDDD:
MOV DL, '0' ;先計劃顯示0
TEST AX, 8000H ;測試最高位
JZ DDD1
INC DL ;非0就顯示1
DDD1:
PUSH AX
MOV AH, 2 ;顯示DL中的ASCII碼
INT 21H
POP AX
SHL AX, 1 ;左移
LOOP DDDD ;CX-1,非零轉移
JMP END0 ;16位顯示完畢,轉到結束
;---------------------------------------
ERROR:
LEA DX, ERR
MOV AH, 09H ;錯誤信息提示
INT 21H
;---------------------------------------
END0:
MOV DL, 10
MOV AH, 2 ;顯示DL中的ASCII碼
INT 21H
MOV DL, 13
MOV AH, 2 ;顯示DL中的ASCII碼
INT 21H
;---------------------------------------
MOV AX, BIN ;取來數字
CALL DISP_AX
MOV AH, 4CH ;返回DOS
INT 21H
;------------------------------
DISP_AX:
MOV BX, 10 ;10進制.
MOV CX, 5 ;5位.
ABC:
MOV DX, 0
DIV BX
PUSH DX ;保存余數
LOOP ABC
MOV CX, 5 ;顯示5位.
ASD:
POP DX
CMP DL, 10
JB A48
ADD DL, 7
A48:
ADD DL, 48
MOV AH, 2
INT 21H ;輸出.
LOOP ASD
RET
;------------------------------
CODE ENDS
;---------------------------------------
END START
;=============================================
程序執行效果如下:
c:\masm510>H_BD
INPUT A HEX NUM: D4A2
BINARY IS: 1101010010100010
54434
c:\masm510>