NASM中的算术运算显示任意字符

时间:2018-11-19 19:25:12

标签: assembly nasm

下面是我在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

1 个答案:

答案 0 :(得分:0)

当您阅读输入时,您要求将至少255个字节的文本放入位置fnumlnum中。您从不会读过该文本,而是将两个内存地址加在一起(只是地址,而不是内容),然后加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',这对于人类读者来说更加明确。