微机原理——指令系统——算数运算指令(ADD、ADC、SUB、SBB、INC、DEC、NEG、CMP、MUL、IMUL、DIV、IDIV、CBW、CWD、BCD调整)

博主联系方式:
QQ:1540984562
QQ交流群:892023501
群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。

算数运算指令

      • 1、加减法指令ADD、ADC 、SUB 、SBB 和增量减量指令INC、DEC、NEG
        • ADD ADC例题讲解
        • SUB SBB例题讲解
      • 2、比较指令CMP
        • CMP例题讲解
      • 3、乘除指令MUL IMUL DIV IDIV
        • DIV、IDIV例题讲解
      • 4、符号扩展指令CBW CWD
      • 5、BCD数运算调整指令(十进制调整指令)

算术

1、加减法指令ADD、ADC 、SUB 、SBB 和增量减量指令INC、DEC、NEG

(1)不带进位位加法指令
指令格式:ADD DST,SRC ; DST←DST+SRC
语法格式:ADD reg / mem ,reg/mem /imm8/imm16
指令功能:完成两个操作数相加,结果送目的操作数DST。
该指令要求DST、SRC 不能同时为存储器,DST不能为立即数,运算结果对标志位有影响
例子:
例子
(2)ADC 带进位位加法指令
指令格式: ADC DST,SRC
功能:与ADD指令相同,只是相加时要加上进位位的当前值。
完成的操作为:== (DST) ← (SRC)+(DST)+ CF ==
DST、SRC 不能同时为存储器, SRC可为立即数,运算结果对标志位有影响
对状态标志位的具体影响:

CF=1 二进制加法中最高有效位向高位有进位。
CF=0 二进制加法中最高有效位向高位无进位。
ZF=1 加法结果为0
ZF=0 加法结果不为0 。
OF=1 两同符号数相加(正数+正数、或负数+负数),而结果符号与其相反。
OF=0 不同符号数相加。注意: (不同符号数相加不会产生溢出)
SF=1 加法结果为负(符号位为1)
SF=0 加法结果为正(符号位为0)。

ADD ADC例题讲解

问:设在DVAR开始的连续8字节中分别存放着两个数A(00127654H)和B(00049821H)(每个数为32位),求C=A+B,并将结果C放到DVARC开始的内存中
思路分析:完成双字(32位)相加:先用ADD把低位字相加,再用ADC完成高位字的带进位加法

data segmentDVAR DD 00127654H;DVAR DD 00049821H;DVARC DD ?	;存储相加后的值
ends
;在数据段定义数据
LEA DI,DVAR;获取DVAR地址
MOV AX,4[DI];第二个数的低位字的起始地址=DI+4,将其中内容送入AX
ADD AX,[DI];第一个数的低位字
MOV WORD PTR DVARC,AX;保存结果的低位字
MOV AX,6[DI];
ADC AX,2[DI];	带进位		
MOV DVARC+2,AX;保存结果的高位字

语法知识点:
汇编中何时使用WORD/BYTE PTR
伪指令DD DW DB
(3) SUB DST,SRC 不带借位减法指令
功能:进行两个操作数的相减操作,结果送回DST。
完成的操作: DST←DST-SRC
(4) SBB DST,SRC 带借位减法指令
功能:与SUB相类似,但相减时还应减去标志CF的当前值。
完成的操作: DST←DST-SRC-CF
语法格式:SUB(SBB) reg/mem ,reg/mem/imm
DST、SRC可以是存储器或寄存器, 但不能同时为存储器。运算结果对标志位有影响。
LIZi

SUB SBB例题讲解

问:设DVAR1和DVAR2保存有双字数,求(DVAR1)- (DVAR2),并将结果保存在双字变量DVARR中。

data segmentDVAR1 DD 00127654H;DVAR2 DD 00049821H;DVARR DD ?	;存储相减后的值
ends
;在数据段定义数据
MOV AX,WORD PTR DVAR1;
SUB AX,WORD PTR DVAR2;
MOV WORD PTR DVARR,AX;保存结果的低位字
MOV AX,WORD PTR DVAR1+2;
SBB AX,WORD PTR DVAR2+2;	带借位		
MOV WORD PTR DVARR+2,AX;保存结果的高位字

(5) INC OPR 加1指令
对指定的操作数进行加1操作,其操作数OPRD可以是任意一个通用寄存器,也可以在内存单元中。
该指令影响标志位,但不影响CF标志位
完成的操作: OPR OPR+1

