汇编语言符号扩展指令及应用示例

【汇编语言】乘法(MUL/IMUL) 乘法(MUL/IMUL) 目录乘法(MUL/IMUL)`IMUL`(signed multiply)有符号数乘法`MUL`(unsigned multiply)无符号数乘法 麻!属实是被这个有符号乘法给整麻了,教材就一行例子直接不解释了,关于标志位溢出的一概不谈,屁用没有。然后去网上查了查好像说明白了但又没完全明白,以至于我刚刚才明白 先说这有符号乘法! IMUL(signed multiply)有符号数乘法 格式:MUL SRC 操作: 当操作数为字节时,(AX)←(AL)×(SRC)(AX)\ge 阅读详情

1. 什么是符号扩展?为什么要用符号扩展?

       所谓符号扩展,就是将数据的表示大小加倍,数值仍保持不变,即将符号位扩展到同样大小的寄存器空间中去,由两部分构成一个比原值表示大一倍的数。正数必须要0扩展,负数必须用1扩展。

为什么要进行符号扩展呢?这是因为有些指令对操作数位数的要求,例如倍长于除数的被除数,再如将数据位数加长以减少计算过程中的误差。另外,除法运算中规定

除数是BYTE,被除数存于AX,商存放在AL,余数放在AH

除数是WORD,被除数存于DX:AX,商存放在AX,余数放在DX

除数是DWORD,被除数存于EDX:EAX,商存放在EAX,余数放在EDX

被除数总是除数和商的两倍大小,由于余数的符号取决于被除数的符号,计算之后的余数存放在AH,DX,或者EDX中,那么执行除法之前,先将被除数的符号扩展到余数存放寄存器中,这也要求符号扩展。

        事实上,在汇编语言里面,有符号数与无符号数计算,很多地方都分成了两套指令,进位与符号操作,都交由程序员来判断和操作,符号扩展正是这一设计思想的体现。

2. 符号扩展指令及应用示例

2.1  CBW(Convert Byte to Word):

规定将AL中的符号扩展到AX中,这是规定死的,执行这个指令就将AL中的符号扩展到AX中了。通过符号扩展,将AL的操作数大小扩大1倍,字节表示的数用字表示,将结果存入AX中。将AL中的符号位第7位,复制到AH中的每一位。例如

XOR EAX,EAX

MOV AL,-128

此时EAX=0x80二进制10000000

CBW

此时EAX=0xFF80进制11111111 10000000符号位1,高8位用符号位1全部填充。

2.2  CWD(Convert Word to Doubleword):

规定将AX中的符号扩展到DX中,执行这个指令就将AX中的符号扩展到DX中了,那为什么不直接将AX中的符号扩展到EAX中,而要那么麻烦地扩展到DX中,再用DX:AX来表示一个有符号数呢,例如,后面的CWDE就是这么干的?估计是在符号扩展指令出来时,还没有32位机,如8086就是16位cpu,也就没有EAX寄存器,只能用两个16位寄存器来表示32位数了,后续32位为了兼容16位时写的程序,也就保留了这种操作方法。另外用于在有符号除法运算中,AX存放商,DX存放余数,不将符号扩展到DX中,IDIV指令是不会将负号自动填进去的,会使计算结果不正确。

通过符号扩展,将AX中的操作数大小扩大1倍,字表示的数用双字表示,将结果存入DX:AX中,用两个字寄存器存储1个双字的数。例如

XOR EAX,EAX

XOR EDX,EDX

MOV AX,-32768

此时AX=0x8000二进制10000000 00000000

CWD

此时AX=0x8000进制10000000 00000000符号位1,而DX=0xFFFF,即符号位1被填充到了DX。

2.3  CDQ(Convert Doubleword to Quadword):

规定将EAX中的符号扩展到EDX中,执行这个指令就将EAX中的符号扩展到EDX中了。同样,当两个32位有符号数相乘时,符号位就超出了32位表示的范围,像前一样,用两个寄存器EDX:EAX来表示这个乘法的结果,从而得到正确的计算结果。同理,64位出现后,为了兼容32位的程序,也保留了这种操作。同样,在有符号除法运算中,EAX存放商,EDX存放余数,不将符号扩展到EDX中,IDIV指令是不会将负号自动填进去的,会使计算结果不正确。通过符号扩展,将EAX中的操作数大小扩大1倍,双字表示的数用四字表示,将结果存入EDX:EAX中,用两个双字寄存器存储1个四字的数。例如

XOR EAX,EAX

XOR EDX,EDX

MOV EAX, -2147483648

此时EAX=0x8000 0000二进制10000000 00000000 00000000 00000000

CWD

此时EAX=0x80000000进制10000000 00000000 00000000 000000000符号位1,而EDX=0xFFFFFFFF,即符号位1被填充到了EDX。

2.4  CQO(Convert Quadword to )

     规定将RAX中的符号扩展到RDX中去,这是64位cpu模式下使用的指令。用以表示128位的数据,因为两个64位数操乘法运算超过64位的范围,采用以上的表示方法。同样,在有符号除法运算中,RAX存放商,RDX存放余数,不将符号扩展到RDX中,IDIV指令是不会将负号自动填进去的,会使计算结果不正确。通过符号扩展,将RAX中的操作数大小扩大1倍,四字表示的数用八字表示,将结果存入RDX:RAX中,用两个四字寄存器存储1个八字的数。例如

XOR RAX,RAX

XOR RDX,RDX

MOV RAX, -9223372036854775808

此时RAX=0x8000000000000000二进制

1000000000000000000000000000000000000000000000000000000000000000

CQO

此时RAX=0x8000000000000000 符号位1,而RDX=0xFFFFFFFFFFFFFFFF,即符号位1被填充到了RDX。

2.5  CWDE(Convert Word to Doubleword):

这个E(Extension)应该是指相对于CWD的扩展,是稍后面加的指令,CWD指令出现的时间比CWD早。规定将AX中的符号扩展到EAX中,执行这个指令就将AX中的符号扩展到EAX中了。

CWDE同CWD,只是符号位是直扩展到EAX的高16位中了。

2.6  CDQE(Convert Doubleword to Quadword):

    这个E(Extension)应该是指相对于CWQ的扩展,同样,CWD指令出现的时间比CDQE早。

规定将EAX中的符号扩展到RAX中,执行这个指令就将EAX中的符号扩展到RAX中了。

    CDQE同CDQ,符号被扩展到RAX的高32位中了。

2.7 MOVZX指令将源操作数的内容复制到目的操作数中,并将该值零扩展至16位或32位。该指令仅适用于无符号整数。

为什么要有这个指令呢,因为MOV指令不能将一个较小的操作数复制到一个较大的操作数。

类为MOV指令要求两个操作数必须一样大。比如将一个较小的操作数在寄存上执行MOV操作,则寄存器的高位没有被覆盖,这个时候我们取整个寄存器值作为MOV的结果是不对的,例如

data1 BYTE 1

data2 WORD ?

XOR EAX,EAX

MOV AX,0FFFFH

MOV AL,data1

MOV data2,AX

这个时候,data2变成了FF01,而不是1。要得到正确的结果,可以有多种方法

比如,先将高位清零

XOR EAX,EAX

MOV AL,data1

MOV data2,AX

这样data2=1了

或者就直接使用这个指令

MOV AX,0FFFFH

MOVZX AX,data1

MOV data2,AX

2.8 MOVSX指令将源操作数的内容复制到目的操作数中,并将该值符号扩展至16位或32位。该指令仅适用于有符号整数。例如

data1 SBYTE -1

data2 SWORD ?

XOR RAX,RAX

MOV AL,data1

MOV data2,AX

