我正在尝试汇编一个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
答案 0 :(得分:1)
此代码有很多错误。您要询问的特定对象是因为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
进行组装和链接。