例如:
MOV AL,FIRST;
MUL SECOND ;结果为AX=FIRST*SECOND MOV AX,THIRD;
MUL AX ;结果DX:AX=THIRD*THIRD MOV AL,30H
CBW ; 字扩展AX=30H MOV BX,2000H MUL BX ; (2) 带符号数乘法指令IMUL
一般格式:IMUL OPRD ;OPRD 为源操作数
这是一条带符号数的乘法指令,同MUL一样可以进行字节与字节、字和字的乘法运算。结果放在AX或DX,AX中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。
4.除法指令
(1) 无符号数除法指令 DIV 一般格式:DIV OPRD (2) 带符号数除法IDIV 一般格式:IDIV OPRD
该指令执行过程同DIV指令,但IDIV指令认为操作数的最高位为符号位,除法运算的结果商的最高位也为符号位。
在除法指令中,在字节运算时被除数在AX中;运算结果商在AL中,余数在AH中。字运算时被除数为DX:AX构成的32位数,运算结果商在AX中,余数在DX中。
例如:AX=2000H,DX=200H,BX=1000H,则 DIV BX执行后,AX=2002H ,DX=0000。
除法运算中,源操作数可为除立即寻址方式之外的任何一种寻址方式,且指令执行对所有的标志位都无定义。
由于除法指令中的字节运算要求被除数为16位数,而字运算要求被除数是32位数,在8086/8088系统中往往需要用符号扩展的方法取得被除数所要的格式,因此指令系统中包括两条符号扩展指令。
21
(3) 字节扩展指令CBW 一般格式:CBW
该指令执行时将AL寄存器的最高位扩展到AH,即若D7=0,则AH=0;否则AH=0FFH。
(4) 字扩展指令CWD 一般格式:CWD
该指令执行时将AX寄存器的最高位扩展到DX,即若D15=0,则DX=0;否则DX=0FFFFH。
CBW、CWD指令不影响标志位。 5.十进制调整指令
计算机中的算术运算,都是针对二进制数的运算,而人们在日常生活中习惯使用十进制。为此在8086/8088系统中,针对十进制算术运算有一类十进制调整指令。
在计算机中人们用BCD码表示十进制数,对BCD码计算机中有两种表示方法:一类为压缩BCD码,即规定每个字节表示两位BCD数;另一类称为非压缩BCD码,即用一个字节表示一位BCD数,在这字节的高四位用0填充。例如,十进制数25D,表示为压缩BCD数时为:25H;表示为非压缩BCD数时为:0205H,用两字节表示。
相关的BCD转换指令见表2-2。 例如:
ADD AL,BL
DAA
若执行前:AL=28H,BL=68H,则执行ADD后:AL=90H,AF=1;再执行DAA指令后,正确的结果为:AL=96H,CF=0,AF=1。
MUL BL AAM
若执行前:AL=07,BL=09,则执行MUL BL
后,AX=003FH,再执行AAM指令后,正确的结果为:AH=06H,AL=03H。
注意:BCD码进行乘除法运算时,一律使用无符号数形式,因而AAM 和
表2-2 十进制调整指令
指令格式 DAA DAS AAA AAS AAM AAD 指令说明 压缩的BCD码加法调整 压缩的BCD码减法调整 非压缩的BCD码加法调整 非压缩的BCD码减法调整 乘法后的BCD码调整 除法前的BCD码调整 22
AAD应固定地出现在MUL之前和DIV之后。
三、 逻辑运算和移位指令 包括逻辑运算、移位和循环移位指令
1.逻辑运算指令
(1) 一般格式:NOT OPRD
功能:对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。例如:NOT AL
(2) 一般格式:AND OPRD1,OPRD2
功能:对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。 其中目的操作数OPRD1可以是累加器、任一通用寄存器,或内存操作数(所有寻址方式)。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。
8086/8088的AND指令可以进行字节操作,也可以进行字操作。 例如: AND AL,0FH ;可完成拆字的动作 AND SI,SI ; 将SI清0 (3) 一般格式:TEST OPRD1,OPRD2
功能:完成与AND指令相同的操作,结果反映在标志位上,但并不送回。通常使用它进行测试,
例如 若要检测 AL中的最低位是否为1,为1则转移。可用以下指令: TEST AL,01H JNZ THERE …… THERE:
若要检测CX中的内容是否为0,为0则转移。该如何做呢? (4) 一般格式:OR OPRD1,OPRD2
功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。 其中,目的操作数OPRD1,可以是累加器,可以是任—通用寄存器,也可以是一个内存操作数(所有寻址方式)。源操作数OPRD2,可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。
AND AL,0FH
23
AND AH,0FOH OR OR OR
AL,AH ; 完成拼字的动作 AX,0FFFH ;将AX低12位置1 BX,BX ; 清相应标志
(5) 一般格式:XOR OPRD1,OPRD2
功能:对两个指定的操作数进行“异或”运算,结果送回目的操作数。 其中,目的操作数OPRD1可以是累加器,可以是任一个通用寄存器,也可以是一个内存操作数(全部寻址方式)。源操作数可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。例如:
XOR AL,AL ;使AL清0 XOR SI,SI ;使SI清0
XOR CL,0FH ;使低4位取反,高4位不变
逻辑运算类指令中,单操作数指令NOT的操作数不能为立即数,双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数。它们对标志位的影响情况如下:NOT不影响标志位,其它四种指令将使CF=OF=0,AF无定义,而SF、ZF和PF则根据运算结果而定。
2.移位指令
(1)算术/逻辑移位指令 ① 算术左移或逻辑左移指令
SAL/SHL OPRD,M ;
② 算术右移指令 SAR OPRD,M ③ 逻辑右移指令 SHR OPRD,M M是移位次数,可以是1或寄存器CL
这些指令可以对寄存器操作数或内存操作数进行指定的移位,可以进行字节或字操作;可以一
次只移1位,也可以移位由寄存器CL中的内容规定的次数 (2)循环移位指令
ROL OPRD,M ;左循环移位 ROR OPRD,M ;右循环移位 RCL OPRD,M ;带进位左循环移位
24