这个时候,data2的值为255了,而不是-1,也就是MOV并没有把FF当成有符号数,而是当作值了,那么用MOVSZ就不一样了。

XOR RAX,RAX

MOVSX AX,data1

MOV data2,AX

这个时候data2=-1,是正确的结果。

【汇编优化系列】关于符号扩展和无符号扩展(包括mips msa实现) DATE: 2021.11.26 文章目录前言1、参考2、符号扩展和无符号扩展 含义3、举例说明4、mips msa相关指令 前言 1、参考 符号扩展和无符号扩展 extension 2、符号扩展和无符号扩展 含义 MIPS32 指令集架构中,经常会有指令需要将其中的立即数进行符号扩展,或者无符号扩展,一般都是都是将n位立即数扩展为32位。 无符号扩展:直接将扩展后的数据的高(32-n)位置为0。 符号扩展:将扩展后的数据的高(32-n)位置为立即数的最高位。 An integer register 阅读详情

相关推荐

31、汇编语言中的乘法与除法操作详解

本文详细介绍了汇编语言中的乘法和除法操作,包括有符号乘法指令 imul 和无符号乘法指令 mul 的使用方式,以及有符号除法指令 idiv 和无符号除法指令 div 的区别。通过 decToUInt 函数的实现,展示了如何将十进制字符串转换为无符号整数,并讨论了其逆操作 intToUDec 函数的除法实现。文章还给出了如何编写带符号数转换函数 decToSInt 以及不使用乘法指令的 decToUInt 修改版本,通过移位和加法实现乘法操作。最后总结了乘法和除法操作的注意事项,并提供了实践建议。

omega的博客 160

符号扩展,零扩展与符号缩减

