微机原理——指令系统——算数运算指令(ADD、ADC、SUB、SBB、INC、
DEC、NE。。。
博主联系⽅式:
QQ:1540984562
:wxid_nz49532kbh9u22
QQ交流:892023501(嵌⼊式⽅向)
QQ交流:856398158(后端⽅向)
算数运算指令
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 segment
DVAR 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;保存结果的⾼位字
语法知识点:
(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可以是存储器或寄存器, 但不能同时为存储器。运算结果对标志位有影响。
SUB SBB例题讲解
问:设DVAR1和DVAR2保存有双字数,求(DVAR1)- (DVAR2),并将结果保存在双字变量DVARR中。
data segment
DVAR1 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 segment
BLOCK DD 00127654H;
......
BLOCK DD 00049821H;
MAX DD ?;
ends
;在数据段定义数据
比较指令cmp怎么用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,乘积在寄存器DX,AX中。源操作数不允许使⽤⽴即数。
⽰意图:
(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;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论