У меня программа не выводит числа в консоль, как исправить?

Моя программа лишена смысла, она должна получить 2 числа и вывести их, но выводит адрес на месте первого числа и букву на месте второго числа. Программа написана с помощью FASM

format PE console

entry start

include 'win32a.inc'

section '.data' data readable writable
        formatNum db '%d', 0
        formatNum2 db '%t', 0

        razmer rb 1
        razmer2 rb 1

        wn db 'RY? ', 0
        ho db 'SY? ', 0
        tg db ' %d, %t', 0

        NULL = 0

section '.code' code readable executable

        start:
                push wn
                call [printf]

                push razmer
                push formatNum
                call [scanf]

                push ho
                call [printf]

                push razmer2
                push formatNum2
                call [scanf]

                push razmer2
                push razmer
                push tg
                call [printf]

                call [getch]

                push NULL
                call [ExitProcess]

section '.idata' import data readable
        library kernel , 'kernel32.dll',\
                msvcrt, 'msvcrt.dll'

        import kernel,\
                ExitProcess, 'ExitProcess'

        import msvcrt,\
               printf, 'printf',\
               getch, '_getch',\
               scanf, 'scanf'
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Моя программа … выводит адрес на месте первого числа и букву на месте второго числа.
как исправить?

1) посмотреть, какие параметры ожидает функция printf которую ты используешь. Форматная строка для двух целых чисел -- "%d %d".
2) узнать, как параметры передаются в функцию и что делать после возвращения из неё. Ты используешь push razmer чтобы передать адрес переменной razmer в scanf, но в printf нужно передать не адрес переменной, а её значение. Например так:
mov eax, [razmer]
push eax


Помимо этого в коде есть и другие ошибки: razmer и razmer2 определены как rb 1, а должны бы быть определены как rd 1, поскольку формат %d для scanf приведёт к записи 4 байт. %t -- нет такого формата в scanf, имелся в виду, наверно, %d.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы