代码之家  ›  专栏  ›  技术社区  ›  S. L.

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

  •  1
  • S. L.  · 技术社区  · 6 年前

    我试图使用gcc-cmain.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:错误:“push”的操作数类型不匹配

    1 回复  |  直到 6 年前
        1
  •  5
  •   Peter Cordes    6 年前

    Intel® 64 and IA-32 Architectures Software Developer’s Manual :

    在64位模式下,堆栈指针大小为64位,不能被指令前缀覆盖。在隐式堆栈引用中,将忽略地址大小重写。

    (我的)

    push ebp 尝试推送32位寄存器,这在64位模式下是不允许的。


    推ebp 是可编码的),所以需要将其组装成32位可执行文件。使用gcc或clang

    gcc -m32 -no-pie -fno-pie  main.s  -o my_prog
    

    (无饼图选项不是必需的,但您可能希望它们为32位代码获得更简单的位置相关可执行文件。)