当我在以下代码片段中使用as --32
和pushl
时,我编写了一个与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位?
答案 0 :(得分:1)
我认为你很可能仍然试图推动32位eax
,而不是正确地将你的指令升级为:
pushq %rax
基于错误消息现在抱怨操作数类型不匹配而不是后缀的事实。
根据英特尔文档,32位寄存器推送指令在64位模式下无法编码: