使用 as 组装 x86 程序集时指令后缀无效
invalid instruction suffix when assembling x86 assembly with as
我编写了一个汇编程序,当我在以下代码片段中使用 pushl
和 popl
时,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 位模式下不可编码:
我编写了一个汇编程序,当我在以下代码片段中使用 pushl
和 popl
时,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 位模式下不可编码: