|
运算 算术运算指令,逻辑运算指令,移位指令 一、算术运算指令 1、加减法运算 ADD, ADC, INC, SUB, SBB, DEC, CMP,NEG 1.1、ADD 和 8086 功能,用法相同,不过支持 32 位操作,下面的语句都是合法的。 ADD ESI,EDI ADD EAX,DWORD PTR [1000H] 1.2、ADC,带进位的加法指令,即 OPRDS+OPRDD+CF,其中 OPRDS 代表源操作数, OPRDD 代表目的操作,CF 代表进位标志位,功能和用法与 8086 相同,支持 32 位操作。 1.3、SUB,和 8086 相同,支持 32 位操作。 1.4、SBB,带进位的减法指令,即 OPRDD-OPRDS-CF,其中 OPRDS 代表源操作数, OPRDD 代表目的操作数,CF 代表进位标志位,功能和用法与 8086 相同,支持 32 位操作。 1.5、DEC,减 1 操作,功能和用法与 8086 相同,支持 32 位操作。 1.6、CMP,比较操作,功能和用法与 8086 相同,支持 32 位操作。 1.7、NEG,求补操作,功能和用法与 8086 相同,支持 32 位操作。 1.8、INC 加 1 操作,功能和用法与 8086 相同,支持 32 位操作。 2、乘除法指令 MUL, DIV, IMUL, IDIV 2.1、MUL,无符号数乘法指令,和 8086 功能用法一样,即指令中只给出一个操作,被乘 数已默认,如果指令给出的操作数是 32 位的话,被乘数默认为 EAX,那么乘积将存放在 EDX:EAX 中,其中 EDX 存放高 32 位,EAX 存放低 32 位,如果此时 EDX=0,即高 32 位为 0 的话,那么 OF=0,CF=0,否则被置 1。如果指令给出的操数作是 16 位的话,被乘 数默认为 AX 那么乘积将放在 DX:AX 中,其中 DX 中将存放高 16 位,AX 中存放低 16 位。如果指令给出的操作数是 8 位的话,被乘数默认为 AL,那么乘积将放在 AX,AH 中存 放高 8 位,AL 中存放低 8 位。 2.2、DIV,无符号数的除法指令,和 8086 一样,指令给出一个操作数,被除数已默认。 如果指令中给出的操作数为 32,那么被除数将是 EDX:EAX, 最终的商将存放在 EAX, 余 数将存放在 EDX 中。如果指令给出操作数为 16 位,那么被除数为 EAX,最终得到的商放 在 AX,余数放在 EAX 的高 16 位。如果指令中给出的操作数为 8 位,那么被除数是 16 位, 最终得到的商将放在 AL 中,余数放在 AH 中。 2.3、IMUL,有符号数的乘法指令,除了具有 8086 的用法外,有新的形式: 2.4、1.IMULDST,SRC;将源操作数 SRC 与目的操作 DST 相乘,并将结果送往 DST。 2.5、2.IMUL DST,SRC1,SRC2;将源操作数 SRC1 与源操作数 SRC2 相乘,并将结果送往 DST。 使用这种形式必须遵守的规则,形式 c1 指令中目的操作数必须是 16 位或 32 位通寄存器, 源操作数的长度必须与目的操作的长度一样(8 位立即数除外,即 00H-FFH 或 80H-7FH), 源操作数可以是通用寄存器,也可以是存储单元或立即数。形式 c2 指令中的源操作数 SRC1 可以是通用寄存器也可以是存储单元,源操作数 SRC2 必须是立即数,DST 必须是 16 位或 32 位通用寄存器。呵呵,对于这些规则无需去问为什么,这是硬件的特性决定的,如果一 定要问为什么,那只能问 INTEL 公司的硬件工程师了 。同时,有一点要注意的是:这两种 形式的指令,目的寄存器的长度与源操作数长度一样(8 位立即数除外),这样的话,该指 令事实上对有符号数和无符号数是一样的,因为乘积的低位部分均存储在目的寄存器中,而
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtml1/01/clip_image001.gif 高位部分在这两种形式的指令中不予以存储。 2.6、IDIV,有符号数的除法指令,用法和 8086 相同,不过支持 32 位操作。 三、符号扩展指令 CBW,CWD,CWDE,CDQ 3.1 CBW,前面已介绍 3.2 CWD,前面已介绍。 3.3 CWDE,是 80386 新增的指令。格式:CWDE。功能:将 AX 的符号位扩展到 EAX 的 高 16 位中。 3.4 CDQ,是 80386 新增的指令。格式:CDQ。功能,将 EAX 的符号位扩展到 EDX 中。 3.5 以上四条指令均不影响标志位。 四、逻辑运算指令和移位指令 NOT, AND, OR, XOR, TEST, SAL, SAR, SHL, SHR, ROL, ROR, RCL, RCR 4.1NOT,AND,OR,XOR,TEST 这些指令的功能和用法与 8086 完全相同,不过它们支持 32 位操作。 4.2 TEST,测试指令,该指令测试的结果并不回送到目的操作数和源操数。之所以要使用 这条的指令,主要是因为根据 TEST 指令得到的结果,进行程序的条件转移。 4.3 SAL(Left),算术左移,功能和 8086 一样,但在 8086 中,如果在移位的位数超过 1 位, 那么一定要移位的位数放在 CX 寄存器中。在 80386 中,可以不用这样做,其它的移位指令 也一样。除了这一点以外,用法和 8086 一样,当然也支持 32 位操作。以下的语句均是合法 的。 SHL AL,5;这在 8086 中是非法,但在 80386 中是合法的 SHL WORD PTR[SI],3 4.4 SAR(Right),算术右移,将操作数右移指定的位数,但左边的符号位保持不变,移出 的最低位进入 CF 标志位。 4.5 SHL,逻辑左移,用法和功能与 SAL 一样。 4.6 SHR,逻辑右移,将操作右移指定的位数,同时每移一位,左边用 0 补充,移出的最 低位进入 CF 标志位。 4.7 说明:SAL, SHL 相当于乘法;SAR,SHR 相当于除法。 4.8 ROL,循环左移,支持 32 位操作数,用法和 8086 一样。 4.9 ROR,循环右移,支持 32 位操作数,用法和 8086 一样。 5.0 RCL,带进位的循环左移,支持 32 位操作数,用法和 8086 一样。 5.1 RCR,带进位的循环右移,支持 32 位操作数,用法和 8086 一样。 8 的二进制 1000 SAL 1 位之后 16 作业:自己看二进制数据以及汇编相关资料,搞明白,SAL,,SHL,SAR,SHR,ROL, ROR,RCL,RCR 的移位方式。
|