1. 符号位扩展,零扩展,符号位缩减1.1 符号位扩展高级程序设计语言允许程序员使用包含不同大小整数的对象表达式。那么,当一个表达式的两个操作数大小不同时,有些语言会报错,有些语言则会自动将操作数转换成一个统一的格式。这种转换是有代价的,因此如果你不希望编译器在你不知情的情况下自动加入各种转换到原本非常完美的代码中,你就需要掌握编译器如何处理这些表达式。以-64为例,其8位的二进制补码(1100 0

yjk13703623757的博客 1万+

26、汇编语言中的过程与算术运算

本文详细介绍了汇编语言编程中的核心概念,包括过程调用、参数传递、算术运算、符号扩展、寄存器保存与恢复等内容。深入探讨了x86-64架构下的过程指针使用方式、微软ABI规则、栈对齐要求以及递归调用实现等关键知识点。文章还提供了实际代码示例和操作步骤,帮助读者更好地理解和应用汇编语言编程技巧。

j2k3l4的博客 66

符号扩展

符号扩展是指计算机对于小字节转换成大字节的规则。 比如char(1字节)转换成int(4字节),多出来的3个字节到底填充什么? 规则如下: 当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0,即全填充0。 上面那句话的本意是指: 负数扩展后,还是负数,且值不变;正数扩展后还是正数,值不变。 看似简单的一句话,可常在面试中让人困惑不已 ...

Think88666的博客 2万+

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1204

智能循迹小车之PID控制算法

从光电传感器获取信号确认小车和黑线的偏离角度,通过PID算法算出左右车轮速度,控制小车前进或者后退。

yzj199921的博客 4641

计算机组成原理 符号扩展

时刻谨记:扩展是为了方便机器对齐进行相加计算,所以填充不会改变本身的数值。当8位的整数与32位的整数相加时,就要将8位的整数扩展成32位。对于补码表示的小数(原码也同理),在进行扩展时,用0在后面填充。正数的扩展无论是什么编码表示通通符号位不变,用0填充进行扩展。原码0101扩展4位后为00000101,数值还是5。负数的扩展则根据不同的编码表示各不相同。例子:0,101 → 0,000101。补码=原码:1.0110000。原码:1,0000011。反码:1,1111011。补码:1,1111011。

CCTt_314的博客 2895

Windows 下安装 ros2 的超详细教程

Windows11 ROS安装

2401_83363439的博客 3323

符号扩展(Sign Extension)

符号扩展(Sign Extension)是计算机组成原理中的一个概念,它的作用是将一个较小的数据字长扩展到一个较大的数据字长,同时保持原有的数值和符号。当对一个有符号的整数进行符号扩展时,扩展的位(即新增的位)将复制原始数值的最高位(符号位)。,以确保扩展后的数值保持不变。因此,扩展后的数值将是。(以补码形式),它代表了一个。

qq_36396406的博客 3635

Win11下WSL2安装Ubuntu22.04避坑指南:从镜像源到C++环境配置

本文提供了一份详细的Win11下WSL2安装Ubuntu22.04的实战避坑指南。内容涵盖从WSL2核心安装、自定义安装路径,到更换国内镜像源以解决更新缓慢问题,并一站式配置完整的C++开发环境(包括GCC、CMake、vcpkg等),最后分享提升开发体验的进阶技巧,助你在Windows上打造高效的Linux开发工作站。

weixin_29260291的博客 563

Kali Linux下John the Ripper实战:从识别yescrypt哈希到破解zip压缩包(保姆级避坑指南)

本文详细介绍了在Kali Linux中使用John the Ripper工具从识别yescrypt哈希到破解zip压缩包的全过程。针对常见的'No password hashes loaded'报错,提供了两种解决方案,并扩展讲解了哈希识别、zip文件破解及性能优化技巧,是安全测试人员的实用指南。

weixin_29323365的博客 238

AT&T 符号扩展和零扩展

转自:https://my.oschina.net/guonaihong/blog/506102 mov指令的作用:     mov指令可能是汇编里用的最多的指令了,完成c语言里的赋值。 mov指令种类: 1.普通的mov指令 2.做符号扩展的movs 3.做零扩展的movz 1.普通mov的种类有: movb #完成1个字节的复制 movw #完成2个字节的复制 movl #完成4个

皓月的博客 2179

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

汇编指令(二.2) 算数运算类指令之乘除法

一、乘法指令 1.无符号数乘法指令MUL 2.有符号数乘法指令IMUL 例 (AX)=0001H (CX)=00FFH MUL CL //无符号数的8位相乘 01H*FFH -> (AX)=00FFH MUL CX //无符号数的16位相乘 0001H*00FFH 变成32位数据 = 0000 00FFH 前八位放在16位放在DXA里边,后16位放在AX里边 及(DX:AX)=0000 00FFH 有符号数的计算类似于上 二、除法指令 1.无符号数DIV 2.有符号数IDIV 例

weirdo_cy的博客 2764

基于STM32设计的老人防摔倒报警设备(OneNet)_65

本文设计了一种基于STM32单片机的智能老人防摔倒报警设备。该系统结合MPU6050陀螺仪传感器实时监测老人的姿态变化,检测摔倒事件;通过SIM800C通信模块发送短信通知紧急联系人,并将GPS定位信息上传至云端平台,确保家属能够及时了解老人的准确位置。

1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汇编语言:基于x86处理器考前笔记 | 第七章 整数运算

算术右移时,负数最高位补1,正数补0。

everfoot的博客 1095

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

十进制转二进制和十六进制 条件码标志和乘法指令

十进制转二进制和十六进制

m0_51787573的博客 2988

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汇编2.9

汇编部分上机知识总结

qq_63697450的博客 488

汇编语言---乘法指令及符号扩展

汇编语言---有符号数乘法指令介绍无符号数乘法指令 介绍 乘法指令分为无符号数乘法指令和有符号数乘法指令两种,它们唯一的区别是相乘的两个操作数是有符号数据还是无符号数据。 乘法指令的被乘数是隐含操作数,乘数需在指令中显式写出来。执行指令时,CPU会根据乘数是8位还是16位来自动选用被乘数是AL还是AX。 无符号数乘法指令 指令格式:MUL opr 功能:将指令中指定的操作数与隐含的被乘数(都为无符号数)相乘,所得的乘积按表中的对应关系存放。 乘数位数 隐含的被乘数 乘积的存放位置 举例 8位

6944

汇编语言-011(无符号乘法指令MUL、有符号乘法指令IMUL、对比MUL乘法指令与SHL移位方式、符号位扩展指令,CBW,CWD,CDQ、DIV 无符号除法指令、IDIV 有符号除法指令)

1:无符号乘法指令MUL .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data val1 WORD 2000h val2 WORD 0100h .code main PROC ;8位乘法 mov al,5h ;被乘数 mov bl,10h mul bl ;AX = 0050h ,CF,OF = 0 ;16位乘法 mov ax,val1 mul

万事亨通 1731

汇编语言指令大全

1、     MOV(传送) 指令写法:MOV  target,source 功能描述:将源操作数source的值复制到target中去,source值不变 注意事项:1)target不能是CS(代码段寄存器),我的理解是代码段不可写,只可读,所以相应这地方也不能对CS执行复制操作。2)target和source不能同时为内存数、段寄存器(CS\DS\ES\SS\FS\GS)3)

