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

时间:2015-05-12 07:48:45

标签: assembly x86 x86-64

当我在以下代码片段中使用as --32pushl时,我编写了一个与popl成功汇总的汇编程序:

  PrintHelloWorld:
    movl $10, %ecx
    PrintTenTimes:
      pushl %ecx
      movl $4, %eax
      movl $1, %ebx
      leal HelloWorld, %ecx
      movl $14, %edx
      int $0x80
      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'

如何删除此错误并成功组装64位?

1 个答案:

答案 0 :(得分:1)

我认为你很可能仍然试图推动32位eax,而不是正确地将你的指令升级为:

pushq %rax

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

根据英特尔文档,32位寄存器推送指令在64位模式下无法编码:

enter image description here