ASM16 14-15 算术运算类指令
算术运算类指令
- 四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算
- 请注意算术运算类指令对标志的影响
- 掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP
- 熟悉:MUL/IMUL、DIV/IDIV
- 理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD
加法指令ADD
ADD指令将源与目的操作数相加,结果送到目的操作数
ADD指令按状态标志的定义相应设置
带进位加法指令ADC
ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与ADD配合,实现多精度加法运算
减法指令SUB(subtract)
SUB指令将目的操作数减去源操作数,结果送到目的操作数
SUB指令按照定义相应设置状态标志
带借位减法指令SBB
SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数
SBB指令按照定义相应设置状态标志
SBB指令主要和SUB配合,实现多精度减法运算
减量指令DEC(decrement)
DEC指令对操作数减1(减量)
DEC指令不影响进位CF标志,按定义设置其他状态标志
1 | ;算法运算类指令 |
0000 FFFF+0000 0001的结果为0001 0000
0001 0000-0000 0001的结果为0000 FFFF
INC BX使BX+1,DEC BX使BX-1
求补指令NEG(negative)
NEG指令对操作数执行求补运算:用零减去操作数然后结果返回操作数
求补运算也可以表达成:将操作数按位取反后加1
NEG指令对标志的影响与用零作减法的SUB指令一样
1 | ;补码 |
1取补码为FFFF
比较指令CMP(compare)
CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志
CMP指令执行的功能与SUB指令,但结果不回送目的操作数
1 | mov ax,1 |
结果为0,说明比较的结果为相等
ZF=1 则说明两个数相等,因为zero为1说明结果为0
当无符号时:
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
乘法指令
1 | ;乘法 |
有符号乘法与无符号乘法
16位乘16位
除法指令
1 | ;除法 |
1234除100的结果为12余34
符号扩展指令
不影响标志位,符号扩展指令常用于获得倍长的数据
CBW
- AL的符号扩展至AH
- 如AL的最高有效位是0,则AH=00
- AL的最高有效位为1,则AH=FFH。AL不变
CWD
- AX的符号扩展至DX
- 如AX的最高有效位是0,则DX=00
- AX的最高有效位为1,则DX=FFFFH。AX不变
1 | ;除法 |
扩展后为AH为00h
若把AL改为FF则扩展完AH为FFh
扩展完DX为FFFFh
若把AX改为0010则扩展完AH为0000h
扩展后继续运算,-8除100的余数为-8