如何将用户输入的16位数字转换为十进制
How to convert a 16 bit number entered by user to decimal
我让用户输入一个 16 位数字。我想显示用户输入的号码。
这就是我到目前为止的想法。
如您所见,我已从输入中减去 30H 以将其转换为十进制。我应该在哪里添加 30H 以将其恢复为原始 ASCII 值?
MOV AH,1H ;user input for first number part 1
INT 21H
SUB AL,30H
MOV NUM1,AL
MOV AH,1H ;1st number part 2
INT 21H
SUB AL,30H
MOV NUM2,AL
MOV AH,1H ;1st number part 3
INT 21H
SUB AL,30H
MOV NUM3,AL
MOV AH,1H ;1st number part 4
INT 21H
SUB AL,30H
MOV NUM4,AL
XOR AH,AH
MOV AL,NUM1
MOV DX,1000D
MUL DX ;1*1000
ADD AH,30H
ADD AL,30H
MOV BX,AX
XOR AH,AH
MOV AL,NUM2
MOV DX,100D
MUL DX ;2*100
ADD BX,AX
XOR AH,AH
MOV AL,NUM3
MOV DX,0010D
MUL DX ;3*10
ADD AH,30H
ADD AL,30H
ADD BX,AX
XOR CH,CH
MOV CL,NUM4
ADD CH,30H
ADD CL,30H
ADD BX,CX ;BX now has the 16 bit number
MOV FNUM1,BX ;final 1st 16 bit number
PRINTN
LEA DX,MSG8 ;msg for output
MOV AH,9H
INT 21H
PRINT FNUM1
例如:当我输入数字 1234 时,我得到的输出是 F。你们能告诉我我做错了什么并帮助我吗?在这一点上,我们将不胜感激。
先把输入弄好
从输入中获得 4 位数字后,您需要按照公式
将它们组合起来
d1 * 1000 + d2 * 100 + d3 *10 + d4
在此计算中,您无需添加 48!
乘法*1000需要一个字大小的mul
,但是乘以*100和*10可以用一个字节大小的mul
。
mov al, NUM1
cbw ; -> AH=0
mov dx, 1000
mul dx ; Product 1*1000 in DX:AX but with DX=0
mov bx, ax
mov al, 100
mul NUM2 ; Product 2*100 in AX
add bx, ax
mov al, 10
mul NUM3 ; Product 3*10 in AX
add bx, ax
add bl, NUM4
adc bh, 0 ; BX now has the 16 bit number
上面的一个更好的版本使用了一个循环。仅当您将 NUMx 变量定义为内存中的连续字节时,此循环才有效!
NUM1 db 0
NUM2 db 0
NUM3 db 0
NUM4 db 0
...
mov cx, 4 ; Number of digits
lea si, NUM1 ; Address of 1st digit (most significant digit)
xor bx, bx ; The 16-bit result
More:
imul bx, 10 ; BX = BX * 10
lodsb ; NUM1 then NUM2 then NUM3 then NUM4
cbw
add bx, ax
dec cx
jnz More
然后输出到屏幕。
I want to display the number entered by the user.
将BX
中存储的16位数字(从前面的步骤)移动到AX
寄存器中,然后阅读我对如何转换[=16中的16位数字的解释=] 到文本中,以便它可以在 Displaying numbers with DOS.
处打印到屏幕上
我让用户输入一个 16 位数字。我想显示用户输入的号码。
这就是我到目前为止的想法。
如您所见,我已从输入中减去 30H 以将其转换为十进制。我应该在哪里添加 30H 以将其恢复为原始 ASCII 值?
MOV AH,1H ;user input for first number part 1
INT 21H
SUB AL,30H
MOV NUM1,AL
MOV AH,1H ;1st number part 2
INT 21H
SUB AL,30H
MOV NUM2,AL
MOV AH,1H ;1st number part 3
INT 21H
SUB AL,30H
MOV NUM3,AL
MOV AH,1H ;1st number part 4
INT 21H
SUB AL,30H
MOV NUM4,AL
XOR AH,AH
MOV AL,NUM1
MOV DX,1000D
MUL DX ;1*1000
ADD AH,30H
ADD AL,30H
MOV BX,AX
XOR AH,AH
MOV AL,NUM2
MOV DX,100D
MUL DX ;2*100
ADD BX,AX
XOR AH,AH
MOV AL,NUM3
MOV DX,0010D
MUL DX ;3*10
ADD AH,30H
ADD AL,30H
ADD BX,AX
XOR CH,CH
MOV CL,NUM4
ADD CH,30H
ADD CL,30H
ADD BX,CX ;BX now has the 16 bit number
MOV FNUM1,BX ;final 1st 16 bit number
PRINTN
LEA DX,MSG8 ;msg for output
MOV AH,9H
INT 21H
PRINT FNUM1
例如:当我输入数字 1234 时,我得到的输出是 F。你们能告诉我我做错了什么并帮助我吗?在这一点上,我们将不胜感激。
先把输入弄好
从输入中获得 4 位数字后,您需要按照公式
将它们组合起来
d1 * 1000 + d2 * 100 + d3 *10 + d4
在此计算中,您无需添加 48!
乘法*1000需要一个字大小的mul
,但是乘以*100和*10可以用一个字节大小的mul
。
mov al, NUM1
cbw ; -> AH=0
mov dx, 1000
mul dx ; Product 1*1000 in DX:AX but with DX=0
mov bx, ax
mov al, 100
mul NUM2 ; Product 2*100 in AX
add bx, ax
mov al, 10
mul NUM3 ; Product 3*10 in AX
add bx, ax
add bl, NUM4
adc bh, 0 ; BX now has the 16 bit number
上面的一个更好的版本使用了一个循环。仅当您将 NUMx 变量定义为内存中的连续字节时,此循环才有效!
NUM1 db 0
NUM2 db 0
NUM3 db 0
NUM4 db 0
...
mov cx, 4 ; Number of digits
lea si, NUM1 ; Address of 1st digit (most significant digit)
xor bx, bx ; The 16-bit result
More:
imul bx, 10 ; BX = BX * 10
lodsb ; NUM1 then NUM2 then NUM3 then NUM4
cbw
add bx, ax
dec cx
jnz More
然后输出到屏幕。
I want to display the number entered by the user.
将BX
中存储的16位数字(从前面的步骤)移动到AX
寄存器中,然后阅读我对如何转换[=16中的16位数字的解释=] 到文本中,以便它可以在 Displaying numbers with DOS.