push ebp:“ push”的操作数类型不匹配

时间:2018-10-07 18:20:39

标签: gcc assembly x86

我正在尝试使用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:错误:“推”操作数类型不匹配

这不起作用是什么原因?

1 个答案:

答案 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位代码获得更简单的位置相关的可执行文件。)