Assembly 8086用户输入的简单十进制加法
我正在创建一个8086汇编程序,要求用户输入一个十进制值,加上5,然后打印。但它使用十六进制值进行计算 例如,当我输入5时:它将是0x35+0x35=0x6A 然后,Ox6a将根据ASCII表格打印为“j” Im当前正在使用此中断进行用户输入Assembly 8086用户输入的简单十进制加法,assembly,x86,x86-16,Assembly,X86,X86 16,我正在创建一个8086汇编程序,要求用户输入一个十进制值,加上5,然后打印。但它使用十六进制值进行计算 例如,当我输入5时:它将是0x35+0x35=0x6A 然后,Ox6a将根据ASCII表格打印为“j” Im当前正在使用此中断进行用户输入 mov AH,01H INT 21H 这是到目前为止我的代码 .MODEL SMALL .STACK 300 .DATA MSG DB "Enter a number: $" msg2 DB 10,13, &qu
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”(0x35)的ASCII码。如果要对输入的数字执行任何计算,则需要保留ASCII码,并开始使用“真值”,即5。转换只是减去48(0x30)
再加上5
添加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位数字组成。您的代码必须预见到这一点。您非常喜欢复古计算。通常,您进行“二进制”计算,并以十进制打印数字(因此转换数字)。但这可能是一个赋值,所以我们希望您使用BCD()。你能具体说明是不是这样吗?我只需要使用8086和算术指令可用的中断。我将尝试研究BCD谢谢,但是,您应该只做从二进制到文本的基本转换(BCD可能会有帮助,但不是那么多,您仍然应该将值转换为字符串,BCD允许使用更少的除法,原则上数字可以任意长)对不起,但我不知道bcd如何能帮助我在假设用户输入为十进制时进行转换,您能给我一个详细的工作流程吗。例如,在用户输入值5之后?我认为您的问题只是“如何在汇编程序中将二进制数据转换为字符串”。