我目前正在做一个项目,在介绍汇编课程中,我们被要求从一个三位整数减去一个一位整数,并显示一个两位输出。(暗示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条答案
按热度按时间pengsaosao1#
1.您正在将3个字节读入缓冲区
input
,该缓冲区只有1个字节的空间(您写入了resb 1
)。1.如果键入
572
作为此程序的输入,则input
缓冲区的内容将是与字符5
、7
和2
对应的三个字节,它们的ASCII字符代码分别为53、55 50。由您编写代码来执行数学运算,将其转换为整数572,以便用于算术运算。在更高的-这可以通过一个像scanf
或atoi
这样的库函数来完成,但是这是汇编,你必须自己完成所有的工作。mov [input],ax
将用ax
的内容覆盖输入缓冲区,ax
是read
系统调用的返回值mov ax, [input]
本身更接近于input
中的16位值,因为它实际上是将input
中的16位值加载到ax
中,但正如前面提到的,它不是所需的值,因为您还没有进行十进制到二进制的转换。