【问题标题】:Assembly emu8086 - How to print the two added numbers?汇编 emu8086 - 如何打印两个相加的数字?
【发布时间】:2020-10-15 19:26:19
【问题描述】:

我正在尝试打印我输入的 2 位数字,但在打印时遇到了问题。这是我的进步:

DATA SEGMENT
MSG1 DB "ENTER NUMBER : $"
DIGIT1 DB ?
DIGIT2 DB ?
BCD DB ?
DATA ENDS

CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX

LEA DX,MSG1
MOV AH,9
INT 21H

MOV AH,1
INT 21H
SUB AL,30H
MOV DIGIT1,AL

MOV AH,1
INT 21H
SUB AL,30H
MOV DIGIT2,AL

MOV AH,DIGIT1
MOV AL,DIGIT2

MOV CL,4
ROL AH,CL

ADD AL,AH
MOV BCD,AL
MOV AH,1
INT 21H

CODE ENDS

END START

我的代码可以接受 2 位输入,但它无法打印输入的 2 位添加数字,它会打印 Enter Number:

【问题讨论】:

  • Displaying numbers with DOS 展示了如何将二进制整数转换为十进制字符串。不过,解包 BCD 整数实际上更容易,只需 AND 和 shift。解包回数字。当然,如果你只是将两个 ASCII 数字分开保存,那就更容易了,当然,作为一个字符串,但我猜这“太简单了”。

标签: assembly dos x86-16 emu8086


【解决方案1】:

您的程序成功地从 2 个输入创建了一个压缩 BCD
要将结果打印回屏幕,您首先需要将放在一起的内容拆开,然后将数字转换为 DOS 可以输出的字符。

; Display the tens:
mov dl, BCD
mov cl, 4
shr dl, cl  ; Moves the "tens" from high nibble to low nibble, throwing out the "ones"
or  dl, '0' ; Converts from digit value [0,9] to digit character ['0'-'9']; adds 48
mov ah, 02h ; DOS.PrintCharacter
int 21h
; Display the ones:
mov dl, BCD
and dl, 15  ; Only keeps the "ones"
or  dl, '0' ; Converts from digit value [0,9] to digit character ['0','9']; adds 48
mov ah, 02h ; DOS.PrintCharacter
int 21h

我的代码可以接受 2 位输入,但无法打印输入的 2 位添加数字,并且 它会打印 Enter Number:

您发布的代码MOV AH,1 INT 21H 不可能产生这个输出!也许你在生成截图的代码中写了mov ah,9

此外,屏幕截图在“R”和“:”之间缺少一个空格字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多