首页 > 解决方案 > 来自用户输入的 8086 简单十进制加法

问题描述

我正在创建一个 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 上的用户输入进行十进制计算?

标签: assemblyx86x86-16

解决方案


因此,例如,当我输入 5 时:它将是 0x35 + 0x35 = 0x6A

你需要区分数字它的文本表示

当您通过 DOS.GetCharacter 函数 01h 输入并按下5键盘时,DOS 返回一个代表文本字符“5”(0x35)的 ASCII 码。如果您要对输入的数字执行任何计算,您需要留下 ASCII 代码并开始使用 5 的“真实值”。转换只是减去 48 (0x30)。

加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 之间的所有输入59加上 5 的结果将由 2 位数字组成。您的代码必须对此有所预见。


推荐阅读