2.5.2.3 符号扩展与零扩展指令
2012-09-29 14:12:46 我来说两句 收藏 我要投稿
本文所属图书 > x86/x64体系探索及编程
本书是对Intel手册所述处理器架构的探索和论证。全书共五大部分,从多个方面对处理器架构相关的知识进行了梳理介绍。书中每个章节都有相应的测试实验,所运行的实验例子都可以在真实的机器上执行。通过阅读本书,… 立即去当当网订购
sign-extend(符号扩展)传送指令有两大类:movsx系列和cbw系列。
在movsx指令里8位的寄存器和内存操作数可以符号扩展到16位、32位及64位寄存器。而16位的寄存器和内存操作数可以符号扩展到32位和64位的寄存器。
movsxd指令将32位的寄存器和内存操作数符号扩展到64位的寄存器,形成了x64体系的全系列符号扩展指令集。
cbw指令族实现了对al/ax/eax/rax寄存器的符号扩展。而cwd指令族将符号扩展到了dx/edx/rdx寄存器上。
int a; /* signed DWORD size */
short b; /* signed WORD size */
a = b; /* sign-extend */
像上面这样的代码,编译器会使用movsx指令进行符号扩展。
movsx eax, word ptr [b] ; WORD sign-extend to DWORD
mov [a], eax
zero-extend(零扩展)传送指令movzx在规格上和符号扩展movsx是一样的。
mov ax, 0xb06a
movsx ebx, ax ; ebx = 0xffffb06a
movzx ebx, ax ; ebx = 0x0000b06a