微型计算机原理与接口技术——8086指令系统之算数运算指令

算数运算类指令

算术运算指令的执行大多对状态标志位会产生影响

加法运算指令

  • 加法指令对操作数的要求与MOV指令相同
  • 段寄存器不能作为加法指令的操作数

普通加法指令ADD

格式

ADD OPRD1,OPRD2

操作

OPRD1+OPRD2并把结果赋给OPRD1

ADD指令的执行对全部6个状态标志位都产生影响

带进位位的加法指令ADC

格式

ADC OPRD1,OPRD2

操作

OPRD1+OPRD2+CF并把结果赋给OPRD1

ADC指令多用于多字节数相加,使用前要先将CF清零。

加1指令INC

格式

INC OPRD

操作

OPRD+1并把结果赋给OPRD

INC指令不影响CF标志位,只影响AF、OF、PF、SF、ZF标志位

常用于在程序中修改地址指针及循环次数等

减法运算指令

减法指令对操作数的要求与对应的加法指令相同

不考虑借位的减法指令SUB

格式

SUB OPRD1,OPRD2

操作

OPRD1- OPRD2并把结果赋给OPRD1

对标志位的影响与ADD指令相同

考虑借位的减法指令SBB

指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样

格式

SUBB OPRD1,OPRD2

操作

OPRD1- OPRD2- CF并把结果赋给OPRD1

SBB指令多用于多字节减法运算,使用前要先将CF清零。

减1指令DEC

格式

DEC OPRD

操作

OPRD - 1并把结果赋给OPRD

指令对操作数的要求与INC相同

指令常用于在程序中修改循环次数

求补指令NEG

利用该指令可以得到负数的绝对值。即求此操作数的相反数的补码。

之所以把NEG指令称为求补指令,是因为对一个负数求补码就相当于用0减去此数。

格式

NEG OPRD

操作

0 - OPRD并把值赋给OPRD

执行NEG指令后,一般情况下都会使CF为1。因为用0减去某个操作数,自然会产生借位,而减法的CF值正是反映无符号数运算中的借位情况。除非给定的操作数为0才会使CF为0。指令对操作数的要求及对标志位的影响与SUB指令相同。

当指定的操作数的值为80H(-128)或为8000H(-32768),则执行NEG指令后结果不变,即仍为80H或8000H,但OF置1,其他情况下OF均置0。

比较指令CMP

该指令用于比较两个数的大小,可作为条件转移指令转移的条件

指令对操作数的要求及对标志位的影响与SUB指令相同

格式

CMP OPRD1,OPRD2

操作

OPRD1- OPRD2

指令执行的结果不影响目标操作数,仅影响6个标志位

乘法指令

乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX

需要注意的是:

  • 源操作数由指令给出。
  • 两操作数字长相等,且不能为立即数。

无符号的乘法指令MUL

对无符号数乘法,如果乘积的高半部分(字节相乘时为AH,字相乘时为DX)不为0,则CF=OF=1,代表AH或DX中包含乘积的有效数字;否则CF=OF=0

格式

MUL OPRD

操作

  • OPRD为字节数——AL×OPRD并把结果赋给AX

  • OPRD为16位数——AX×OPRD并把结果赋给DXAX

带符号的乘法指令IMUL

对有符号数乘法,若乘积的高半部分是低半部分的符号位的扩展,则CF=OF=0;否则CF=OF=1。对其他标志位均无定义。

除法指令

指令要求被除数是除数的双倍字长
微型计算机原理与接口技术——8086指令系统之算数运算指令

无符号除法指令

格式:

DIV OPRD

有符号除法指令

格式

IDIV OPRD