使用 as 组装 x86 程序集时指令后缀无效

invalid instruction suffix when assembling x86 assembly with as

我编写了一个汇编程序,当我在以下代码片段中使用 pushlpopl 时,assemble 成功地使用了 as --32

  PrintHelloWorld:
    movl , %ecx
    PrintTenTimes:
      pushl %ecx
      movl , %eax
      movl , %ebx
      leal HelloWorld, %ecx
      movl , %edx
      int [=10=]x80
      popl %ecx
    loop PrintTenTimes
    jmp ExitCall

但是当我尝试为 64 位机器组装时,出现以下错误:

ConditionalBranching.s: Assembler messages:
ConditionalBranching.s:51: Error: invalid instruction suffix for `push'
ConditionalBranching.s:57: Error: invalid instruction suffix for `pop'

所以我把pushl和popl改成pushq和popq,然后我得到以下错误:

ConditionalBranching.s: Assembler messages:
ConditionalBranching.s:51: Error: operand type mismatch for `push'
ConditionalBranching.s:57: Error: operand type mismatch for `pop'

如何消除此错误并assemble 成功用于 64 位?

我认为您很可能仍在尝试推动 32 位 eax 而不是将指令正确升级为:

pushq %rax

这是基于错误消息现在抱怨的是操作数类型不匹配而不是后缀。

根据 Intel 文档,32 位寄存器推送指令在 64 位模式下不可编码: