x86-64 汇编算术指令详解
1. 扩展指令
1.1 符号扩展与零扩展
在 x86 - 64 架构中,当将 32 位操作数符号扩展到 64 位寄存器时,MASM 要求使用不同的指令助记符,即 movsxd 而非 movsx 。而零扩展可以使用 movzx 指令,只要目标操作数大于源操作数,该指令就能正常工作,支持 8 位到 16 位、32 位或 64 位,以及 16 位到 32 位或 64 位的扩展,但不存在 32 位到 64 位的版本,因为这其实是不必要的。
x86 - 64 CPU 由于历史原因,在执行 32 位操作时会自动将 32 位寄存器零扩展到 64 位。例如,使用 mov eax, eax 可以将 EAX 零扩展到 RAX。
对于某些 8 位寄存器(AL、BL、CL 和 DL)扩展到对应的 16 位寄存器,可通过将互补的 HO 寄存器(AH、BH、CH 或 DH)置为 0 来实现,无需使用 movzx 。要将 AX 零扩展到 DX:AX 或将 EAX 零扩展到 EDX:EAX,只需将 DX 或 EDX 置为 0。不过,由于指令编码的限制,x86 - 64 不允许将 AH、BH、CH 或 DH 寄存器零扩展或符号扩展到任何 64 位寄存器。
1.2 扩展操作步骤总结
- 32 位到 64 位零扩展 :使用
mov eax, eax(以 EAX 到 RAX 为例)。
超级会员免费看
订阅专栏 解锁全文
34

被折叠的 条评论
为什么被折叠?



