乘除指令,判断绝对值,三目运算符

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也会溢出,如果是有符号除法,则。

 

 

 

 

  1. 符号扩展指令

CBW  AX<--ALConvert Byte to Word

CWD  DX.AX<--AXConvert Word to Dword

CDQ  EDX.EAX<--EAXConvert Dword to Qword

 

 

 

例如计算-10/3,代码如下:

mov ax,-10

cwd

mov cx,3

idiv cx

由于除数是cx,所以被除数是dx.axcwd设置dx,否则会用之前残留的值。

 

 

  1. 按位与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=0000A是负数,dx=FFFF

xor ax, dx ;A是正数,ax不变;A是负数,ax = ~ax

sub ax, dx ;A是正数,结果=ax-0A是负数,结果=ax-(-1)=ax+1,结合上步,共同执行了取反加一,即求补(求负)的操作;

 

 

三目运算:A == 2 ? 6 : 9;

mov ax, A

sub ax, 2 ;A2,则ax=0,否则ax != 0

neg ax ;求补,A2CF=0,否则CF=1

sbb ax, ax ;0-CFA2ax=0,否则ax=-1

and ax, 3 ;A2ax=0,否则ax=3

add ax, 6 ;A2ax=6,否则ax=3+6=9

 

 

 

ax == cx ? dx : bx

sub ax,cx

neg ax

sbb ax,ax

and (bx-dx)

add dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XYZV均为16位带符号数,分别存放在XYZV存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处?

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))/xax商,dx余数

posted @ 2020-09-10 17:07  八转达人  阅读(674)  评论(0)    收藏  举报