INC AL ; AL←AL+1
INC (SI); (SI) (SI)+1

(6) DEC OPR 减1指令
功能:实现对操作数的减1操作,操作数可以是通用寄存器,也可以在内存单元中。减1操作时,把操作数看作为无符号的二进制数。
完成的操作: OPRD OPRD-1
语法格式:DEC reg/mem

DEC BX ; BX BX-1
DEC(DI);(DI) (DI)-1

(7) NEG (取负指令)
格式: NEG DST;
描述
转换成二进制算法:

OPR OPRD ‘+1
或: OPR FFFFH -(OPR)’+1

2、比较指令CMP

指令格式: CMP OPR1,OPR2;OPR1-OPR2 结果影响标志位。
语法格式:CMP reg/mem ,reg/mem/imm
功能:做两个数的比较,与减法指令一样执行OPR1-OPR2操作,但相减后不回送结果,只是根据相减结果修改标志位
OPR1、OPR2可以是存储器或寄存器,不能同时为存储器,OPR2还可为立即数,运算结果对标志位有影响。
比较结果有三种可能:AX>BX 、 AX<BX 、 AX=BX
对标志位的影响:

CF=1 减法中最高有效位向高位有借位( AX<BX )
CF=0 减法中最高有效位向高位无借位( AX≥BX )
ZF=1 结果为0(AX=BX);
ZF=0 ,结果不为0(AX≠BX)
OF=1 两数符号相反(正数-负数、或负数-正数),而结果符号与减数(BX)相同。
OF=0 同符号数相减。

CMP例题讲解

问:若自BLOCK开始的内存缓冲区中,有100个带符号的数,希望找到其中最大的一个值,并将它放到MAX单元中。
分析思路:循环语句 加一减一指令、找到最大值:需要比较语句CMP
带符号的数:一个字大小

data segmentBLOCK DD 00127654H;......BLOCK DD 00049821H;MAX DD ?;
ends
;在数据段定义数据
MOV BX,OFFSETBLOCK;		==LEA BX,BLOCK;	获取地址
MOV AX,[BX];	将第一个数存入AX
INC BX;
INC BX;	地址转到下一个数:BX+2
MOV CX,99;计数器置数
AGAIN:CMP AX,[BX];	AX中的数和BX指向的数
JG   NEXT     ;大于则转,AX>[BX]
MOV AX,[BI];	否则把[BX]送入AX
NEXT:DEC CX;
INC BX;
INC BX;计数减1,bi指向下一个数
JNZ AGAIN;所有的数比较完了吗?没完转AGAIN继续
MOV [MAX],AX;	将AX内容送入存储单元MAX

3、乘除指令MUL IMUL DIV IDIV

(1)无符号数乘法指令MUL
格式:MUL SRC ;(AX)(AL)×(SRC)字节乘法
(DX,AX)(AX)×(SRC)字乘法
语法格式:MUL reg/mem
要求:字节运算时,目的操作数(被乘数)(隐含指令)必须是累加器AL,在做乘法运算时要先把被乘数设置好,即被乘数和乘积是隐含的形式,被乘数和乘数都是无符号数,乘积存放在寄存器AX中。进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DXAX中。源操作数不允许使用立即数
示意图:
示意图
(2) 带符号数乘法指令IMUL
格式:IMUL SRC ;(AX) (AL)×(SRC)字节
;(DX,AX) (AX)×(SRC)字
语法格式:IMUL reg/mem
注意:操作同无符号数乘法相同
对标志位的影响也可相类比。

例: MOV AL 66H;被乘数送AL
MOV BL 88H;乘数送BL
MUL BL ;无符号乘法,AL×BL结果存于AX中
MOV AX,6666H ;被乘数(字)送AX
MOV BX,4567H ;乘数(字)送BX
MUL BX ;结果的高字在DX中,低字在AX中

何时使用带符号和不带符号?
MUL和IMUL指令的使用条件是由数的属性决定(由程序设计者自己确定)。
如(11111111B)× (11111111B)为无符号数时为255×255=65025,
而为有符号数时为(-1)×(-1)=1,因此根据要相乘数的格式决定选用那一种指令。
对标志位的影响:
乘法指令运算结果影响状态标志,但对CF、OF有特殊的定义
影响
字与字节相乘

MOV AL,15H;
CBW; CBW = convert byte to word逻辑意义就是al的符号扩展到ah
节扩展CBW的基本功能是(AH)=00H,当(AL)的最高有效位为0时。AH)=FFH,当(AL)的最高有效位为1时
MOV BX,0FB78H;
IMUL BX;
结果

