0%

x86指令体系中的算术运算指令

前言:算数运算指令可以分为单操作数指令,也有双操作数指令,还有隐含操作数

​ 操作数可分为8位和16位二进制数。其中双操作数指令不允许两个操作数都是存储器操作数目的操作数不能是立即数。两个操作数的位数要一样

单操作数指令操作数不允许是立即数

加法指令

ADD加法指令

指令格式:ADD OPD,OPS

指令功能:OPD ⬅ OPD + OPS

源操作数加上目的操作数,结果存于目的操作数中

ADC带进位加法指令

指令格式:ADC OPD,OPS

指令功能:OPD ⬅ OPD+OPS+CF

源操作数加上目的操作数再加上标志寄存器中CF的值,结果存于目的操作数中

INC指令

指令格式:INC OPD

指令功能:OPD的内容加1,OPD可以是reg或mem,若是内存单元应指定是字节或字单元(只不影响进位位)

正确的指令格式:

1
2
3
4
5
6
7
8
9
10
add CL,11H
add BYTE ptr[BX],89H
add WORD ptr[BX],05
add AX,2000H
add CH,DL
add BX,[SI+6]
add [SI],CX
INC AL
INC CX
INC BYTE ptr[BX+SI]

减法指令

SUB减法

指令格式:SUB OPD,OPS

指令功能:目的操作数减源操作数,结果存于目的操作数,结果存于目的操作数,即OPD ⬅ OPD - OPS

带借位减法指令SBB

指令格式:SBB OPD,OPS

指令功能:目的操作数减源操作数再减CF,结果存于目的操作数。即OPD ⬅ OPD - OPS - CF

减1指令DEC

指令格式:DES OPD //其中OPD的含义与INC指令相同

指令功能:OPD减1,即OPD ⬅ OPD - 1

(DEC不影响CF标志,影响其他5个标志)

求补指令NEG

指令格式:NEG OPD //OPD可以是reg或mem

指令功能:对操作数OPD进行求补运算,即对操作数OPD连同符号位求反后加1,并把结果送回OPD

对0求补时,CF = 0,其他情况CF = 1

比较指令CMP

指令格式:CMP OPD,OPS

指令功能:CMP指令与SUB指令类似,将两个操作数相减,但结果不送回OPD。该指令常用于改变标志位

​ 该指令常用于比较两数大小。执行CMP OPD,OPS,无符号数比较时,CF = 0表示OPD大于OPS,CF = 1时表示OPS大于OPD;有符号数比较时,后面往往跟着一条转移指令,根据比较指令执行后标志寄存器的状态产生不同的分支

乘法指令

MUL无符号乘法数指令

指令格式:MUL OPD,操作数可以是reg或mem,不能是立即数

指令功能:实现两个无符号数的乘法运算。当OPD为8位字节数据时为字节相乘,将AL寄存器与OPD相乘,结果存于AX寄存器,即AX ⬅ (AL) × OPD,AL是隐含操作数,在指令中没有出现

当OPD为16位字数据时为字相乘,将AX寄存器与OPD相乘,结果存于DX和AX寄存器。即(DX)(AX) ⬅ (AX) × OPD,AX是隐含操作数

对标志位的影响:影响CF、OF标志如果乘积的高一半为0,则CF = OF = 0,否则CF = OF = 1

有符号数乘法指令IMUL

指令格式:IMUL OPD

指令功能和用法与无符号数乘法类似。只是专用于有符号数的相乘

乘法指令对标志位的影响:如果乘积的高一半为低一半的符号扩展则CF = 0;OF = 0否则CF = 1;OF = 1

除法指令

无符号除法DIV

指令格式:DIV OPD

指令功能:实现两个无符号数的除法运算。当OPD为8位字节数据时为字节相除。(16位/8位 = 商8位 余数8位)

被除数在AX中,除数在OPD中。(AX)/OPD,AL ⬅ 商,AH ⬅ 余数,AX时隐含操作数

当OPD是16位字数据相除时字相除(32位/16位 = 商16位 余数8位),被除数在DX和AX中,除数在OPD中。(DX)(AX)/OPD,AX ⬅ 商,

DX ⬅ 余数,DX和AX是隐含操作数

有符号数除法IDIV

指令格式:IDIV OPD

指令功能和用法与无符号数除法类似,只是专用于有符号数的相除

