我让用户输入一个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。你们可以让我知道我做错了什么吗,请帮帮我?任何帮助将不胜感激。
答案 0 :(得分:3)
一旦您从输入中获得了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
我要显示用户输入的号码。
将存储在BX
中的16位数字(从先前的步骤)移至AX
寄存器,然后阅读我对如何转换AX
中的16位数字的解释变成文本,以便可以将其打印到屏幕上的Displaying numbers with DOS。