(3)无符号数除法指令DIV (被除数和结果隐含)
格式:DIV SRC ;(AL) (AX)/(SRC)除法的商
字节操作 (AH) (AX)/(SRC)除法余数
字操作 (AX) (DX,AX)/(SRC)除法的商
(DX) (DX,AX)/(SRC)除法余数
(4)带符号除法指令IDIV (被除数和结果隐含)
格式:IDIV SRC ;(AL) (AX)/(SRC)除法的商
字节操作 (AH) (AX)/(SRC)除法余数
字操作 (AX)(DX,AX)/(SRC)除法的商
(DX)(DX,AX)/(SRC)除法余数
形象表示:表述
== 需要注意点:==
1) 如果除数为0,则产生0型中断。
2) 除法指令运算结果对状态标志无定义。
3) 除法指令要求字操作时,被除数必须为32位,除数是16位,商和余数是16位;字节操作时,被除数必须为16位,除数是8位,商和余数是8位。(被除数必须大于除数)。
4)有符号与无符号除法完成的操作相同,只是做有符号除法时,操作数是有符号的,得到的商和余数也是有符号的,余数的符号同被除数符号相同。

DIV、IDIV例题讲解

问:***分别实现下列数据的无符号和有符号除法
DATA7 DW 9400H ;被除数
DATA8 DW 0060H ;除数
QUOT DW ? ;商
REMAIN DW ? ;余数 ***

;无符号
MOV AX,DATA7;
MOV DX,0;
DIV DATA8;
MOV QUOT,AX;
MOV REMAN,DX;
;有符号
MOV AX,DATA7;
;CWD可将AX内容扩展到DX、AX。规则是若AX最高位=1,则执行后DX=FFFFH;若AX最高位=0,则执行后DX=0000H
IDIV DATA8;
MOV QUOT,AX;
MOV REMAN,DX;

符号扩展指令CBW,CWD是什么意思?

4、符号扩展指令CBW CWD

在这里插入图片描述

5、BCD数运算调整指令(十进制调整指令)

开始写这一类指令时感觉有点蒙,看了这篇文章感觉稍微好了点,建议先看这篇文章再往下了解具体指令。
http://www.elecfans.com/dianzichangshi/20171124586013.html
BCD码:用4位二进制码表示1位10进制数。
它和二进制码并不相同,为了得到正确结果我们需要进行修正。
BCD分为两类:
1)、分离BCD码:8位寄存器包含一位BCD码 (非压缩BCD)
2)、组合BCD码:8位寄存器包含2位BCD码 (压缩BCD)
1、加法调整指令AAA DAA
AAA——对AL中非压缩的BCD数的加法结果进行调整;
具体操作:
1、对相加结果AL的低四位+6修正
2、观察AF
AF有进位,则AH=1,CF=1,AF=l;
AF无进位,则AH=0,CF=0,AF=0。
3、清AL的高4位

DAA——对AL中的两个压缩十进制数相加之和进行调整,得到压缩十进制和;
具体操作:
对相加结果AL的低4位和高4位分别进行+6修正。对标志位的影响等同于ADD指令
压缩BCD和非压缩BCD的区别
压缩BCD码
用一个字节表示两位BCD码,高位表示十位数BCD码,低位表示个位数BCD码,称为压缩型BCD码。
例如:十进制数56用压缩8421BCD码表示为0101 0110
非压缩BCD码
用一个字节表示一位BCD码,高位为0,低位为BCD码。
例如:十进制数5用非压缩8421BCD码表示为0000 0101
参考链接
问:计算十进制数的运算:4+8

;通过键盘输入得到的是ASCII码,将其看做分离BCD码,则高4位为无效部分,因此不需要清除.
MOV AL,34H;		BCD表示十进制数34
MOV BL,28H;		BCD表示十进制数28
ADD AL.BL;
;在此之前(AL)=5CH,(按照二进制相加)
DAA;
;在此之后,(AL)=62H(转化成BCD码)

2、减法调整指令AAS DAS
AAS——对AL中非压缩的BCD数的减法结果进行调整;
对非压缩BCD码的低位AL进行减6处理,观察AF有无借位
AF有借位,则CF=1,AF=l;
AF无借位,则CF=0,AF=0。
DAS——对AL中的两个压缩十进制数相减之差进行调整,得到压缩十进制差;
对压缩BCD码的高位AH和低位AL都进行减6处理。对标志位的影响等同于SUB指令。
问:计算十进制数的运算:5-9

