尽管 MOV 指令不能直接将较小的操作数复制到较大的操作数中,但是程序员可以想办法解决这个问题。假设要将 count(无符号,16 位)传送到 ECX(32 位),可以先将 ECX 设置为 0,然后将 count 传送到 CX:

  .data  count WORD 1  .code  mov ecx,0  mov cx,count

如果对一个有符号整数 -16 进行同样的操作会发生什么呢?

  .data  signedVal SWORD -16      ; FFF0h (-16)  .code  mov ecx,0  mov cx,signedVal         ; ECX = 0000FFF0h(+ 65,52 0)

ECX 中的值(+65 520)与 -16 完全不同。但是,如果先将 ECX 设置为 FFFFFFFFh,然后再把 signedVal 复制到 CX,那么最后的值就是完全正确的:

  mov ecx,0FFFFFFFFh  mov cx,signedVal    ;ECX = FFFFFFF0h(-16)

本例的有效结果是用源操作数的最高位(1)来填充目的操作数 ECX 的高 16 位,这种技术称为符号扩展(sign extension)。当然,不能总是假设源操作数的最高位是 1。幸运的是,Intel 的工程师在设计指令集时已经预见到了这个问题,因此,设置了 MOVZX 和 MOVSX 指令来分别处理无符号整数和有符号整数。

MOVZX 指令

MOVZX 指令(进行全零扩展并传送)将源操作数复制到目的操作数,并把目的操作数 0 扩展到 16 位或 32 位。这条指令只用于无符号整数,有三种不同的形式:

MOVZX reg32,reg/mem8
MOVZX reg32,reg/mem16
MOVZX reg16,reg/mem8

在三种形式中,第一个操作数(寄存器)是目的操作数,第二个操作数是源操作数。注意,源操作数不能是常数。下例将二进制数 1000 1111 进行全零扩展并传送到 AX:

  .data  byteVal BYTE 10001111b  .code  movzx ax,byteVal ;AX = 0000000010001111b

下图展示了如何将源操作数进行全零扩展,并送入 16 位目的操作数。

下面例子的操作数是各种大小的寄存器:

  mov bx, 0A69Bh  movzx eax, bx     ;EAX = 0000A69Bh  movzx edx, bl     ;EDX = 0000009Bh  movzx cx, bl     ;CX = 009Bh

下面例子的源操作数是内存操作数,执行结果是一样的:

  .data  byte1 BYTE  9Bh  word1 WORD 0A69Bh  .code  movzx eax, word1 ;EAX = 0000A69Bh  movzx edx, byte1 ;EDX = 0000009Bh  movzx ex, byte1     ;CX = 009Bh

MOVSX 指令

MOVSX 指令(进行符号扩展并传送)将源操作数内容复制到目的操作数,并把目的操作数符号扩展到 16 位或 32 位。这条指令只用于有符号整数,有三种不同的形式:

MOVSX reg32, reg/mem8
MOVSX reg32, reg/mem16
MOVSX reg16, reg/mem8

操作数进行符号扩展时,在目的操作数的全部扩展位上重复(复制)长度较小操作数的最高位。下面的例子是将二进制数 1000 1111b 进行符号扩展并传送到 AX:

  .data  byteVal BYTE 10001111b  .code  movsx ax,byteVal      ;AX = 1111111110001111b

如下图所示,复制最低 8 位,同时,将源操作数的最高位复制到目的操作数高 8 位的每一位上。

如果一个十六进制常数的最大有效数字大于 7,那么它的最高位等于 1。如下例所示,传送到 BX 的十六进制数值为 A69B,因此,数字“A”就意味着最高位是 1。(A69B 前面的 0 是一种方便的表示法,用于防止汇编器将常数误认为标识符。)

4.1 操作数类型
4.2 MOV指令
4.3 MOVZX和MOVSX指令
4.4 LAHF和SAHF指令
4.5 XCHG指令
4.6 直接偏移量操作数
4.7 汇编语言数据传送示例
4.8 加法和减法详解
4.9 OFFSET运算符
4.10 ALIGN伪指令
4.11 PTR运算符
4.12 TYPE运算符
4.13 LENGTHOF运算符
4.14 LABEL伪指令
4.15 间接寻址
4.16 JMP和LOOP指令
4.17 64位MOV指令
4.18 64位加法和减法

