movsx-movzx(转)

来源:互联网 发布:欧文总决赛第七战数据 编辑:程序博客网 时间:2024/05/12 21:54

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

0 0
原创粉丝点击