汇编语言乘法和除法指令
文章目录
- 1.乘法指令MUL/IMUL
- 2.除法指令DIV/IDIV
- 3.其他运算指令
乘法和除法指令
IA-32 处理器的乘法和除法指令需要区别无符号数和有符号数, 并隐含便用丁 EAX (和EDX) 寄存器。
1.乘法指令MUL/IMUL
基本的乘法指令指出源操作数 reg/mem (寄存器或存储单元), 隐含使用目的操作数,表3。若源操作数是8位数8/m8,AL与其相乘得到16位积,存入AX中,若源操作数是 16 位数 r16/m16, AX 与其相乘得到 32 位积, 高 16 位存人 DX, 低 16 位存入AX中; 若源操作数是32位数r32/m32,EAX与其相乘得到64位积,高32位存人EDX,低32位存人EAX中。
表1
乘法 (multiplication) 指令分成无符号数乘法指令 MUL和有符号数乘法指令 IMUL。 同一个二进制编码表示无符号数和有符号数时, 真值可能不同。
例如,用MUL进行8位无符号乘法运算:
mov al,0a5h;ALA5H,作为无符号整数编码,表示真值:165
mov bl,64h;BL=64H,作为无符号整数编码,表示真值:100
mul bl;无符号乘法:AX=4074H,表示真值:16500
再如, 用IMUL进行8位有符号乘法运算:
mov al,0a5h;AL=A5H,作为有符号整数补码,表示真值:-91
mov bl,64h;BL=64H,作为有符号整数补码,表示真值:100
imul bl;有符号乘法:AX=DC74H,表示真值:-9100
所以, 对二进制数乘法: A5H x64H, 如果把它们当作无符号数, 用 MUL指令的结果为4074H, 表示真值:16500。 如果采用IMUL指令, 则结果为DC74H, 表示真值: -9100。
注意 加减指令只进行无符号数运算,程序员利用CF和OF区别结果。
基本的乘法指令按如下规则影响标志OF和CF: 若乘积的高一半是低一半的符号位扩展, 说明高一半不含有效数值, 则OF=CF=0; 若乘积的高一半有效, 则用OF=CF=1 表示。 设置OF和CF标志的原因, 是有时我们需要知道高一半是否可以被忽略, 即不影响结果。
但是, 乘法指令对其他状态标志没有定义, 即任意、 不可预测。 注意, 这一点与数据传送类指令对标志没有影响是不同的, 没有影响是指不改变原来的状态。
从80186开始, 有符号数乘法又提供了两种新形式, 如表1后两行所示。 这些新增的乘法形式的目的操作数和源操作数的长度相同 (用于支持高级语言中类型一致的乘法运算), 因此乘积有可能溢出。 如果积溢出, 那么高位部分被丢掉, 并设置CF=OF=1; 如果没有溢出, 则CF-OF=0。 后一种形式采用了3个操作数, 其中一个乘数用立即数表达。
由于存放积的目的操作数长度与乘数的长度相同, 而有符号数和无符号数的乘积的低位部
分是相同的, 所以 , 这种新形式的乘法指令对有符号数和无符号数的处理是相同的。
2.除法指令DIV/IDIV
除法指令给出源操作数 reg/mem (寄存器或存储单元), 隐含使用目的操作数, 如表2
所示。
与乘法指令类似, 除法 (division) 指令也隐含使用 EAX (和 EDX), 并且被除数的位数要
倍长于除数的位数。 除法指令也分成无符号除法指令 DIV 和有符号除法指令IDIV。 有符号除法时, 余数的符号与被除数的符号相同。 对同一个二进制编码, 分别采用 DIV 和 IDIV 指令后, 商和余数也会不同。
例如,用DIV进行8位无符号除法运算:
mov ax,400h;AX=400H,作为无符号整数编码,表示真值:1024 X2M0
mov bl,0b4h:BL=B4H,作为无符号整数编码,表示真值:180
div bl:无符号除法:商AL=05H,余数:AH=7CH(真值:124)
;表示计算结果:5x180+124=1024
再如, 用IDIV 进行8位有符号除法运算:
mov ax,400h;AX=400H,作为有符号整数补码,表示真值:1024
mov bl,0b4h;BL=B4H,作为有符号整数补码,表示真值:-76
idiv bl;有符号除法:商AL=F3H(真值:-13),余数:AH=24H(真值:36)
;表示计算结果:(-13)x(-76)+36=1024
除法指令使状态标志没有定义, 但是却可能产生除法溢出。 除数为0或者商超出了所能表达的范围, 则发生除法溢出。 用DIV指令进行无符号数除法, 商所能表达的范围是: 字节量除时为0-255,字量除时为0~65535,双字量除时为0-232-1。用IDIV指令进行有符号数除法,
商所能表达的范围是:字节量除时为-128127,字量除时为-3276832767,双字量除时
为-231~232 -1。 如果发生除法溢出,IA-32处理器将产生编号为0的内部中断。实际应用中应该考虑这个问题, 操作系统通常只会提示错误。
3.其他运算指令
除基本的二进制加减乘除指令外,算术运算指令还包括十进制 BCD码运算以及与运算相关的符号扩展等指令。
- 零位扩展和符号扩展指令
IA-32处理器支持8,16和32位数据操作,大多数指令要求两个操作数类型一致。但是,实际的数据类型不一定满足要求。例如,32位与16位数据的加减运算,需要先将16位扩展为32位。 再如,32位除法需要将被除数扩展成64位。 不过, 位数扩展后数据大小不能因此改变。
对无符号数据,只要在前面加0就实现了位数扩展、大小不变,这就是零位扩展(zeroextension), 对应指令 MOVZX, 如表3, 例如, 8位无符号敷据80H (128) 零位扩展为位0080H(-128).
MOVZX指令下
nov al.82h;AL=82H
movzx bx,al;AL=82H,零位扩展:BX=0082H
movzx ebx,a1:AL=82H,零位扩展:EBX=00000082H
对有符号数据, 需要进行符号扩展 (sign extension), 即用一个操作数的符号位 (最高位)形成另一个操作数, 对应指令MOVSX. 例如, 8位有符号数据64H(100) 为正数, 符号位为O, 符号扩展成16位是0064H(100)。 再如,16位有符号数据 FFOOH( -256) 为负数, 符号位为1, 符号扩展成32位是FFFFFFOOH (- -256). 特别典型的例子是真值-1, 字节量补码表达是FFH, 字量补码表达是FFFFH,双字量补码表达是FFFFFFFFH.
MOVSX指令举例如下:
mov al,82h;AL=82H
movsx bx,al;AL=82H,符号扩展:BX=FF82H
movsx ebx,al;AL=82H,符号扩展:EBX=FFFFFF82H
零位扩展对应无符号数, 符号扩展对应有符号数, 它们使数据位数加长, 但数据大小井设有改变。 另外, 还可以使用符号扩展指令CBW、 CWD, CWDE 和CDQ, 它们的功能分别是将AL符号扩展为AX、 AX符号扩展为DX和AX、 AX符号扩展为EAX、 EAX符号扩展为EDX和 EAX。 Intel 8086 只支持 CBW 和 CWD 指令, 不支持包括 MOVZX 和 MOVSX 在内的其他扩展。
汇编语言乘法和除法指令相关推荐
- 汇编语言 乘法和除法指令
除法指令 DVI无符号数除法指令 指令格式:DIV 源 指令功能:对两个无符号二进制数进行除法操作.源操作数可以是字或字节. 如果源操作数为字节,16位被除数必须放在AX中,8位除数为源操作数,它可以 ...
- 位移指令实现乘法、除法计算
前言 大家都知道51单片机是有乘法.除法指令的,不管是用C语言还是汇编语言,都是可以直接计算乘法.除法的,我以为+,-,*,/ 这些算术运算是单片机的标配,而我公司使用的应广单片机居然没有乘法.除法指 ...
- 汇编语言学习之基本指令(上)
汇编语言学习之基本指令(上) 汇编语言对大小写不敏感,所以笔者全部采用大写说明语法规则,实例中采用小写英文 文章目录 汇编语言学习之基本指令(上) 1.数据传送类指令 1.1传送指令MOV 1.2交换 ...
- 汇编语言(算术运算类指令总结)
文章目录 一.进位和溢出标志 二.零标志.符号标志和奇偶标志 标志一览表 三.算术运算类指令 1.ADD指令 2.SUB指令 3.ADC和SBB指令 4.INC.DEC和NEG指令 加减法指令一览表 ...
- 汇编语言---乘法指令及符号扩展
汇编语言---有符号数乘法指令 介绍 格式及功能介绍 无符号数乘法指令 有符号数乘法指令 符号扩展及符号扩展语句 符号扩展 符号扩展语句 例子 无符号相乘 有符号数相乘 这是本文的重点: 有符号数相乘 ...
- 十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)
0. 存储指令 语法: mov 寄存器,寄存器 mov 寄存器,[偏移地址] mov [偏移地址],寄存器 mov ds:[偏移地址],寄存器 1. 加法指令 add 加法 语法: add 目的操作数 ...
- 汇编语言基础--汇编操作指令概述
本文是接续"汇编语言基础--机器级数据存储",主要介绍汇编指令的构造.寻址和指令主要分类. 操作指令 指令的基本要素: 在"计算机处理器(CPU)基础&quo ...
- (十)汇编语言——CALL和RET指令
(十)汇编语言--CALL和RET指令 文章目录 (十)汇编语言--CALL和RET指令 CALL指令 功能 寄存器 内存 段间转移 返回指令 ret retf 实例 MUL指令 模块化程序设计 寄存 ...
- 8086汇编语言寻址方式、基本指令和调试指令
一.80x86/Pentium 各种寻址方式 1.立即寻址 立即寻址方式下,操作数作为立即数直接包含在指令中,紧跟在操作码之后与其一起 存放在代码段区域.因此,立即数总是和操作码一起被存入 CPU 的 ...
最新文章
- Fastadmin笔记
- C#调用API向外部程序发送数据(转载)
- 系统学习机器学习之算法评估
- npoi 删除多行 操作excel_NPOI操作excel 2007/2010版本
- Java 8备忘单中的可选
- Python学习笔记之列表(四)
- IIS7部署网站的一些细节问题。
- msi笔记本u盘装linux,微星笔记本bios设置u盘启动的步骤方法详细教程 - 系统家园...
- Intellij Idea选中内容后Backspace删除无法使用,Ctrl+c/Ctrl+v/Ctrl+s/Ctrl+d等等快捷键无法使用的问题的解决
- 树莓派之Ubuntu安装远程桌面
- 谈USB重定向的方式
- wps 2019智能填充
- 爱心的数学函数方程_什么函数图像能构成爱心?
- AT4565 Beginning
- 狗狗大全(送给喜欢狗的人)
- Web开发——Photoshop(PSD格式截取)
- 单层石墨烯工业化量产科研成果及工业化量产基地落地
- 小米随星借(原小米贷款)提升服务水平,帮助用户解决用款难问题
- 主板显卡服务器维修,显卡无显示怎么维修 显卡无显示解决方法【详细介绍】...
- 韵达快递单号可以批量查询吗
热门文章
- XSLT实现XML文档转换成HTML文档
- RME HDSP 9652声卡扩展接口(辫子)定义
- OSChina 周四乱弹 —— 你的车我很喜欢,谢谢司机
- 分子骨架跃迁工具DiffLinker评测
- java 连接hive2,java jdbc连接hiveserver2
- java多线程实现的几种方式
- 怎么用计算机算非统计法,混凝土强度计算方法(统计法与非统计法).doc
- Canvas 教程:如何绘制带箭头的曲线
- laravel solr使用PHP(Laravel)实现Solr全文搜索详细过程
- 《Linux内核修炼之道》精华分享与讨论(9)——内核学习的相关资源