Сборка: чтение целого числа из стандартного ввода, увеличение его и печать в стандартный вывод
Я написал следующий скрипт сборки для 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 обычно имеют дело с текстом, поэтому то, что вы читаете, вероятно, будет строкой, а не числом, чтобы использовать его как число, вам придется преобразовать его и затем конвертируйте его обратно, прежде чем записывать.