我正在尝试使用gcc -c main.s编译以下内容
.intel_syntax noprefix
.global main
main:
push ebp
mov ebp,esp
sub esp,0x10
mov DWORD PTR [ebp-0xc],0x0
mov eax,DWORD PTR [ebp+0xc]
mov eax,DWORD PTR [eax+0x4]
mov DWORD PTR [ebp-0x4],eax
leave
ret
我收到一个错误:
main.s:6:错误:“推”操作数类型不匹配
这不起作用是什么原因?
答案 0 :(得分:4)
从Intel® 64 and IA-32 Architectures Software Developer’s Manual开始, 7.3.1.5 64位模式下的堆栈操作指令
:在64位模式下,堆栈指针大小为64位,并且不能被指令前缀覆盖。在隐式堆栈引用中,地址大小覆盖将被忽略。 在64位模式下,不能在堆栈上推送和弹出32位值。
(强调我的。)
push ebp
尝试推送32位寄存器,这在64位模式下是不允许的。
这是32位代码(即使push ebp
是可编码的,也会在64位模式下崩溃),因此您需要将其汇编为32位可执行文件。对于gcc或clang,请使用
gcc -m32 -no-pie -fno-pie main.s -o my_prog
(no-pie选项不是必需的,但您可能希望它们为32位代码获得更简单的位置相关的可执行文件。)