;通过键盘输入得到的是ASCII码,将其看做分离BCD码,则高4位为无效部分,因此不需要清除.
MOV AL,05H;		BCD表示十进制数5
MOV BL,09H;		BCD表示十进制数9
SUB AL.BL;
AAS

问:计算十进制数的运算:31-87

;通过键盘输入得到的是ASCII码,将其看做分离BCD码,则高4位为无效部分,因此不需要清除.
MOV AL,31H;		BCD表示十进制数5
MOV BL,87H;		BCD表示十进制数9
SUB AL.BL;
DAS

3、乘法调整指令AAM
AAM——对AX中两个ASCII未压缩十进制相乘结果进行调整;
调整方法:将结果(AL)除以10,商为(AH)的低4位,余数为(AL)的低4位
问:计算十进制数的运算:78*

;通过键盘输入得到的是ASCII码,将其看做分离BCD码,则高4位为无效部分,因此不需要清除.
MOV AL,7;		
MOV BL,8;	
MUL BL;
AAM

4、除法调整指令AAM
AAD——在除法指令前对AX中ASCII未压缩的十进制数进行调整;
调整方法:(AL)=(AH)*10+(AL);使(AH)=0,接下来操作是正常的除法操作。

问:计算十进制数的运算:274*

;通过键盘输入得到的是ASCII码,将其看做分离BCD码,则高4位为无效部分,因此不需要清除.
MOV AX,0207H;		
MOV BL,4;	
AAD ;(AX)<-001BH
DIV BL;

总结,因为BCD的类型而总分为两类的指令其实本质相同,其中,
加减乘都是通过一些操作从而将结果进行修正,从二进制转为BCD形式。
除法却是对被除数进行操作,这点需要特别注意
*

【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统出现Too many open files 错误、linux too many open files

故障一、linux too many open files linux系统出现Too many open files 错误&#xff0c;这是因为文件描述符大小不够&#xff0c;或者有不正常的网络连接(Socket也是一种特殊的文件)、文件IO没有关闭并释放出文件描述符&#xff08;文件句柄&#xff0c;File Operator&#xf…

精通init ramfs构建

一、init ramfs是什么   在2.6版本的linux内核中&#xff0c;都包含一个压缩过的cpio格式的打包文件。当内核启动时&#xff0c;会 从这个打包文件中导出文件到内核的rootfs文件系统&#xff0c;然后内核检查rootfs中是否包含有init文件&#xff0c;如果有则执行它&#xff0…

python 示例_带有示例的Python date isocalendar()方法

python 示例Python date.isocalendar()方法 (Python date.isocalendar() Method) date.isocalendar() method is used to manipulate objects of date class of module datetime. date.isocalendar()方法用于操作模块datetime的日期类的对象。 It uses a date class object a…

mysql 函数重载_[赋值]函数,变量,重载 ,_第1页_169IT

[java/j2ee] java实现简单的给sql语句赋值的示例代码本身很简单。拼接sql的时候&#xff1f;不好数&#xff0c;简单的用来赋值。代码如下:/** * TODO 循环赋值,缺少的类型可随时添加 * author Lucius * param pt * param list * throws SQLException */ public static…

20-SIFT算法

import cv2 import numpy as np from matplotlib import pyplot as pltdef show_photo(name,picture):#图像显示函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img cv2.imread(E:\Jupyter_workspace\study\data/cfx.png) gray cv2.cvtColor(img,cv2.COL…

Opencv——写入或读取数据到XML或YAML文件

什么是XML、YAML文件 XML(eXtensible Markup Language)是一种元标记语言。所谓“原标记”&#xff0c;就是开发者可以根据自身需要定义的标记&#xff0c;任何满足XML命名规则的名称都可以标记。此外&#xff0c;XML是一种语义/结构化语言&#xff0c;它描述了文档的结构和语义…

mysql 迁移 nosql_从关系型Mysql到Nosql HBase的迁移实践

2013年11月22-23日&#xff0c;作为国内唯一专注于hadoop技术与应用分享的大规模行业盛会&#xff0c;2013 Hadoop中国技术峰会(China Hadoop Summit 2013)于北京福朋喜来登集团酒店隆重举行。来自国内外各行业领域的近千名CIO、CTO、架构师、IT经理、咨询顾问、工程师、Hadoop…

Oracle EBS数据定义移植工具:FNDLOAD