汇编语言MOVZX和MOVSX指令相关推荐

  1. 汇编语言LAHF和SAHF指令

    LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH.被复制的标志位包括:符号标志位.零标志位.辅助进位标志位.奇偶标志位和进位标志位.使用这条指令,可以方便地把标志位副 ...

  2. x86汇编语言mov、movzx、movsx、sizeof、lengthof等指令

    mov指令 语法格式如下 mov dest, source ; 将原操作数移动到目标操作数, 或者说是给目标赋值 ; 标准格式如下 reg代表寄存器, mem代表内存, imm代表立即数 mov re ...

  3. 汇编语言乘法和除法指令

    文章目录 1.乘法指令MUL/IMUL 2.除法指令DIV/IDIV 3.其他运算指令 乘法和除法指令 IA-32 处理器的乘法和除法指令需要区别无符号数和有符号数, 并隐含便用丁 EAX (和EDX ...

  4. 汇编语言学习之基本指令(上)

    汇编语言学习之基本指令(上) 汇编语言对大小写不敏感,所以笔者全部采用大写说明语法规则,实例中采用小写英文 文章目录 汇编语言学习之基本指令(上) 1.数据传送类指令 1.1传送指令MOV 1.2交换 ...

  5. 汇编语言基础--汇编操作指令概述

    本文是接续"汇编语言基础--机器级数据存储",主要介绍汇编指令的构造.寻址和指令主要分类. 操作指令 指令的基本要素:       在"计算机处理器(CPU)基础&quo ...

  6. (十)汇编语言——CALL和RET指令

    (十)汇编语言--CALL和RET指令 文章目录 (十)汇编语言--CALL和RET指令 CALL指令 功能 寄存器 内存 段间转移 返回指令 ret retf 实例 MUL指令 模块化程序设计 寄存 ...

  7. 汇编语言条件跳转指令汇总

    汇编语言条件跳转指令 基于特定标志位值的跳转 助记符 说明 标志位 JZ 为零跳转 ZF=1 JNZ 非零跳转 ZF=0 JC 进位跳转 CF=1 JNC 无进位跳转 CF=0 JO 溢出跳转 OF= ...

  8. 汇编语言debug命令与指令机器码

    汇编语言debug命令与指令机器码 一.debug命令 二.标志信息 -r用这个指令,得到的信息右下角: NV UP EI PL NZ NA PO NC 这些符号代表的就是标志寄存器里常用标志位的值. ...

  9. 汇编MOVSX指令详解

    MOVSX说明:带符号扩展传送指令   符号扩展的意思是,当计算机存储某一个有符号数时,符号位位于该数的第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展MOV ...

最新文章

  1. linux进不了容器配置目录,linux – 在Docker容器中使用bcrypt的ELF头文件或安装问题...
  2. .NET Framework4.5下载地址和安装
  3. Winxp中加密自己的用户目录
  4. SAP Spartacus 的 cx-page-layout selector 介绍 - PageLayoutComponent
  5. 前端学习(2634):修改webstrom颜色
  6. Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
  7. MD5详解(校验文件完整性)
  8. IEEE 浮点数编码规则
  9. html如何将文字生成图片,文字转图片工具,文字图片生成器,把几句话做陈图片
  10. 使用DCMTK实现DICOM文件浏览器dicom explorer
  11. Php中什么时候用单引号,PHP中单引号和双引号的用法举例
  12. 【Opencv】图像分割——区域生长
  13. C语言链表创建的电子通讯录V1.0
  14. 【Java工具类】用于专门匹配手机号与座机号工具类
  15. linux虚拟摄像头 开源,(四) 虚拟摄像头vivi体验
  16. 神经网络第一篇——感受野的学习、计算与思考
  17. 心电电路算法滤波_心电仪滤波
  18. 新买的幻16笔记本不激活的情况下联网使用解决方案(双系统)
  19. 视频压缩怎么弄?建议收藏这些方法
  20. 一次数据库冷备份还原过程

热门文章

  1. sqlite3API函数
  2. centos 关闭防火墙
  3. 谈谈我自己(创业四个多月)
  4. java学习笔记day06---匿名内部类
  5. ubuntu下tftp的安装、配置、使用
  6. vc:如何从Internet上有效而稳定地下载文件
  7. android TextView 的垂直滚动
  8. Python学习笔记:Day 6 配置文件
  9. Python学习笔记:面向对象高级编程(中上)
  10. ”语义分割”中的“语义”