【问题标题】:Multiple of 3 using 16 bit Assembler NASM使用 16 位汇编器 NASM 的 3 的倍数
【发布时间】:2020-10-20 14:39:53
【问题描述】:

请有人帮助我,过去几周我一直在研究这个问题,但我还没有找到解决问题的方法。

我正在尝试确定用户输入的数字是否是三的倍数。 数字范围在 1-9 之间。

下面是我正在处理的代码:

mov ah,01   
int 21h
mov bl,al
mov bl,3
div bl
cmp ah,0 ;Checks to see if remainder is zero
je e ;if it is not, go to e else execute code below
                
    mov dx, var1
    mov ah,09
    int 21h
    jmp exit
            
e:
    mov dx, var2
    mov ah,09
    int 21h
    jmp exit
        
exit:
    mov ah,4ch
    int 21h

我知道我需要将我的输入转换为十六进制,我尝试使用下面的行但它没有帮助,当我输出值以便能够看到它们时,我得到像笑脸这样的符号:

 add ch,48

【问题讨论】:

  • 基本上是 NASM Assembly convert input to integer? 的副本,但那是 32 位代码。某处可能有一个 16 位版本,其中包括通过 DOS 或 BIOS 调用的输入。 (有趣的事实:为了被 9 整除,您可以使用将基数为 10 的数字求和(排除 9)的数学技巧,而不是相乘和相加来创建数字的二进制整数表示。无论哪种方式,都不是实际涉及的十六进制;您不想将数字分成 4 位块。)

标签: assembly nasm x86-16


【解决方案1】:

我正在尝试确定用户输入的数字是否是三的倍数。数字范围在 1-9 之间。

mov ah,01   
int 21h

您从此 DOS 函数获得的输入是一个由 ASCII 码表示的字符。如果您使用键盘键 19,您将在 AL 注册中收到一个从 49 到 57 的数字。
要获得这些键上描述的,您只需减去 48:

sub al, 48

要检查数字是否是 3 的倍数,您确实可以除以 3 并检查余数。但是字节大小的除法需要AX 寄存器中要除的数字,而这是您忽略的!

mov ah, 0  ; From AL to AX (could have used CBW instruction here)
mov bl, 3
div bl     ; Divides AX by BL -> Quotient in AL, Remainder in AH

休息就像你做的那样......

【讨论】:

  • 非常感谢您的帮助,我最初使用了您提供的用于转换的代码,但我想我没有在正确的上下文中使用它以及随后的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多