Сборка: чтение целого числа из стандартного ввода, увеличение его и печать в стандартный вывод

Я написал следующий скрипт сборки для IA32. Предполагается, что он читает число из stdin, увеличивает его и печатает в stdout, но он не работает должным образом, ничего не печатает (возможно, чтение из stdin не прекращается или что-то не так с печатью?)

.section .text
    .globl _start

_start:
    movl $3, %eax       # use syscall 3 (read) to read from stdin
    movl $0, %ebx       # reads from stdin (FD 0)
    movl %edi, %ecx    # store input in register %edi
    movl $4, %edx       # read one byte
    int  $0x80      # invoke system call to read from stdin

    incl %edi          # increment the value we got from stdin

    movl $4, %eax       # use syscall 4 (write) to print to screen
    movl $1, %ebx       # print to stdout (FD 1)
    movl %edi, %ecx    # pointer to text to write out
    movl $4, %edx       # length of text to write out (1 byte)
    int  $0x80          # invoke system call to write to stdout

    movl $1, %eax       # use syscall 1 (exit) to exit
    movl $0, %ebx       # error code = 0
    int  $0x80          # invoke system call

Вы видите ошибку? За любую помощь заранее благодарю,

Всего наилучшего, Саймон

1 ответ

Решение
movl %edi, %ecx    # store input in register %edi
movl $4, %edx       # read one byte

Эта часть все неправильно. Вы не можете сохранить результат чтения в регистре. Что на самом деле делает, так это сохраняет результат по адресу, содержащемуся в% edi, который, поскольку вы его не установили, вероятно, где-то, что вы не имеете, хранит что-либо Сначала вам нужно освободить место в памяти для хранения строки. Вы также читаете четыре байта, а не один.

Я бы заменил это на что-то вроде этого

subl $4, %esp
movl %esp, %ecx
movl $4, %edx

Это освободит место для 4 байтов в стеке, а затем использует вершину стека в качестве адреса для хранения строки. Вам также придется изменить аргументы для системного вызова write, чтобы использовать этот адрес.

Другая проблема, с которой вам придется столкнуться, заключается в том, что stdin и stdout обычно имеют дело с текстом, поэтому то, что вы читаете, вероятно, будет строкой, а не числом, чтобы использовать его как число, вам придется преобразовать его и затем конвертируйте его обратно, прежде чем записывать.

Другие вопросы по тегам