在实际的EBS二次开发中&#xff0c;我们经常会碰到需要在各个环境之间移植二次开发的程序对象以及数据定义&#xff0c;如在EBS二次开发中并发请求的定义会涉及到&#xff1a;可执行、并发程序、值集、请求组等的定义&#xff0c;定义需要从开发环境、测试环境、UAT环境一直到正…

21-特征匹配方法(Brute-Force蛮力匹配)

Brute-Force蛮力匹配 cv2.BFMatcher(crossCheck True) crossCheck表示两个特征点相互匹配 例如A中的第i个特征点与B中的第j个特征点最近&#xff0c;并且B中的第j个特征点到A中的第i个特征点也是 NORM_L2&#xff1a;归一化数组的(欧几里得距离)&#xff0c;如果其他特征计算…

weakhashmap_Java WeakHashMap values()方法与示例

weakhashmapWeakHashMap类values()方法 (WeakHashMap Class values() method) values() method is available in java.util package. values()方法在java.util包中可用。 values() method is used to get the values that exist in this map to be viewed in a collection. val…

Opencv——几何空间变换(仿射变换和投影变换)

几何空间变换【1】几何变换&#xff08;空间变换&#xff09;简述【2】变换矩阵知识简述齐次坐标的概念几何运算矩阵【3】图像的仿射变换1、平移变换2、比例缩放3、旋转4、对称变换&#xff08;不做展示&#xff09;1、关于X轴变换2、关于Y轴变换3、关于直线YX变换4、关于直线Y…

用于主题检测的临时日志(e1784e6f-037e-45de-bad1-8bbc239818ee - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...

这是一个未删除的临时日志。请手动删除它。(578392f7-2207-4b01-b36d-c483f0699988 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)转载于:https://www.cnblogs.com/Fly-sky/archive/2011/03/03/1969850.html

probuffer java_Protocol Buffer的使用

Probotbuf简介在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML&#xff0c;这两种技术常被用于数据的结构化呈现和序列化。我们可以从两个方面来看JSON 和 XML与protobuf的异同&#xff1a;一个是数据结构化&#xff0c;一个是数据序列化。这里的数据结构化…

根据DbSchema生成代码2

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Threading; using System.IO; using Rocky;namespace Rocky.CodeBuilder {public class DbBuilder : Disposable{#region 字段public even…

22-随机抽样一致算法RANSAC

随机抽样一致算法(Random sample consensus&#xff0c;RANSAC) 看似复杂&#xff0c;其基本思想就是&#xff1a;随机选取俩点&#xff0c;然后连接&#xff0c;给定一个容忍范围&#xff0c;在这个范围内的点越多越好&#xff0c;然后不断的迭代进行找两点之间容忍范围内点最…

treeset比较器_Java TreeSet比较器()方法与示例

treeset比较器TreeSet类的compare()方法 (TreeSet Class comparator() method) comparator() method is available in java.util package. 比较器()方法在java.util包中可用。 comparator() method is used to get the Comparator object based on customizing order the eleme…

智能车复工日记【1】——菜单索引回顾

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 菜单回顾 1、系列文章解析结构元素菜单图示菜单缺点:1、系列文章 【智能车Code review】—曲率计算、最小二乘法拟合 【智能…

[转载]Oracle 11g R1下的自动内存经管(2)

AMM调整 除现有的用于内存经管的V$视图外&#xff0c;Oracle 11g还新添加了下面4个视图用于自动内存经管&#xff1a; ? ◆V$MEMORY_CURRENT_RESIZE_OPS ? ◆V$MEMORY_DYNAMIC_COMPONENTS ? ◆V$MEMORY_RESIZE_OPS ? ◆V$MEMORY_TARGET_ADVICE 转载于:https://www.cnblogs.…

23-背景建模

帧差法 由于场景中的目标在运动&#xff0c;目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算&#xff0c;不同帧对应的像素点相减&#xff0c;判断灰度差的绝对值&#xff0c;当绝对值超过一定阈值时&#xff0c;即可判断为运动目标&#xf…

DB2 9 运用开辟(733 考试)认证指南,第 3 部门: XML 数据独霸(4)

议决运用顺序存储和检索 XMLXML 编码字符编码在汗青上&#xff0c;术语 字符集、字符编码 和 码页 都有雷同的意义&#xff1a;一个字符集和一个二进制码集&#xff0c;其中每个码示意一个字符。&#xff08;码页是来自 IBM 的一个术语&#xff0c;示意一个大型主机或 IBM PC 上…