Попытка собрать файл сборки IA32 и получить ошибку несоответствия операнда для 'call' - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь собрать файл сборки IA32, который читает ввод пользователя. Когда я пытаюсь запустить его с as -o input.o input.s, я получаю сообщение об ошибке «Несоответствие типов операндов для« вызова »

Вот код;

.code32
.section .rodata
output: .string "You entered %s\n"
inout: .string "%s"

.section .text
.globl _start
_start:

pushl %ebp
movl %esp, %ebp

subl $100, %esp
pushl $input
call scanf, %eax

add $8, %esp
pushl $output
call printf

xorl %eax, %eax
movl %ebp, %esp
popl %ebp
ret

1 Ответ

0 голосов
/ 05 января 2019

В этом коде много ошибок. В частности, вы спросили о том, что 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.

...