NASM | 无法在数学运算中使用 stdin 中的 3 位整数 / 根本无法



我目前正在进行一个装配课程简介项目,其中要求我们从三位整数中减去一位整数并显示两位数输出。(暗示 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 的第一个数字。

  1. 您正在将 3 个字节读取到缓冲区input该缓冲区只有 1 个字节的空间(您写了resb 1)。

  2. 如果键入572作为该程序的输入,则input缓冲区的内容将是对应于字符572的三个字节,其ASCII字符代码分别为53,55,50。 由您编写代码来执行数学运算,将其转换为整数 572 以用于算术运算。 在更高级的语言中,这将通过像scanfatoi这样的库函数为您完成,但这是汇编,您必须自己做所有事情。 请参阅 NASM 程序集将输入转换为整数?对于一些示例。

  3. mov [input],ax会用ax的内容覆盖输入缓冲区,这是read系统调用的返回值(即读取的字节数,可能3)。 这不是你想做的。mov ax, [input]本身更接近,因为它实际上将 16 位值从input加载到ax中,但如前所述,它不会是所需的值,因为您尚未完成十进制到二进制的转换。

最新更新