В этом коде много ошибок. В частности, вы спросили о том, что call
принимает только один операнд, функцию (адрес) для вызова. Непонятно, что вы хотели сделать с call scanf, %eax
, тем более что вы ничего не установили eax
. scanf
принимает два аргумента, но даже если вы выделите буфер в стеке, вы не передадите его адрес. printf
при его использовании также требуется два аргумента, но вы передаете только строку формата. Также у вас есть опечатка inout
против input
. Кроме того, вы не можете ret
, если вы используете _start
в качестве точки входа, вам нужен системный вызов exit
. Однако, если вы собираетесь использовать функции C, рекомендуется использовать main
в качестве точки входа, в этом случае вы можете оставить ret
. Фиксированная версия может выглядеть так:
.section .rodata
output: .string "You entered %s\n"
input: .string "%s"
.section .text
.globl main
main:
pushl %ebp
movl %esp, %ebp
subl $100, %esp
push %esp
pushl $input
call scanf
add $8, %esp
push %esp
pushl $output
call printf
xorl %eax, %eax
movl %ebp, %esp
popl %ebp
ret
Собрать и связать, используя gcc -m32 input.s
.