wujiafei_njgcxy的博客 7692

汇编语言MOVZX和MOVSX指令

尽管 MOV 指令不能直接将较小的操作数复制到较大的操作数中,但是程序员可以想办法解决这个问题。假设要将 count(无符号,16 位)传送到 ECX(32 位),可以先将 ECX 设置为 0,然后将 count 传送到 CX: .data count WORD 1 .code mov ecx,0 mov cx,count 如果对一个有符号整数 -16 进行同样的操作会发生...

Java入门基础教程 2649

无符号数 有符号数强转_汇编语言乘法指令及符号扩展

介绍乘法指令分为无符号数乘法指令和有符号数乘法指令两种,它们唯一的区别是相乘的两个操作数是有符号数据还是无符号数据。乘法指令的被乘数是隐含操作数,乘数需在指令中显式写出来。执行指令时,CPU会根据乘数是8位还是16位来自动选用被乘数是AL还是AX。格式及功能介绍无符号数乘法指令指令格式:MUL opr功能:将指令中指定的操作数与隐含的被乘数(都为无符号数)相乘,所得的乘积按表中的对应关系...

weixin_39595310的博客 911

ARM汇编语言指令集汇总

ARM汇编语言指令集汇总跳转指令存储器和寄存器交互数据指令(内存访问)数据传送指令数据算术运算指令数据逻辑运算指令比较指令组合和分离指令并行指令测试指令ThumbEE指令协处理器指令伪指令无线 MMX 技术伪指令其他指令寄存器寻址方式 跳转指令 指令 简介 B 无条件跳转 BL 带链接的无条件跳转 BX 带状态跳转,更改指令集 BLX 带链接和状态切换的无条件跳转,更改指令集 BXJ 跳转,更改为 Jazelle TBB , TBH 表跳转字节、半字 存储器和寄存器交

李玺 4927

汇编语言乘法和除法指令

乘法和除法指令 IA-32 处理器的乘法和除法指令需要区别无符号数和有符号数, 并隐含便用丁 EAX (和EDX) 寄存器。 1.乘法指令MUL/IMUL 基本的乘法指令指出源操作数 reg/mem (寄存器或存储单元), 隐含使用目的操作数,表3。若源操作数是8位数8/m8,AL与其相乘得到16位积,存入AX中,若源操作数是 16 位数 r16/m16, AX 与其相乘得到 32 位积, 高 1...

Clown_pan的博客 2万+
上一篇: 汇编语言列表文件说明(MASM宏汇编器)
下一篇: 什么是操作系统中所说的原语(Primitives)
ComputerInBook
博客等级 码龄19年 1168粉丝 465原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值