下面是我在NASM上的代码。我将两个整数用作用户输入(2和3),并希望将它们相加然后打印到stdout。输入正确,但作为输出则显示一些任意字符。我做错了什么?我相信添加输入块有问题,但不确定是什么。
section .bss
fnum rest 255
lnum rest 255
section .text
global _start
_start:
; first input
mov ecx, fnum
mov edx, 255
mov ebx, 0
mov eax, 3
int 80h
; second input
mov ecx, lnum
mov edx, 255
mov ebx, 0
mov eax, 3
int 80h
; adding inputs 2 and 3
mov eax, fnum
add eax, ecx
add eax, 48
push eax
mov eax, esp
;print output
mov ecx, eax
mov edx, 2
mov ebx, 1
mov eax, 4
int 80h
答案 0 :(得分:0)
当您阅读输入时,您要求将至少255个字节的文本放入位置fnum
和lnum
中。您从不会读过该文本,而是将两个内存地址加在一起(只是地址,而不是内容),然后加48。然后打印出加法结果的前两个字节,这实际上不是你想要的,甚至没有意义的。
您需要读取从那些内存地址([fnum]
而不是fnum
)读取的字节,将它们转换为可以进行算术运算的整数,然后将那些加在一起的内存地址,将结果数字 back 转换为文本,然后打印文本。
在最简单的情况下,输入和输出均为单位数非负数(0、1、2、3、4、5、6、7、8或9),则可以将字符转换为通过减去0x30
(十进制48)可以得到数字,然后可以通过添加0x30
从数字转换为字符。这是因为ASCII digits是连续的,从字符0x30
开始是数字0。我认为注释“添加输入2和3”之后的第三行应该是这种转换,但是您要转换的东西不是您想要的输出。
在NASM中,您可以将0x30
编写为'0'
,这对于人类读者来说更加明确。