我已经写了代码,但它并没有相应地转换。
.MODEL SMALL
.STACK 100H
.DATA
INPUT_MSG DB 'Enter an octal number: $'
OUTPUT_MSG DB 'The hexadecimal number is: $'
INPUT_NUM DW ?
HEX_NUM DB 3 DUP(0)
HEX_DIGITS DB '0123456789ABCDEF'
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; Display input message
LEA DX, INPUT_MSG
MOV AH, 9
INT 21H
; Read octal input number
MOV AH, 01H
INT 21H
SUB AL, 30H ; convert ASCII digit to binary
MOV BL, AL ; save input number in BL
MOV AH, 01H
INT 21H
SUB AL, 30H ; convert ASCII digit to binary
MOV CL, AL ; save input number in CL
MOV AH, 01H
INT 21H
SUB AL, 30H ; convert ASCII digit to binary
MOV DL, AL ; save input number in DL
; Convert octal to hexadecimal
MOV AL, BL ; load first digit
AND AL, 07H ; mask upper bits
MOV BH, 00H ; clear high byte of BX
MOV BL, AL ; move first digit to low byte of BX
MOV AL, BH ; clear AL
MOV BL, HEX_DIGITS[BX] ; lookup hexadecimal digit
MOV HEX_NUM[0], BL ; store first digit in HEX_NUM
MOV AL, CL ; load second digit
AND AL, 07H ; mask upper bits
MOV BH, 00H ; clear high byte of BX
MOV BL, AL ; move second digit to low byte of BX
MOV AL, BH ; clear AL
MOV BL, HEX_DIGITS[BX] ; lookup hexadecimal digit
MOV HEX_NUM[1], BL ; store second digit in HEX_NUM
MOV AL, DL ; load third digit
AND AL, 07H ; mask upper bits
MOV BH, 00H ; clear high byte of BX
MOV BL, AL ; move third digit to low byte of BX
MOV AL, BH ; clear AL
MOV BL, HEX_DIGITS[BX] ; lookup hexadecimal digit
MOV HEX_NUM[2], BL ; store third digit in HEX_NUM
; Display output message and hexadecimal number
LEA DX, OUTPUT_MSG
MOV AH, 9
INT 21H
MOV DL, HEX_NUM[0]
MOV AH, 02H
INT 21H
MOV DL, HEX_NUM[1]
MOV AH, 02H
INT 21H
MOV DL, HEX_NUM[2]
MOV AH, 02H
INT 21H
; Exit program
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
1条答案
按热度按时间hyrbngr71#
只有当你开始组合八进制数字(复数)的一部分时,输入才变成“八进制数字”(单数)。
八进制数字在数字的二进制表示中占据3位,因此3位八进制数的分解为:
在汇编中,乘以8转化为向左移位3倍,乘以64是向左移位两次的结果。
假设用户输入有效(仅使用数字“0”至“7”且不超过377o),代码变为:
BL寄存器现在保存八进制数。作为示例,考虑八进制数253o,其在寄存器中留下十进制值171(2 * 64 + 5 * 8 + 3)。
下一个任务是将该值打印为十六进制数ABh。十六进制数字在寄存器中占用4位,我们需要首先打印最高有效位: