算术运算类指令

  • 四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算
  • 请注意算术运算类指令对标志的影响
    • 掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP
    • 熟悉:MUL/IMUL、DIV/IDIV
    • 理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD

加法指令ADD

  • ADD指令将源与目的操作数相加,结果送到目的操作数

  • ADD指令按状态标志的定义相应设置

    image-20240730175303071

带进位加法指令ADC

  • ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数

  • ADC指令按状态标志的定义相应设置

  • ADC指令主要与ADD配合,实现多精度加法运算

    image-20240730180256166

减法指令SUB(subtract)

  • SUB指令将目的操作数减去源操作数,结果送到目的操作数

  • SUB指令按照定义相应设置状态标志

    image-20240730180531180

带借位减法指令SBB

  • SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数

  • SBB指令按照定义相应设置状态标志

  • SBB指令主要和SUB配合,实现多精度减法运算

    image-20240730180932321

减量指令DEC(decrement)

  • DEC指令对操作数减1(减量)

  • DEC指令不影响进位CF标志,按定义设置其他状态标志

    image-20240730181213127

1
2
3
4
5
6
7
8
9
10
11
12
13
;算法运算类指令
;32位加法/减法
mov ax,0ffffh
sub bx,bx
mov cx,1
sub dx,dx
add ax,cx
adc bx,dx ;带借位加法
sub ax,cx
sbb bx,dx ;带借位减法
add bx,1
inc bx
dec bx

0000 FFFF+0000 0001的结果为0001 0000

image-20240730175920424

0001 0000-0000 0001的结果为0000 FFFF

image-20240730181618450

INC BX使BX+1,DEC BX使BX-1

image-20240730181723275

求补指令NEG(negative)

  • NEG指令对操作数执行求补运算:用零减去操作数然后结果返回操作数

  • 求补运算也可以表达成:将操作数按位取反后加1

  • NEG指令对标志的影响与用零作减法的SUB指令一样

    image-20240730182116674

1
2
3
;补码
mov ax,1
neg ax

1取补码为FFFF

image-20240730190655500

比较指令CMP(compare)

  • CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志

  • CMP指令执行的功能与SUB指令,但结果不回送目的操作数

    image-20240730190951668

1
2
3
mov ax,1
mov bx,1
cmp ax,bx

结果为0,说明比较的结果为相等

image-20240730191149314

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

乘法指令

image-20240730192438581

1
2
3
4
5
6
7
8
9
10
;乘法
mov al,2
mov bl,3
mul bl ;无符号 ax=al*bl
mov al,-1
imul bl;有符号 16bit*16bit=32bit

mov ax,2
mov bx,4
mul bx ;16bit*16bit=32bit

有符号乘法与无符号乘法

image-20240730204123318

16位乘16位

image-20240730204211824

除法指令

image-20240730203847032

image-20240730203858136

1
2
3
4
5
;除法
mov dx,0
mov ax,1234h
mov bx,100h
div bx

1234除100的结果为12余34

image-20240730204703424

符号扩展指令

不影响标志位,符号扩展指令常用于获得倍长的数据

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
2
3
4
5
6
7
8
9
10
11
12
13
;除法
mov dx,0
mov ax,1234h
mov bx,100h
div bx

mov dx,0
cbw ;byte=>word
mov al,0ffh

mov ax,-8
cwd ;word=>dword
idiv bx

扩展后为AH为00h

image-20240730210333050

若把AL改为FF则扩展完AH为FFh

image-20240730210530331

扩展完DX为FFFFh

image-20240730210723085

若把AX改为0010则扩展完AH为0000h

image-20240730210823427

扩展后继续运算,-8除100的余数为-8

image-20240730211108779