汇编语言指令详解 下载本文

例如:

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