19、NEG(求补) 写法:NEG reg/mem 作用:求补就是求相反数,即:dest=0-dest; 20、CMPXCHG(比较交换) 写法:CMPXCHG reg/mem, reg; 作用:AL/AX/EAX-oprd1,如果等于0,则oprd1=oprd2,否则,AL/AX/EAX=oprd1; 即:比较AL/AX/EAX与第一个操作数,如果相等,则置ZF=1,并复制第二个操作数给第一个操作数;否则,置ZF=0,并复制第一个操作数给AL/AX/EAX。 说明:CMPXCHG主要为实现原子操作提供支持 CMPXCHG8B(8字节比较交换指令) 写法:CMPXCHG8B MEM64; 功能:将EDX:EAX中的64位数与内存的64位数进行比较,如果相等,则置ZF=1,并存储ECX:EBX到mem64指定的内存地址;否则,置ZF=0,并设置EDX:EAX为mem64的8字节内容 21、MUL(无符号乘法) 写法:MUL reg/mem; 作用:当操作数为8位时,AX=AL*src; 当操作数为16位时,DX:AX=AX*src; 当操作数为32位时,EDX:EAX=EAX*src; 22、IMUL(带符号位乘法) 写法:IMUL reg/mem;(作用同上) IMUL reg16,reg16/mem16,imm16; IMUL reg32,reg32/mem32,imm32; IMUL reg16,imm16/reg16/imm16; IMUL reg32,reg32/mem32/imm32; 注意:没有两个操作数均为8位的多操作数乘法。 对于同一个二进制数,采用MUL和IMUL执行的结果可能不同,设AL=0FF,BL=1,分别执行下面的指令,会得到不同的结果: Mul bl; AX=0FFH(255); Imul bl; AX=0FFFFH(-1)(高一半为低一半的扩展) 23、DIV(无符号除法 )/IDIV(带符号数除法) 写法:DIV reg/mem;/IDIC reg/mem 作用:如果操作数是8位,AX%SRC,结果商在AL、余数在AH中; 如果操作数是16位,DX:AX%SRC,结果商在AX,余数在DX中; 如果操作数是32位,EDX:EAX%SRC,结果商在EAX,余数在EDX中; 注意:不能直接实现8位数除8位数、16位数除16位数、32除32,若需要这样,则必须先把除数符号扩展或零扩展到16、32、64位,然后用除法指令。 对于IDIV,余数和被除数符号相同,如:-5 IDIV 2 = 商 -2,余数:-1; 在下列情况下,会使CPU产生中断:一:除数为0 ;二:由于商太大,导致EAX\AX或AL不能容纳,从而产生了溢出。 -----------------BCD码调整指令(十进制调整指令)待补充------------------------------------------------ 24、关于BCD码:BCD码就是一种十进制数的二进制编码表示,分为压缩BCD码和非压缩BCD码,压缩BCD码用4个二进制位表示一个十进制位,即用0000B~1001B表示十进制0~9,如0110 0100 0010 1001B表示6429 用8位二进制来表示一个十进制叫非压缩BCD码,其中,低四位与压缩BCD码相同,高四位无意义。 压缩BCD码调整指令包括DAA(加法的压缩BCD码调整)和DAS(减法的压缩BCD码调整) 写法: DAA; 作用:调整AL中的和为压缩BCD码。 功能:使用DAA指令时,通常先执行ADD/ADC指令,将两个压缩BCD码相加,结果存放在AL中,然后使用该指令将AL调整为压缩BCD码格式。 DAA的调整算法: IF(AL低4位>9 或 AF=1) THEN AL=AL+6; AF=1; ENDIF IF( AL高4位>9或CF=1) THEN AL=AL+60H; CF=1; ENDIF 说明:CF反映压缩BCD码相加的进位。 DAS; 作用:调整AL中的差为压缩BCD码。 功能:使用DAS指令时,通常先执行SUB/SBB指令,将两个压缩BCD码相减,结果存放在AL中,然后使用该指令将AL调整为压缩BCD码格式。 DAS的调整算法: IF(AL低4位>9 或 AF=1) THEN AL=AL-6; AF=1; ENDIF IF( AL高4位>9或CF=1) THEN AL=AL-60H; CF=1; ENDIF 说明:CF反映压缩BCD码相减的借位。 特别注意,如果使用DAA或DAS指令,则参加加法或减法运算的操作数应该是压缩BCD码,如果将任意两个二进制数相加或相减,然后调整,则得不到正确的结果。 关键是调整的规则,其中AF标志位就是专门为BCD码调整设计的,当低四位有向高四位进位或借位时,值为1。而CF就是最高位有进位或者借位时,为1. 非压缩BCD码调整指令,包括AAA,AAS,AAM,AAD。 写法:AAA ; 作用:调整AL中的和为非压缩BCD码;调整后,AL高4位等于0,AH=AH+产生的CF 功能:使用AAA指令时,通常先执行ADD/ADC指令,以AL为目的操作数,将两个非压缩BCD码(与高位无关)相加,然后使用AAA将AL调整为非压缩BCD码格式,且高4位等于0,同时,将调整产生的进位加到AH中。 A
AA调整算法: IF(AL低4位>9 或者 AF=1) THEN AL=AL+6; AH=AH+1; AF=1; CF=1; ELSE AF=0;CF=0; ENDIF AL=AL AND OFH;;AL高4位清0 写法:AAS ; 作用:调整AL中的差为非压缩BCD码;调整后,AL高4位等于0,AH=AH-产生的CF 功能:使用AAS指令时,通常先执行SUB/SBB指令,以AL为目的操作数,将两个非压缩BCD码(与高位无关)相减,然后使用AAS将AL调整为非压缩BCD码格式,且高4位等于0,同时,将调整产生的借位从AH中减去。
|