尝试汇编IA32汇编文件并获取“调用”的操作数不匹配错误

时间:2019-01-05 14:30:05

标签: linux assembly x86

我正在尝试汇编一个IA32汇编文件,该文件读取用户输入。当我尝试使用as -o input.o input.s运行它时,我收到一条错误消息,提示“操作数类型与'call'不匹配

这是代码;

.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 :(得分:1)

此代码有很多错误。您要询问的特定对象是因为call仅采用一个操作数,即要调用的函数(地址)。尚不清楚您想对call scanf, %eax做什么,特别是因为您尚未将eax设置为任何东西。 scanf确实有两个参数,但是即使您在堆栈上分配了缓冲区,也不会传递其地址。 printf在使用时也需要两个参数,但是只传递格式字符串。另外,您还有一个错字inoutinput。此外,如果使用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进行组装和链接。