指令分类:
(1) 传送类指令
(2)算术运算类指令
(3)位操作指令
(4)串操作指令
(5)程序转移类指令
(6)处理器控制指令
指令规则
规则1:段寄存器不允许作为操作数(除MOV、PUSH、 POP指令)。
规则2:段寄存器不能直接用立即数赋值。
规则3: CS和立即数不能作目的操作数。
规则4:两个操作数不能同时为段寄存器。
规则5:两个操作数不能同时为存储器操作数(串指令除外)。
规则6:两个操作数的类型(字节类型或字类型等)必须一致。
规则7:指令中至少要有一-个操作数的类型是明确的,否则需用操作符PTR
临
一:传送类指令
1.mov传送指令
mov OPD,OPS
下面的指令是非法
(参见指令规则)
1.MOV AH,BX
;违反规则6 (操作数类型不匹配)
2.MOV DS, 2000H ; 违反规则2 (段寄存器不能直接用立即数赋值)
3.MOV DA_ BYTE,[BX]; 违反规则5 (两操作数不能同时为存储器操作数)
4.MOV CS, AX
;违反规则7 (操作数类型不明确)
5.MOV [DI], 50H
;违反规则4 (两操作数不能同时为段寄存器)
6.MOV DS, ES
2.XCHG 交换指令
xchg dest,src
功能:源操作数和目的操作数的内容相互交换。
说明:该指令与MOV指令相似,但在功能上有两点区别:
①该指令不允许使用立即数和段寄存器作为操作数;
②该指令改变源操作数的内容。
XCHG可以实现字节交换,也可以实现字交换。但不能在两个
存储单元之间执行数据交换过程。
XLAT查表指令
功能:将(BX) 为首址(AL)为位移量的字节存储单元中的数据
传送到AL。即: AL←([BX + AL])字节
在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。
3地址传送指令
地址传送指令主要用于将存储器操作数地址(偏移
地址、段地址)传送给指定的寄存器。
它包括3条指令:
LEA (取有效地址指令)
LDS (地址指针装入DS指令)
LES (地址指针装入ES指令)
3.1 LEA DEST,SRC
功能:将源操作数的有效地址EA传送给目的操作数指定的16位寄存器。
说明:①源操作数必须是存储器操作数,目的操作数必须是一个1 6位通用寄存器。
②本指令对标志位无影响。
③该指令通常用来建立内存储器的寄存器指针。
例: LEA AX,[2728H];
将2728H单元的偏移量送AX,
; AX中为2728H
3.2LES/LDS
-
LDS DEST,SRC
LES DEST, SRC
功能:将双字长SRC的低字内容(一般为偏移地址)送入DEST中,
高字内容(一般为16位段基址)送入DS (LDS)或ES (LES)。
说明:①源操作数必须是双字存储器操作数,低字单元中存放偏
移地址,高字单元中存放段基值;
目的操作数必须是一个1 6位通用寄存器,通常特定为SI。
②本指令不影响标志位。
4标志传送指令
标志位传送指令有4条指令:
LAHF(取标志指令)
SAHF(置标志指令)
PUSHF(标志进栈指令)
POPF(标志出栈指令)
4.1取标志指令LAHF
格式: LAHF
功能:将标志寄存器低8位的内容送入AH寄存器。
即: AH←(FLAGS)7-0 该指令的执行不影响标志位。
4.2置标志指令SAHF
格式: SAHF
功能:将AH的内容送入标志寄存器低8位,高8位保持不变。
说明: 用于设置或恢复SF、ZF、 AF、PF、 CF五个标志位。
只影响标志寄存器的低8位。
4.3标志进栈PUSHF
格式: PUSHF
功能:将标志寄存器的内容压入堆栈。
4.4标志出栈POPF
格式: POPF
功能:将栈顶字单元内容弹出到标志寄存器中,该指令的执行影响标志位。
说明:
1.PUSHF和POPF指令- -般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。
2.PUSHF和POPF互为逆过程。
3.标志位传送指令中SAHF和POPF指令将直接影响标志寄存器的内容。利用这一特性,可以方便地改变标志寄存器中指定位的状态。
总结
1用BX、SI、 DI来间接寻址时,默认的段寄存器为DS;用
BP来间接寻址时,默认的段寄存器为SS。
2CS寄存器的值可以压入堆栈,但反之则不允许。
3查表指令(XLAT)的操作数是- -种特殊的基址变址寻址方式,
基址寄存器为BX,变址寄存器为AL。
二:算数运算指令(二进制)
1加法
说明:
1:两操作数不能同时为存储器操作数;
操作数可以是字节或字,且两操作数的类型明确并一致。
2:?代表受影响; U代表不确定;代表不受影响
例如:
MOV AX, 4652H; (AX) =4652H
ADD AX,0F0F0H ; (AX) =3742H, CF=1 .
MOV DX, 0234H; (DX) =0234H
ADC DX,0F0F0H ; (DX) =0F325H, CF=0(加上进位CF)
2减法
说明:
- SBB(borrow):用于大于1 6位的多精度数的减法。
- DEC(decrease):用于计数和修改地址指针,不影响进位标志CF。
- NEG(negative):用于求操作数的负数,即:将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。NEG对标志位影响有特殊规定,如果被取补的操作数非0,NEG操作后,CF置1,否则CF= 0。(0-dest只要dest不为零必然产生进位)
例如
MOV AX,0FF64H
NEG AL ; (AX) =0FF9CH
SUB AL,9DH;(AX) =OFFH
NEG AX; (AX) =0001 H
DEC AL; (AX) =0000H
NEG AX; (AX) =0000H
CMP OPD,OPS
CMP:目的操作数减去源操作数,结果只影响标志位,不送入目的地址。
若两无符号数比较时:
当ZF = 0时,则OPD= OPS;
否则:当CF = 0时,则OPD> OPS;
当CF= 1时,则OPD< OPS。
若两有符号数比较时:
当ZF = 0时,则OPD= OPS;
否则:当OF= SF时,则OPD> OPS;
当OF≠SF时,则OPD < OPS。
CMP指令后面常跟着条件转移指令,根据比较结果产生不同的分支。
3乘法
说明:
- 乘法指令格式中只出现源操作数,根据这个操作数的类型(字节类型或字类型)决定是8位乘还是1 6位乘。
- src不能是立即数,目的操作数(被乘数)隐含约定为累加器AL (8位乘)或AX (16位乘),运算的结果约定在AX中(8位乘法的积)或DX:AX中(1 6位乘法的积)。
- MUL:若(结果中)AH或DX不等于零则必定产生进位与溢出即:CF=OF=1;
- IMUL:若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则为一。
例如:
MOV AL,0A3H; (AL) =0A3H
MOV BL,11H; (BL) =11H
MUL BL;(AX) =0AD3H
4除法
说明:
除法指令q P的操作数src为除数,它不能是立即数。
注意:
1)除法指令对标志位的影响无意义。
2)除数必须足够大,使得商值小于等于8位或1 6位数表示的
范围;否则,将产生除法错误。
符号位扩展(CBW、CWD):
若除数8位,则被除数应为16;若除数16位,则被除数应为32位。若被除数位数不够,则在除法前,应将被除数扩展到所需要的位数。
对于带符号数,这种扩展应该保持被扩展数的值(包括符号位)不变,因此应该是带符号位的扩展。
例如,0111 0000B应扩展成0000 0000 0111 0000B,
1111 0000B应扩展成1111 1111 111 1 0000B。(源码-1取反加上8个0再按位取反+1大小不变)
[例]将字节数据扩展成字数据。
MOV AL,0A5H; (AL)=0A5H———>转为二进制0000 1010 0101最高符号位为1为负数
CBW ; (AX)=0FFA5H——>扩展符号位
ADD AL ,70H; (AL)=25H——>转为二进制0111 0000最高位符号位为零为正数
CBW; (AX)=0025H
[例]将字数据扩展成双字数据。
MOV DX,0;(DX) =0
MOV AX,0FFABH ; (AX)=OFFABH——>二进制1111 1111 1010 1011最高位符号位为1是负数,符号位扩展1
CWD;(DX) =0FFFFH;(AX) =0FFABH
三:位操作指令
1逻辑运算指令
说明:
- NOT指令不影响标志。
2)其他逻辑指令:使OF=CF= 0,并影响ZF、SF和PF。 - TEST相当于AND运算,但是不保存结果,仅影响标志。主要
用于测试一个操作数(目的操作数)某- -位或几位的状态。
4)逻辑指令主要用于字节或字中某些位的组合、分离或位设置等。
AND
格式: AND dst, src
功能:将目的操作数与源操作数按位相与,结果送目的操作数。
AND指令常用于:
(a)使一个操作数中的若干位保持不变,而若干位清为0的场合。
(b)某一操作数,自己和自己相“与”,操作数不变,但可以使进位标志CF清0。
例] 将AL中第3位和第7位清零。
AND AL, 77H——>77H=0111 0111B
OR
格式: OR det, src
功能:将目的操作数与源操作数按位相或,结果送目的操作数。
OR指令常用于:
(a)若干位保持不变,而若干位置1的场合。保持不变的位与“0”
相或;置1的位与“1"相或。
(b)某一操作数,自己和自己相“或”,操作数不变,但可以
使进位标志CF清0。
[例]将AL寄存器中第3位和第7位置1。
OR AL, 88H——>88H=1000 1000
XOR
格式: XOR OPD, OPS
功能:将目的操作数与源操作数按位置异或,结果送目的操作数。
说明:
XOR指令常用于:
(a)若千位保持不变,而另外若干位取反的场合。
保持不变的与 "O”相异或;取反的与“1”相异或。
(b)使某一-操作数清0。如: XOR AX, AX ;AX清0。
(c)测试某一操作数是否与另一确定的操作数相等。
TEST
格式: TEST OPD, OPS
功能:目的操作数与源操作数按位相与,结果反映在标志位上,但不送回目的操作数。
即: (OPD) ^ (OPS)。
说明:
①完成与操作,但不改变目的操作数的值。
②常用于不改变原操作数的情况下,检测某几位的条件是否满足。编程时常与条件转移指令一起使用。
[例]测试AX中的第12位是
TEST AX,1000H
否为0,不为0则转L。
JNE L
NOT
格式: NOT OPD
功能:将目的操作数各位取反,结果送目的操作数。
即: OPD←(OPD)。
说明:若将整个操作数取反:则应使用NOT指令,若只需将操作数的一部分
位取反 :则应使用XOR指令
例如:逻辑非运算
MOV AX,878AH;(AX) =878AH
NOT AX; (AX) :7875H
总结
①屏蔽若干位。(常用指令)
AND AL, 01H ; 屏蔽AL的D7~D1,保留D0
AND AL, OFH;屏蔽AL高4位,保留低4位
②使若干位置1 (常用指令)
OR BL, 0FOH ; 使BL高4位置1,低4位不变
③清除CF、OF或设置标志
AND AL,AL (AND AL,OFFH; OR BL,BL; ..
......;类似指令没有改变目的操作数,但使CF=OF=0,也可能纯粹以设置其他
标志(ZF)为目的。
④求反
NOT AL / NOT WORD PTR[BX+ DI]
⑤对指定位求反
XOR AL,0FH ; AL高4位不变,低4位求反
XOR CL, 55H ; CL偶数位求反,奇数位不变
⑥清除寄存器及CF (常用指令)
XOR AX,AX / XOR BX,BX
⑦不改变操作数,测试操作数或操作数的指定位
TEST AL, 0FFH ;由ZF标志判断AL是否为零;
也可以用CMP指令。
TEST AL, 01;由乙F标志判断AL的D0是否为零
; ZF=1,则AL D0=0;
ZF=0,则AL D0=1
AND AL,01
;也可完成.上述功能,但是改变了目
;的操作数
四.移位指令
1逻辑左移SHL
[指令格式] SHL d1, d2
功能:把操作数d1的各个二进制位依次向左移动d2位,移动造成右边的空位填0,结果放回操作d1中。
[说明]
(1)操作数d1必须是通用寄存器或内存型寻址方式,必须有确定的类型,可以是字节型,也可以是字型,并且对内存型寻址方式可以使用段跨越。
(2)操作数d2表示移动的位数,只能是立即数1或者寄存器CL,当移动位数超过1位时,必须把移动位数放在CL中,以CL作为d,操作数。
(3)操作数d1各位移动从最高位起,将有d2位移到操作数d1之外,除了最后移出的一位放到标志位CF中之外,其余各位均被丢弃,移动造成右边的空位用0填充。
(4)该指令对具余标志位的影呵情况是:移动后的结果为0则ZF置1,否则ZF清0;移动后d1,最高位的值会复制到SF上;如果移动前后d1的最高位不同则OF置1,否则OF清0。
例如
AX=8D56H,CL=3
SHL AL,1;AL= 0ACH,CF= 0,AH不变
SHL AX,1;AX = 1AACH,CF= 1
SHL AH,CL;AH= 68H, CF=0,AL不变
SHL AX,CL;AX=6AD0H,CF=0
2算术左移
[指令格式] SAL d1,d2
[说明]这是一条与SHL完全相同的指令,该指令与SHL指令是同一条机器指令的两种不同写法。
3逻辑右移
[指令格式] SHR d,d,
[功能] 把操作数d1的各 个二进制位依次向右移动d2 位,
移动造成左边的空位填0,结果放回操作数d中。
(1)向右移出的最后一位放到CF中,右移造成左边的空位以0填充。
4算术右移
[指令格式] SAR d1,d2
[功能]把操作数d1的各个二进制位依次向右移动d2位,移动造成左边的空位填的原值的最高位,结果放回操作d1中。
[说明] SAR指令的功能基本上与SHR的一样,
仅仅是移动造成的空位填充方式不同,如果操作数d1移动前最高位是1,则移动造成的空位以1填充,否则以0填充
SAR指令执行的结果是把d1中的原值作为带符号数,除以并把除法的商放回d1中。
5循环左移
[指令格式] ROL d1,d2
[功能]把操作数d的各个二进制位向左移动d2位,
从d1左端移出的每一位再依次移到右端空出的位上,最后移出的一位还要送到CF中。可以把d1的各位看作是首尾相接的一个环状,如图7.4所示,把各位的值按逆时针方向旋转d2格,再从环原先的连接部断开,可以得到ROL指令执行后的结果。
6循环右移
与循环左移相似只是移动方向相反
7带进位的循环左移
[指令格式] RCL d1,d2
[功能]把操作数d1的各位与CF联合在一起,构成9个或者
17个二进制位,向左移动d2位,从左端移出的各位再依次移
到右端空出的位上。从功能上说,可以把d1的各位与CF一起,看作首尾相接
的一个环状,如图7.5所示,把各位按逆时针方向旋转d2格,再从环原先的连接部断开,可以得到ROL指令执行后的结果,包括CF的设置情况。
8带进位的循环右移
与带进位的循环左移相似只是移动方向相反
说明
逻辑移位与算术移位指令除了功能本身描述的二进制位的移动之外,还用于把一个字节型或字型数据乘以/除以2的n次。乘除法指令是所有8088指令中最耗时的,所花费的时间是加减法的20~ 30倍,是移位指令的35~50倍,因此如果能用移位指令和加减法指令代替乘除法指令,将大大提高程序的执行速度。