Арифметическая операция в NASM, показывающая произвольный характер - PullRequest
0 голосов
/ 19 ноября 2018

Ниже мой код на NASM.Я принимаю два целых числа как пользовательский ввод (2 и 3) и хочу добавить их, а затем распечатать на стандартный вывод.Ввод выполняется правильно, но в качестве вывода он показывает произвольный символ.Что я делаю не так?Я считаю, что что-то не так в добавлении блока ввода, но не уверен, что это такое.

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 голосов
/ 20 ноября 2018

Когда вы читаете во входных данных, вы запрашиваете не менее 255 байтов текста, который будет помещен в местоположения fnum и lnum.Вы никогда не читаете этот текст, а вместо этого добавляете два адреса памяти вместе (только адреса, а не содержимое), а затем добавляете 48. Затем вы распечатываете первые два байта результата этого добавления, что на самом деле не то, чтоВы хотите, и даже не имеют смысла.

Вам нужно прочитать байты, прочитанные с этих адресов памяти ([fnum] вместо fnum), превратить их в целые числа, по которым вы можете выполнять арифметику, добавить эти вместе вместо адресов памяти, превратить полученное число обратно в текст, а затем распечатать текст.

Для простейшего случая, когда оба входа и выхододнозначные неотрицательные числа (0, 1, 2, 3, 4, 5, 6, 7, 8 или 9), вы можете преобразовать символ в число, вычитая 0x30 (десятичное 48), и вы можетепреобразовать число в символ, добавив 0x30.Это потому, что ASCII-цифры являются последовательными, начиная с символа 0x30, являющегося цифрой 0. Я полагаю, что ваша третья строка после комментария "добавление входов 2 и 3" должна быть такого рода преобразованием,но то, что вы конвертируете, - это не тот результат, который вам нужен.

В NASM вы можете написать 0x30 как '0', что делает цель более очевидной для читателей-людей.

...