除法指令对标志位的影响:除法指令对标志没有定义。除法指令会产生结果溢出,当被除数远大于除数时便产生溢出,8086CPU中就产生编号为0的内部中断,运行相应的中断程序。程序设计时应当避免产生除法溢出

对DIV指令,当除数为字节除时商 > 8或者在字除时商 > 16时,会发生除法溢出。

对IDIV指令,当除数为0、在字节除时商不在 -128到127或者在字除时商不在-32768到32767时,会发生除法溢出。

符号扩展指令

符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,形成的操作数是各位全0(最高位为0)或者各位全1的数(最高位为1)。符号扩展不改变数据大小

字节扩展为字CBW

指令格式:CBW

指令功能:将AL的符号位扩展到AH,如AL的最高有效位是0,则AH == 00,AL的最高有效位为1,则AH = 0FFH。AL保持不变

字扩展为双字CWD

指令格式:CWD

指令功能:将AX的符号位扩展到DX,如AX的最高有效位是0,则DX = 0000H,AX的最高有效位为1,则DX = 0FFFFH。AX保持不变。

因为除法指令要求被除数的位数是除数的倍长。符号扩展指令主要用于在有符号数除法中扩展被除数的位数。对无符号数除法可直接高8位或高16位清0,以获得倍长的被除数。

1
2
3
4
mov al,0F7H   ;AL = F7H
cbw ;AX = FFF7H
mov al,47h ;AL = 47H
cbw ;AX = 0047H

十进制数调整指令

压缩BCD码加法调整指令DAA

指令格式:DAA

指令功能:对两个压缩十进制相加运算存于AL中的结果进行调整,产生一个压缩组合的十进制数在AL中,其进位在CF中

调整操作:

若AL&0FH > 9或AF = 1:

则AL ⬅ AL + 6,AF ⬅ 1

若AL&F0H > 90H或CF = 1

则AL ⬅ AL + 60H,CF ⬅ 1

本指令跟在加法指令之后,影响标志位AF、CF、PF、SF、ZF

压缩BCD码减法调整指令DAS

指令格式:DAS

指令功能:对两个压缩十进制相减存于AL中的结果进行调整,产生一个压缩组合的十进制数存于AL中

调整操作:

若AL&0FH > 9或AF = 1

则AL ⬅ AL - 6,AF ⬅ 1

若AL&F0H > 90H或CF = 1

则AL ⬅ AL - 60H,CF ⬅ 1

本指令跟在减法指令之后,影响标志位AF、CF、PF、SF、ZF

非压缩BCD码加法调整指令AAA

指令格式:对两个未压缩十进制相加运算存于AL中的结果进行调整,产生一个未压缩的十进制数在AX中

调整操作:

若AL&0FH > 9或AF = 1;

则AL ⬅ AL - 6,AH ⬅ AH - 1,AF ⬅ 1,CF ⬅ AF,AL ⬅ AL&0FH

非压缩BCD码减法指令AAS

指令格式:AAS

指令功能:对两个未压缩十进制相减运算存于AL中的结果进行调整,产生一个未压缩十进制数存在AX中。

调整操作:

若AL&0FH > 9或AF = 1

则AL ⬅ AL - 6,AH ⬅ AH - 1,AF ⬅ 1,CF ⬅ AF,AL ⬅ AL&0FH

否则AL ⬅ AL&0FH

本指令紧跟在减法指令之后使用,使用标志位AF、CF

非压缩BCD码乘法调整指令AAM

指令格式:AAM

指令功能:对两个未压缩十进制数相乘存于AX中的结果进行调整,产生一个未压缩的十进制数存在AX中,即AH ⬅ 将AL除以0AH的商,AL⬅ 将AL除以0AH的余数

本指令应跟在MUL指令后使用,影响标志位PF、SF、ZF

非压缩BCD码除法指令AAD

指令格式:AAD

指令功能:把AX中的两个未压缩十进制数进行调整,然后可按DIV指令实现两个未压缩十进制数的除法算,其结果为未压缩十进制商
**(在AL中)和余数(在AH中)**,即AL ⬅ AH × 10 + AL,AH ⬅ 0

本指令应在除法运算之前使用,对AX中的压缩十进制数进行调整,调整后再进行二进制除法运算,这与前述的加减乘法的调整过程是不同的。本指令影响标志位PF、SF、ZF