assembly 国家标准协会|无法在数学运算中使用标准输入中的3位整数/完全无法使用

aamkag61  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(132)

我目前正在做一个项目,在介绍汇编课程中,我们被要求从一个三位整数减去一个一位整数,并显示一个位输出。(暗示3位整数〉100但〈108)
我似乎在每一步处理这个变量都有问题。我写了下面的程序,看看我是否可以把它放入ax 16位寄存器,并把它移回来,但似乎不能做到这一点。
我知道它的ascii值可能会有一个大于1字节的问题,虽然看到'ax'是一个2字节的寄存器,但它似乎不会有问题。
我使用的是在线rextester.com nasm编译器。

section .bss
    input: resb 1
    
section .text
    global _start
    
_start:
    
    mov eax,3
    mov ebx,0
    mov ecx,input
    mov edx,3
    int 80h
    
    mov [input],ax
    mov ax,[input]
    
    mov eax,4
    mov ebx,1
    mov ecx,input
    mov edx,1
    int 80h

    mov eax,1
    mov ebx,0
    int 80h

这个函数的输出是垃圾,但是没有mov,我得到了int的第一个数字。

pengsaosao

pengsaosao1#

1.您正在将3个字节读入缓冲区input,该缓冲区只有1个字节的空间(您写入了resb 1)。
1.如果键入572作为此程序的输入,则input缓冲区的内容将是与字符572对应的三个字节,它们的ASCII字符代码分别为53、55 50。由您编写代码来执行数学运算,将其转换为整数572,以便用于算术运算。在更高的-这可以通过一个像scanfatoi这样的库函数来完成,但是这是汇编,你必须自己完成所有的工作。

  1. mov [input],ax将用ax的内容覆盖输入缓冲区,axread系统调用的返回值mov ax, [input]本身更接近于input中的16位值,因为它实际上是将input中的16位值加载到ax中,但正如前面提到的,它不是所需的值,因为您还没有进行十进制到二进制的转换。

相关问题