我正在创建一个8086汇编程序,要求用户输入一个十进制值,然后加上5,然后打印。但是它使用十六进制值执行计算。
所以当我输入5时,例如:它将是0x35 + 0x35 = 0x6A那么Ox6a将根据ASCII表
打印为'j'。我现在使用这个中断来进行用户输入。
mov AH,01H
INT 21H
这是我到目前为止的代码
.MODEL SMALL
.STACK 300
.DATA
MSG DB "Enter a number: $"
msg2 DB 10,13, "Adding 5 to the number...$"
msg3 DB 10,13, "the number is: $"
.CODE
;init data segment
MOV AX,@DATA
MOV DS, AX
MOV ES, AX
;PRINT MSG
LEA DX,MSG
MOV AH,09H
INT 21H
;GET CHAR
mov AH,01H
INT 21H
MOV CL,AL
;PRINT MSG
LEA DX,MSG2
MOV AH,09H
INT 21H
;newl
MOV dl, 10
MOV ah, 02h
INT 21h
MOV dl, 13
MOV ah, 02h
INT 21h
;computations
ADD CL, 0x35
;PRINT MSG
LEA DX,MSG3
MOV AH,09H
INT 21H
;print char
MOV DL,CL
MOV AH,02H
INT 21H
EXIT:
MOV AH,4CH
INT 21H
END
如何从8086上的用户输入进行十进制计算?
所以当我输入5时,例如:它将是0x35 + 0x35 = 0x6A
你需要区分和和其文本表示.
当你通过DOS输入时。GetCharacter函数01h并按键盘上的5, DOS返回一个表示文本字符"5"的ASCII码;(0 x35)。如果你要对输入的数字进行任何计算,你需要把ASCII码留在后面,开始处理"真值",即5。简单的转换就是减去48 (0x30)。
add 5 to it
加5就是这样,而不是像你写的那样加0x35(53)。
;GET CHAR
mov AH, 01H
INT 21H
sub al, 48 ; From character to number
MOV CL, AL
...
;computations
ADD CL, 5 ; Calculation on numbers
...
;print result
cmp cl, 10
jb IsSingleDigitResult
IsDoubleDigitResult:
mov dl, "1" ; Separately displaying the 'tens'
mov ah, 02h
int 21h
sub cl, 10 ; Isolating the 'ones'
IsSingleDigitResult:
add cl, 48 ; From number to character
MOV DL, CL
MOV AH, 02H
INT 21H
对于5和9之间的所有输入,加5的结果将由2位数字组成。你的代码必须预见到这一点。