汇编语言---乘法指令及符号扩展
汇编语言---有符号数乘法指令
- 介绍
- 格式及功能介绍
- 无符号数乘法指令
- 有符号数乘法指令
- 符号扩展及符号扩展语句
- 符号扩展
- 符号扩展语句
- 例子
- 无符号相乘
- 有符号数相乘
- 这是本文的重点:
- 有符号数相乘 例子:-3*3
- 题中数据计算
- 后续
介绍
乘法指令分为无符号数乘法指令和有符号数乘法指令两种,它们唯一的区别是相乘的两个操作数是有符号数据还是无符号数据。
乘法指令的被乘数是隐含操作数,乘数需在指令中显式写出来。执行指令时,CPU会根据乘数是8位还是16位来自动选用被乘数是AL还是AX。
格式及功能介绍
无符号数乘法指令
指令格式:MUL opr
功能:将指令中指定的操作数与隐含的被乘数(都为无符号数)相乘,所得的乘积按表中的对应关系存放。
乘数位数 | 隐含的被乘数 | 乘积的存放位置 | 举例 |
---|---|---|---|
8位 | AL | AX中 | MUL BL |
16位 | AX | DX与AX中 | MUL BX |
MUL指令对标志位CF、OF有影响,对SF、ZF、AF、PF 无定义,如果运算结果的高一半(AH,DX)为零,则CF=OF=0,否则CF=OF=1。
注:
- 对标志位的“无定义”和“不影响”不同。无定义是指指令执行后,标志位的状态不确定;不影响是指指令的结果不影响标志位。即标志位保持原状态不变。
- MUL指令中的操作数可以使用除立即数以外的其他寻址方式,但当是寄存器时,操作器只能是通用寄存器。
有符号数乘法指令
指令格式:IMUL opr
IMUL指令的格式和功能与MUL相同,只是要求两个操作数都须为有符号数。
IMUL指令对标志位的影响为:若乘积的高半部分是低半部分的符号位扩展,则OF=CF=0;否则OF=CF=1;
注:IMUL指令中对操作数的寻址的方式规定同MUL指令,但表示形式为补码,乘积也是以补码形式表示的数。
符号扩展及符号扩展语句
符号扩展
微机系统中,有时需要将一个数据从位数较少扩展到位数较多,例如,在执行除法指令时,由于对字节除数相除要求被除数为16位,对字除数要求被除数为32位,即被除数必须为除数的倍长数据,因此就涉及数据的位数扩展问题,具体的扩展有符号扩展与零扩展两种方法。
- 当要扩展的数据是无符号数时可采用零扩展。即在最高位前扩展0,补充够位数即可。
- 当要扩展的数据是有符号数时需采用符号扩展。由于采用补码形式表示的整数具有固定的长度,因此在汇编指令系统中,经常有一些指令需要将其中的操作数进行符号位扩展。譬如两个8位或16位数据进行相加或者相减运算时,当有不足位数要求的数据时,需要将少位数据扩展成与位数要求相一致的数据;两个数据相除时,被除数应必须是除数的倍数等。
符号扩展的方法是将需要扩展的数据的符号位填入到扩展的每一位,以保持其作为有符号数的值的大小不变。这里要注意,要扩展的数须是用补码形式表示的有符号数,符号扩展后。其结果仍是该数的补码。
因此,对于补码表示的数,其正数的符号扩展是将其符号位0向左扩展(补0);其负数的符号扩展是将其符号位1向左扩展(补1)。
符号扩展语句
- 字节扩展为字指令CBW
指令格式:CBW
功能:该指令的隐含操作数为AH和AL,功能是用AL的符号位去填充AH,即若AL为正数,则AH=00H;否则AH=FFH。 - 字扩展为双字指令CWD
指令格式:CWD
功能:该指令的隐含操作数为DX和AX,功能是用AX的符号位填充DX,即若AX为正数,则DX=0000H;否则DX=FFFFH。
以上两条指令的执行都不影响任何标志位。
例子
无符号相乘
MOV AL,0B4H ;AL=B4H=180
MOV BL,11H ;BL=11H=17
MUL BL ;AX=0BF4H=3060,高8位0BH不为0,OF=CF=1
可以看出来,无符号数相乘就是直接相乘即可。
有符号数相乘
MOV AL,0B4H ;AL=B4H=-76
MOV BL,11H ;BL=11H=17
IMUL BL ;AX=FAF4H=-1292,高8位FAH不是低半部分的符号位扩展,OF=CF=1
这是本文的重点:
有符号数相乘,需要进行符号位扩展,符号位扩展详情在上面已经介绍过了。
有符号相乘的步骤:
- 符号位扩展(负数前面补1,正数补0)
- 扩展后的数据两式相乘
- 求补(计算机中存放的是补码)
- 取有效位,比如3位数据相乘,得到的结果取有效位6位即可。
有符号数相乘 例子:-3*3
- 在计算机中存放的时二进制数据补码,所以本例中应为101乘011
- 符号位扩展后
111101 X 000011
=10110111 - 取有效位6位
110111 - 求补
101001
可以计算出是-9,结果正确
题中数据计算
- 10110100
X 00010001 - 1111 1111 1011 0100
X 0000 0000 0001 0001 - 1111101011110100
- FAF4
后续
如果想了解更多物联网、智能家居项目知识,可以关注我的项目实战专栏。
欢迎关注公众号。
编写不易,感谢支持。
汇编语言---乘法指令及符号扩展相关推荐
- 汇编语言符号扩展指令及应用示例
1. 什么是符号扩展?为什么要用符号扩展? 所谓符号扩展,就是将数据的表示大小加倍,数值仍保持不变,即将符号位扩展到同样大小的寄存器空间中去,由两部分构成一个比原值表示大一倍的数.正数必须要0扩展,负 ...
- 汇编语言-013(DAS 、DAA与DAS、QWORD类型用SBB借位减法、编写指令将AX符号扩展到EAX,不能使用CWD、用SHR和条件判断指令将AL循环右移一位、SHLD、压缩十进制转换)
1:DAS : SUB或SBB在AL中生成二进制结果,DAS(减法后的十进制调整)转压缩十进制格式 .386 .model flat,stdcall.stack 4096 ExitProcess PR ...
- 汇编语言乘法和除法指令
文章目录 1.乘法指令MUL/IMUL 2.除法指令DIV/IDIV 3.其他运算指令 乘法和除法指令 IA-32 处理器的乘法和除法指令需要区别无符号数和有符号数, 并隐含便用丁 EAX (和EDX ...
- 汇编语言 乘法和除法指令
除法指令 DVI无符号数除法指令 指令格式:DIV 源 指令功能:对两个无符号二进制数进行除法操作.源操作数可以是字或字节. 如果源操作数为字节,16位被除数必须放在AX中,8位除数为源操作数,它可以 ...
- 无符号有符号乘法_刘帅嵌入式系统-乘法指令
ARM有两类乘法指令:一类为32位的乘法指令,即乘法操作的结果为32位:另一类为64位的乘法指令,即乘法操作的结果为64位.两类指令共有以下6条. MUL:32位乘法指令 MLA:32位带加数的乘法指 ...
- 汇编总结:无符号除法,有符号除法,取余,无符号乘法,有符号乘法指令
2019独角兽企业重金招聘Python工程师标准>>> 本文分为3个模块. 示例---该指令的示例 解释---为指令不好理解的地方 练习---为了更熟悉该指令 1.1 有符号除法指令 ...
- 学习笔记(符号扩展指令:SXTB和SXTH)
前言 这些笔记主要是记录自己在学习CM3汇编中的一些问题(因为我们老师上stm32的嵌入式课是从基础汇编开始讲的,CM3汇编在网上能查到的例子讲解有点少,哭!),其中可能借鉴过网上一些大佬的文章,如果 ...
- matlab符号函数的除法,汇编语言IDICV指令:有符号数除法
有符号除法几乎与无符号除法相同,只有一个重要的区别:在执行除法之前,必须对被除数进行符号扩展. 符号扩展是指将一个数的最高位复制到包含该数的变量或寄存器的所有高位中.为了说明为何有此必要,让我们先不这 ...
- mul matlab,汇编语言MUL指令:无符号数乘法
32 位模式下,MUL(无符号数乘法)指令有三种类型: 第一种执行 8 位操作数与 AL 寄存器的乘法: 第二种执行 16 位操作数与 AX 寄存器的乘法: 第三种执行 32 位操作数与 EAX 寄存 ...
最新文章
- 为什么 在内存中为什么 0xffff 是 -1
- 无线网sdn服务器,什么是SDN,SDN网络与传统网络对比
- [Jarvis OJ - PWN]——[XMAN]level4
- axios 参数为payload的解决方法
- sqlserver实现分页的几种方式
- SecureCRT 设置护眼最佳方案 的字体及颜色
- Djaongo 中间件
- MySQL-5.6.x二进制版本安装记录
- ASP.NET Core 自动检查编译项目组件配置
- 【Java方法】从方法中返回多个值
- promehteus 监控超时_使用 Prometheus Operator 监控 Kubernetes Etcd
- CAXA中添加气动液压元件库方法
- 常微分二阶线性齐次微分方程的通解推导
- 微信小程序PNG图片去白底
- docker、containerd、runc、shim... 容器技术名词全解析
- Unity 实现2D地面挖洞!涂抹地形(碰撞部分,方法一)
- imprinted weights
- 固定贴片电阻器封装尺寸
- android 连接不上手机,安卓手机连接不上电脑怎么办
- 【转载】面试题:面向对象的特征和基本特征有哪些 之抽象