汇编之mov、movsx、movzx

文章目录

      • 详细说明
        • `mov`
        • `movsx`
        • `movzx`
      • 共同点
      • 总结


指令名称 描述 作用 x86 表现 x64 表现 示例
mov 将数据从一个位置复制到另一个位置 直接数据传输 传输数据,不改变数据内容 传输数据,不改变数据内容 mov eax, ebx
movsx 将源操作数符号扩展到目标操作数 有符号扩展数据 将较小数据类型符号扩展到较大数据类型 将较小数据类型符号扩展到较大数据类型 movsx eax, byte ptr [ebx]
movzx 将源操作数零扩展到目标操作数 无符号扩展数据 将较小数据类型零扩展到较大数据类型 将较小数据类型零扩展到较大数据类型 movzx eax, byte ptr [ebx]

详细说明

mov
  • 描述: 将数据从一个位置复制到另一个位置。
  • 作用: 直接传输数据,不改变数据内容。
  • x86 表现:
    • 直接在寄存器、内存和立即数之间传输数据。
    • 常用于数据传输和初始化。
  • x64 表现:
    • 同样直接在寄存器、内存和立即数之间传输数据。
    • 支持64位寄存器操作。
  • 示例:
    mov eax, ebx    ; 将 ebx 中的值复制到 eax
    mov ecx, [edx]  ; 将内存地址 edx 的值复制到 ecx
    mov [edi], al   ; 将 al 中的值复制到内存地址 edi
    
movsx
  • 描述: 将源操作数符号扩展到目标操作数。
  • 作用: 将较小的数据类型符号扩展到较大的数据类型(保留符号位)。
  • x86 表现:
    • 从字节到字、从字到双字等扩展,保持符号位。
    • 常用于将有符号的较小数据类型扩展为较大的数据类型。
  • x64 表现:
    • 从字节到字、从字到双字、从双字到四字等扩展,保持符号位。
    • 支持更多的扩展模式,包括64位扩展。
  • 示例:
    movsx eax, byte ptr [ebx]  ; 将内存地址 ebx 的字节符号扩展到 eax
    movsx ecx, word ptr [edx]  ; 将内存地址 edx 的字符号扩展到 ecx
    
movzx
  • 描述: 将源操作数零扩展到目标操作数。
  • 作用: 将较小的数据类型零扩展到较大的数据类型(高位填0)。
  • x86 表现:
    • 从字节到字、从字到双字等扩展,高位填0。
    • 常用于将无符号的较小数据类型扩展为较大的数据类型。
  • x64 表现:
    • 从字节到字、从字到双字、从双字到四字等扩展,高位填0。
    • 支持更多的扩展模式,包括64位扩展。
  • 示例:
    movzx eax, byte ptr [ebx]  ; 将内存地址 ebx 的字节零扩展到 eax
    movzx ecx, word ptr [edx]  ; 将内存地址 edx 的字零扩展到 ecx
    

共同点

  • 基本功能: 都是用于数据传输和扩展,但具体用途不同。
  • 适用范围: 可在寄存器与内存之间传输数据,在操作数之间进行扩展。

总结

指令名称 描述 作用 x86 表现 x64 表现 示例
mov 将数据从一个位置复制到另一个位置 直接数据传输 传输数据,不改变数据内容 传输数据,不改变数据内容 mov eax, ebx
movsx 将源操作数符号扩展到目标操作数 有符号扩展数据 将较小数据类型符号扩展到较大数据类型 将较小数据类型符号扩展到较大数据类型 movsx eax, byte ptr [ebx]
movzx 将源操作数零扩展到目标操作数 无符号扩展数据 将较小数据类型零扩展到较大数据类型 将较小数据类型零扩展到较大数据类型 movzx eax, byte ptr [ebx]

通过 movmovsxmovzx 指令的详细比较,它们在 x86 和 x64 架构下的表现基本一致,但在 x64 下支持更大的数据类型扩展。每个指令都有其特定的作用和适用场景,在编写和优化汇编代码时应根据具体需求选择合适的指令。

你可能感兴趣的:(汇编,经验分享)