HTB PROC IN4: MOV AH,01H INT 21H CMP AL,'0' JB ERROR4 CMP AL,':' JB DO4 SUB AL,'A'-':' CMP AL,40H JB DO4 SUB AL,'a'-'A' CMP AL,3AH JB ERROR4 CMP AL,40H JB DO4 CMP AL,3FH JA ERROR4 DO4: SUB AL,'0' MOV CL,4 MOVE4: SHL AX,1 LOOP MOVE4 ;LEA DX,NEXTLINE ;MOV AH,09H ;INT 21H MOV CL,4 OUT4: XOR AH,AH XOR DL,DL SHL AX,1 ADD DL,AH ADD DL,'0' MOV AH,02H INT 21H LOOP OUT4 JMP START ERROR4: CALL ERROR HTB ENDP 我想用这段内容将1位16进制数转化为4位2进制数,但输出的4位数中只有最高位是正确的,我该怎么改
时间: 2023-11-13 18:05:58 浏览: 130
htb21-reg:htb 2021注册引擎
这段代码的问题在于没有正确地处理每一位十六进制数转化成二进制后的结果。你需要对每一位进行单独处理,而不是像现在一样只处理最高位。
你可以将 AL 中的十六进制数转化成两位二进制数,然后将这两位二进制数存储到 AX 中。然后将 AX 左移一位,再将下一位二进制数存储到 AX 中,如此循环四次,直到所有四位二进制数都存储到 AX 中为止。最后,将 AX 中的四位二进制数输出即可。
以下是修改过后的代码:
```
HTB PROC
MOV AH,01H
INT 21H
CMP AL,'0'
JB ERROR4
CMP AL,':'
JB DO4
SUB AL,'A'-':'
CMP AL,40H
JB DO4
SUB AL,'a'-'A'
CMP AL,3AH
JB ERROR4
CMP AL,40H
JB DO4
CMP AL,3FH
JA ERROR4
; 将 AL 中的十六进制数转化成两位二进制数
AND AL, 0FH
MOV CL, 4
MOV AH, 0
MOV DX, 0000H
HEX_TO_BIN:
SHR AL, 1
RCL AH, 1
INC DL
LOOP HEX_TO_BIN
; 将二进制数存储到 AX 中
MOV AX, 0000H
MOV CL, 4
BIN_TO_AX:
SHL AX, 1
RCL AH, 1
LOOP BIN_TO_AX
; 输出四位二进制数
MOV CL, 4
OUT4:
MOV DL, '0' ; 先输出 '0'
TEST AX, 8000H
JZ NO_ONE
MOV DL, '1' ; 如果最高位是 1,则输出 '1'
ADD AX, AX ; 左移一位
NO_ONE:
ADD DL, 0
MOV AH,02H
INT 21H
LOOP OUT4
JMP START
ERROR4:
CALL ERROR
HTB ENDP
```
希望能帮到你!
阅读全文