最近刚学汇编,就写了这道题练练手。下面是思考过程:
;确认目标:从键盘接收一个四位的16 进制数,并在终端上显示与它等值的二进制数。
;分析过程:
;1.先接收一个字符,指令是:MOV AH, 1 INT 21H,字符存在AL中
;2.判断该字符的ASCII码,如果是处于0~9,那么就将AL-'0',再将AL的送入BX的低四位中,再将BX左移4位;如果是A~F就-'A'+10,再将AL的送入BX的低四位中,再将BX左移4位
;3.循环2步骤进行4次,这样BX存的数就是答案了
;4.输出BX,思路是每次输出BX的最高位再把BX左移一位,循环16次。用TEST,根据ZF的值决定输出
下面是代码实现:
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS : CODE, DS : DATA
START:
MOV AX, DATA
MOV DS, AX
INIT:
MOV AX, 0
MOV CX, 4
MOV BX, 0
LOOP_BODY:
MOV AH, 1 ;要求输入的十六进制数中的字母必须用大写!!!
INT 21H
CMP AL, '9'
JA LETTER
;小于等于9的情况
SUB AL, '0'
AND AL, 0FH
JMP STORE
LETTER:
SUB AL, 'A'
ADD AL, 10
AND AL, 0FH
JMP STORE
STORE:
SHL BX, 4
MOV AH, 0
OR BX, AX
LOOP LOOP_BODY
MOV CX, 16
OUT:
TEST BX, 8000H
JZ ZERO
SHL BX, 1
MOV DL, '1'
MOV AH, 2
INT 21H
LOOP OUT
JMP EXIT
ZERO:
SHL BX, 1
MOV DL, '0'
MOV AH, 2
INT 21H
LOOP OUT
EXIT:
MOV AX, 4C00H
INT 21H
CODE ENDS
END START