【问题标题】:8086 simple decimal addition from user input来自用户输入的 8086 简单十进制加法
【发布时间】:2021-02-15 09:53:12
【问题描述】:

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

【问题讨论】:

  • 你很复古的计算。通常您进行“二进制”计算并以十进制打印数字(因此转换数字)。但也许这是一项任务,因此预计您使用 BCD (en.wikipedia.org/wiki/Intel_BCD_opcode)。如果是这种情况,你能具体说明吗?
  • 我只需要使用可用于 8086 和算术指令的中断。我会尝试研究 BCD 谢谢,
  • 但是,您应该只进行从二进制到文本的基本转换(BCD 可能会有所帮助,但不是很多,您仍然应该将值转换为字符串,BCD 允许它使用更少的除法,并且在原则上,数字可以随心所欲)
  • 抱歉,当假设用户输入为十进制时,我看不到 bcd 将如何帮助我进行转换,你能给我详细的工作流程吗?例如,在用户输入值 5 之后?
  • 我认为您的问题只是“如何在汇编程序中将二进制数据转换为字符串”。

标签: assembly x86 x86-16


【解决方案1】:

例如,当我输入 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

对于 59 之间的所有输入,加 5 的结果将包含 2 位数字。您的代码必须预见到这一点。

【讨论】:

    猜你喜欢
    • 2014-08-20
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多