乘除指令,判断绝对值,三目运算符
1. 乘法指令
1.1 无符号乘法MUL
MUL r8/m8 ;AX<--AL * r8/m8
MUL r16/m16 ;DX.AX<--AX * r16/m16
MUL r32/m32 ;EDX.EAX<--EAX * r32/m32
1.2 有符号乘法IMUL
IMUL r8/m8 ;AX<--AL * r8/m8
IMUL r16/m16 ;DX.AX<--AX * r16/m16
IMUL r32/m32 ;EDX.EAX<--EAX * r32/m32
从80386开始还有:
MUL r32, r32/m32 ;r32<--r32 * r32/m32
MUL r32, r32/m32, imm ;r32<--r32/m32 * imm
两个16位数相乘,如果结果还是16位,则OF=CF=0,此时DX仅仅是高位扩展或符号位描述,可以忽略DX。如果结果超过16位,则OF=CF=1,此时DX不仅包括高位扩展或符号位描述,还包括结果一部分的具体数值,不能忽略DX。


2. 除法指令
2.1 无符号数除法
DIV r8/m8 ;AL<--AX / r8/m8的商,AH<--AX/ r8/m8的余数
DIV r16/m16 ;AX<--DX.AX / r16/m16的商,DX<--DX.AX / r16/m16的余数
DIV r32/m32 ;EAX<--EDX.EAX / r32/m32的商,EDX<--EDX.EAX / r32/m32的余数
2.2 有符号数除法
IDIV r8/m8 ;AL<--AX / r8/m8的商,AH<--AX/ r8/m8的余数
IDIV r16/m16 ;AX<--DX.AX / r16/m16的商,DX<--DX.AX / r16/m16的余数
IDIV r32/m32 ;EAX<--EDX.EAX / r32/m32的商,EDX<--EDX.EAX / r32/m32的余数


当除法指令结果的商太大,用2/4字节无法正确表达时,会产生溢出,除以0也会溢出,如果是有符号除法,则。

- 符号扩展指令
CBW AX<--AL(Convert Byte to Word)
CWD DX.AX<--AX(Convert Word to Dword)
CDQ EDX.EAX<--EAX(Convert Dword to Qword)

例如计算-10/3,代码如下:
mov ax,-10
cwd
mov cx,3
idiv cx
由于除数是cx,所以被除数是dx.ax,cwd设置dx,否则会用之前残留的值。
- 按位与and,按位或or,按位异或xor,按位取反not
A xor A = 0
A xor 全1 = not A
A xor 全0 = A
求一个数的绝对值:abs(ax)
mov ax, A
cwd ;A是正数,dx=0000;A是负数,dx=FFFF;
xor ax, dx ;A是正数,ax不变;A是负数,ax = ~ax;
sub ax, dx ;A是正数,结果=ax-0;A是负数,结果=ax-(-1)=ax+1,结合上步,共同执行了取反加一,即求补(求负)的操作;
三目运算:A == 2 ? 6 : 9;
mov ax, A
sub ax, 2 ;A是2,则ax=0,否则ax != 0
neg ax ;求补,A是2则CF=0,否则CF=1
sbb ax, ax ;0-CF,A是2则ax=0,否则ax=-1
and ax, 3 ;A是2则ax=0,否则ax=3
add ax, 6 ;A是2则ax=6,否则ax=3+6=9
ax == cx ? dx : bx
sub ax,cx
neg ax
sbb ax,ax
and (bx-dx)
add dx
设X、Y、Z、V均为16位带符号数,分别存放在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处?
mov ax,X
imul Y ;dx.ax表示x*y
mov cx,ax
mov bx,dx ;bx.cx表示x*y
mov ax,Z
cwd ;dx.ax表示Z
add cx,ax
adc bx,dx ;高字+扩展+CF, bx.cx表示x*y+z
sub cx,540
sbb bx,0 ;bx.cx表示(x*y+z)-540
mov ax,V
cwd; ;dx.ax表示V
sub ax,cx
sbb dx,bx ;dx.ax表示v-(x*y+z-540)
idiv X ;(v-(x*y+z-540))/x,ax商,dx余数

浙公网安备 33010602011771号