Transcript 汇编语言程序设计:前言
Assembly Language Programming
汇编语言程序设计
主讲人
刘雪洁
0
第2章 80x86的指令系统
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
指令格式
寻址方式
数据传送类指令
算术运算类指令
位操作类指令
串操作类指令
控制转移类指令
处理机控制类指令
1
2.1 指令格式
计算机是通过执行指令序列来解决问
题的。计算机的指令系统就是指该计算机
能够执行的全部指令的集合。
指令的一般格式:
[标号:] 操作符 OPD, OPS [;注释]
算术运算和位操作类指令的部分单操
作数指令的格式:
[标号:] 操作符 OPD [;注释]
2
2.2 寻址方式
2.2.1
2.2.2
2.2.3
2.2.4
2.2.5
2.2.6
2.2.7
2.2.8
立即寻址
寄存器寻址
直接寻址
寄存器间接寻址
变址寻址
基址加变址寻址
跨段问题
与转移地址有关的寻址方式
3
2.2.1 立即寻址
立即寻址方式中,指令操作码和操作数
都在存储器代码段中。
立即数可以是用8位或16位二进制补码表
示的有符号数。
功能:常用于给寄存器赋初值,只能用
于源操作数字段,且源操作数与目的操
作数长度应一致。
4
【例】MOV AX, 10
执行后(AX)=?
该例中源操作数为立即寻址方式,立即数
为10,存放在指令的下一单元。
图形表示:
执行:10→AX
执行后:(AX)=000AH
5
2.2.2 寄存器寻址
寄存器寻址方式的操作数在指令指明的寄存器
中。
【例】下列程序执行后,(AX)=?,(BX)=?
MOV AX,1234H
MOV BX,5678H
ADD AX,BX
该 程 序 中 MOV 指 令 为 数 据 传 送 指 令 操 作 符 ,
ADD指令为加法指令操作符,三条指令皆为双操作数
指令。第一、二条指令AX、BX皆为目的操作数地址,
为寄存器寻址方式。第三条指令中,AX为目的操作
数地址,BX为源操作数地址。源地址和目的地址皆
为寄存器寻址方式。
6
图形表示:
执行:1234H→AX
5678H→BX
(AX)+(BX)→AX
执 行 后 :( AX ) =68ACH , ( BX )
=5678H
7
2.2.3 直接寻址
汇编格式:①含有变量的地址表达式。
②段寄存器名:[EA] 。
功能:指令下一字单元的内容是操作数的有
效(偏移)地址EA。
图形表示:
8
【例】寄存器和存储器内容为:(AX)=1212H,
BUF为数据段定义的变量,其偏移地址是2000H,
(DS)=3000H,(32000H)=4545H。
执行指令:MOV AX ,BUF(MOV AX , [2000H])
执行后:(AX)=?
图形表示:
执行:(32000H)→AX
执行后:(AX)=4545H
9
2.2.4 寄存器间接寻址
寄存器间接寻址方式中,寄存
器的内容为操作数的偏移地址
EA,操作数在存储器中。
汇编格式:[R]
功能:操作数存放在存储器,
寄存器R存放操作数的偏移地址
EA。
10
偏移地址EA计算方法如下:
EA=
[SI]
[DI]
[BX]
[BP]
SI作间址寄存器。
DI作间址寄存器。
BX作间址寄存器。
BP作间址寄存器。
11
【例】寄存器和存储器内容分别为:(AX)=0,
(BP)=0030H,(SS)=2000H,(20030H)
=1234H
执行指令:MOV AX ,[BP]
执行后:(AX)=?
图形表示如下:
执行:(20030H)→AX
执行后:(AX)=1234H
12
2.2.5 变址寻址
变址寻址方式操作数的偏移地址EA为寄
存器的内容加位移量,操作数在存储器
中,又称为寄存器相对寻址。
汇编格式:X[R](X表示位移量,是8位
或16位二进制补码表示的有符号数)
功能:操作数存放在存储器,寄存器R的
内容加位移量X为操作数的偏移地址EA。
图形表示如下:
13
偏移地址EA计算方法如下:
14
【例】设执行前: (AX)=0040H,(BX)=0030H,
(DS)=2000H,(20036H)=0050H
执行指令:ADD 6[BX],AX
执行后:(AX)=?,(BX)=?,(DS)=?,
(20036H)=?
图形表示如下:
执行:(20036H)+(AX) →20036H
执行后:(AX)=0040H,(BX)=0030H,(DS)
=2000H,(20036H)=0090H。
15
2.2.6 基址加变址寻址
基址加变址寻址方式中,操作数的偏移
地址EA是指令中基址寄存器内容、变址
寄存器内容、位移量X三项之和,操作
数在存储器中。
汇编格式:X [BR+IR]
功能:操作数存放在存储器,BR的内容
加IR的内容加位移量X是操作数的偏移地
址EA。
16
图形表示:
操作数偏移地址EA计算方法如下
17
2.2.7 跨段问题
按前述规定:若选用BP作间址基址寄存器、变址
寄存器或基址寄存器,则操作数在堆栈段,操作
数的物理地址PA由堆栈段寄存器SS的内容左移4
位与偏移地址EA相加后形成;否则,操作数在数
据段,操作数的物理地址PA由数据段寄存器DS的
内容左移4位与偏移EA相加后形成。该规定为系
统默认状态。当要否定默认状态,到非约定段寻
找操作数时,必须用跨段前缀指明操作数的段寄
存器名。
18
汇编格式:段寄存器名:操作数地址。
功能:段寄存器名指明操作数属哪个段。
【例】 MOV
AX,DS:[BP]
MOV
CX,SS:[SI]
该例中,DS:,SS:均为跨段前缀,此时默
认状态无效,操作数的物理地址PA由段寄存
器内容左移4位加偏移EA形成。上述2条指令
的源操作数物理地址分别为:
PA1 =(DS)左移4位+[BP]
PA2 =(SS)左移4位+[SI
19
2.2.8 与转移地址有关的寻址方式
这种寻址方式用来确定转移指令及CALL指
令的转向地址。
段内直接寻址:转向的有效地址是当前IP
寄存器的内容和指令中指定的8位或16位位
移量之和。
位移量
IP寄存器
+
EA
这种方式的转向有效地址用相对于当前IP值
的位移量来表示,所以它是一种相对寻址方式。
20
指令中的位移量是转向的有效地址与当前IP值
之差,所以当这一程序段在内存中的不同区域运行
时,这种寻址方式的转移指令本身不会发生变化。
这种寻址方式适用于条件转移及无条件转移指令,
但当它用于条件转移指令时,位移量只允许8位,
无条件转移指令在位移量为8位时称为短跳转,位
移量为16位时称为近跳转。
例:JMP NEAR PTR PROGIA
JMP SHORT QUEST
其中,PROGIA和QUEST均为转向的符号地址,
在机器指令中,用位移量来表示。在汇编指令中,
如果位移量为16位,则在符号地址前加NEAR PTR;
如果位移量为8位,则在符号地址前加SHORT。
21
段内间接寻址:转向的有效地址是一个寄存器或
是一个存储单元的内容。这个寄存器或存储单元
的内容可以用数据寻址方式中除立即数以外的任
何一种寻址方式取得,所得到的转向的有效地址
用来取代IP寄存器的内容。
指令
数据寻址方式
转向的有效地址
根据数据寻址方 或
式计算出EA值
转向的有效地址
存储单元
这种方式以及以下的两种段间寻址方式都不
能用于条件转移指令,而JMP和CALL指令可以用四
种寻址方式中的任何一种。
22
例 : 设 (DS)=2000H,(BX)=1256H, 位 移 量
=20A1H,(232F7H)=3280H,(264E5H)=2450H.
指令:JMP BX
可求得转向地址为BX寄存器的内容,执行
该指令后(IP)=1256H
指令:JMP TABLE[BX]
执行该指令后(IP)=(16d*(DS)+BX+位移量)
=(20000+1256+20A1)
=(232F7)
=3280H
23
段间直接寻址:在指令中直接提供了转向段地址
和偏移地址,所以只要用指令中指定的偏移地址
取代IP寄存器的内容,用指令中指定的段地址取
代CS寄存器的内容就完成了从一个段到别一个段
的转移操作。 指令
IP寄存器
偏移地址
段地址
CS寄存器
指令的汇编语言格式可表示为:
JMP FAR PTR NEXTROUTINT
其中,NEXTROUTINT为转向的符号地址,FAR
PTR则是表示段间转移的操作符。
24
段间间接寻址:用存储器中的两个相继字的内容
来取代IP和CS寄存器中的原始内容,以达到段间
转移的目的。这里存储单元的地址是由指令指定
除立即数方式和寄存器方式以外的任何一种数据
寻址方式取得。
指令
数据寻址方式
存储器中两个相继字
根据数据寻址方
式计算出EA值
转向的有效地址
IP
转向的有效地址
CS
指令的汇编语言格式可表示为:
JMP DWORD PTR [INTERS+BX]
其中, [INTERS+BX]说明数据寻址方式为直接
寻址方式,DWORD PTR为双字操作符,说明转向地
址需要取双字为段间转移指令。
25
2.3 数据传送类指令
2.3.1 通用数据传送指令
2.3.2 堆栈操作指令
2.3.3 标志寄存器传送指令
2.3.4 地址传送指令
2.3.5 输入输出指令
26
2.3.1 通用数据传送指令
1.传送指令MOV
2.数据交换指令XCHG
3.查表转换指令 XLAT
27
1.传送指令MOV
语句格式:MOV OPD,OPS
功能:将源操作数传送入目的地址,源地址内
容不变。即(OPS)→OPD。
下图描述了MOV指令在传送数据时允许传送的
路径及类型。
注:CS不允许
做目的
操作数.
28
【例】存储器与寄存器间数据传送。
MOV AX,BUF ;BUF是变量,源操作数为直接寻址
MOV BH,[DI]
;源操作数为寄存器间接寻址
MOV DI,ES:3[SI] ;源操作数为变址寻址,使用跨
段前缀
MOV BP,3[BX+SI]
;源操作数为基址加变址寻址
MOV BUFA,DL ;BUFA是一字节变量
MOV [BP],AX ;使用SS段寄存器
MOV DS:[BP],DL
;使用跨段前缀
MOV BUF,DS ;BUF是个字变量
MOV ES ,BUF
29
2.数据交换指令XCHG
语句格式:XCHG OPD,OPS
功能:将源地址与目的地址中的内容互换。即
(OPD)→OPS,(OPS)→OPD。
【例2.9】寄存器与存储器之间数据交换。
MOV
AX,5678H ;(AX)=5678H
MOV
BX,0FFFFH ;(BX)=0FFFFH
XCHG
AX,BX
; ( AX ) =0FFFFH ,
( BX)=5678H
30
3.查表转换指令 XLAT
语句格式:XLAT OPS或XLAT
功能:将(BX)为首址,(AL)为
位移量的字节存储单元中的数据
送AL寄存器。即([BX+AL])→AL。
31
2.3.2 堆栈操作指令
1.进栈指令PUSH
2.出栈指令POP
32
1.进栈指令PUSH
语句格式: PUSH OPS
功能:将寄存器、段寄存器或存储器
中的一个字数据压入堆栈,堆栈指针
减2。
即:
①(SP)-1→SP (OPS)15~8→[SP]
②(SP)-1→SP (OPS)7~0→[SP]
33
2.出栈指令POP
语句格式: POP OPD
功能: 将栈顶元素弹出送至某一寄存器、段
寄存器(除CS外)或存储器,堆栈指针加2。
从POP指令功能可看出,该指令为PUSH指令的
逆过程。
即:
①([SP])→(OPD)7~0 (SP)+1→SP
②([SP])→(OPD)15~8 (SP)+1→SP
34
2.3.3
标志寄存器传送指令
1.标志送AH指令LAHF
2.AH送标志指令SAHF
3.标志寄存器进栈指令PUSHF
4.标志寄存器出栈指令POPF
35
1.标志送AH指令LAHF
语句格式:LAHF
功能:将标志寄存器的低8位送入AH寄
存器。
即(FLAGS) 7-0→AH。该指令的执行对
标志位无影响。
【例】标志寄存器传送。
执行前:(FLAGS)=0485H,(AX)=0FFFFH
执行指令:LAHF
执行后:(FLAGS)=0485H,(AX)=085FFH
36
2.AH送标志指令SAHF
语句格式:SAHF
功能:将AH的内容送入标志寄存器的低
8位,高8位不变。即(AH) →FLAGS7-0。
从该指令功能可看出,SAHF为LAHF的逆
过程。
37
3.标志寄存器进栈指令PUSHF
语句格式:PUSHF
功能:将标志寄存器的内容压入
堆栈。即(FLAGS)→↓(SP)。
38
4.标志寄存器出栈指令POPF
功能: 将栈顶内容弹出送入标志寄存器中。即
↑(SP)→FLAGS。
POPF指令与PUSHF指令互为逆过程。
【例】将标志寄存器的单步标志TF置位。
PUSHF
;(FLSGS)→↓(SP)
POP AX ;(SP)→AX
OR AX, 0100H
;设置D8=TF=1
PUSH AX ;(AX)→↓(SP)
POPF;(SP)→↓FLAGS,即(AX)→↓FLAGS
39
2.3.4
地址传送指令
1.传送偏移地址指令 LEA
2.传送偏移地址及数据段首址指令LDS
3.传送偏移地址及附加数据段指令LES
40
1.传送偏移地址指令 LEA
语句格式: LEA OPD,OPS
功能:主存按源地址的寻址方式计算偏
移地址,将偏移地址送入指定寄存器。
【例2.15】主存偏移地址的获取。
MOV BX,0100H ;(BX)=0100H
MOV SI, 0210H ;(SI) =0210H
LEA BX,1234[BX+SI] ;(BX)=1544H
41
2.传送偏移地址及数据段首址指令LDS
语句格式:LDS OPD,OPS
功能:将主存中指定字单元数据
送入指定存储器,下一字单元数
据送DS寄存器。
即(OPS)→OPD,(OPS+2)→DS。
42
3.传送偏移地址及附加数据段指令LES
语句格式:LES OPD,OPS
功能:将主存某字单元内容送指定寄
存器。即(OPS)→OPD,(OPS+2)
→ES。
43
2.3.5 输入输出指令
1.输入指令IN
2.输出指令OUT
44
1.输入指令IN
输入指令用来从指定的外设寄存器取
信息送入累加器。它有四种形式:
(1)语句格式:IN
AL,PORT
功能:(PORT) →AL
(2)语句格式:IN
AX,PORT
功能:(PORT) →AX
(3)语句格式:IN
AL,DX
功能:([DX]) →AL
(4)语句格式:IN
AX,DX
功能:([DX]) →AL
45
2.输出指令OUT
输出指令用来把累加器的内容送往指定的外
设存储器,它有四种形式:
(1)语句格式:OUT
PORT,AL
功能:(AL) →PORT
(2)语句格式:OUT
PORT,AX
功能:(AX) →PORT
(3)语句格式:OUT
DX,AL
功能:(AL) →[DX]
(4)语句格式:OUT
DX,AX
功能:(AX) →[DX]
46
在80x86中,所有I/0端口与CPU之间的通信都由
IN和OUT指令来完成。其中IN完成从I/0到CPU的
信息传送,而OUT则完成从CPU到I/0的信息传送。
CPU只能用累加器(AL或AX)接收或发送信息。外
部设备最多可有65536个I/0端口,端口号为
0000H-FFFFH。其中前256个端口可以直接在指
令中指定,当端口大于等256时,必须先把端口
号放到DX寄存器中,然后再用IN或OUT来传送
信息。
例:IN AX,28H
MOV DA,AX
这两条指令把端口28的内容经过AX传送到
存储单元DA中。
例:OUT 5,AL
这条指令从AL寄存器输出一个字节到端口5.
47
2.4 算术运算类指令
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5
2.4.6
加法指令
减运算指令
乘运算指令
除运算指令
符号扩展指令
十进制调整指令
48
2.4.1 加法指令
1.加1指令 INC
2.加指令ADD
3.带进位加指令ADC
49
1.加1指令 INC
语句格式:INC OPD
功能:将目的操作数加1,结果送目
的地址。即(OPD)+1→OPD。
INC指令是一个单操作数指令,操作
数可以是寄存器或存储器操作数。
如:INC BX,即(BX)+1→BX。
加1指令可用于对计数器和地址指针
进行调整。
50
2.加指令ADD
语句格式:ADD OPD, OPS
功能:将目的操作数与源操作数相
加,结果存入目的地址中,源地址
的内容不改变。
即(OPD)+(OPS)→OPD。
3.带进位加指令ADC
语句格式:ADC OPD,OPS
功能:将目的操作数加源操作数再
加低位进位,结果送目的地址。
即(OPD)+(OPS)+CF → OPD。
51
【例】无符号双字加法运算。
MOV AX,4652H
;(AX)=4652H
ADD AX,0F0F0H
;(AX)=3742H, CF=1
MOV DX,0234H
;(DX)=0234H
ADC DX,0F0F0H
;(DX)=0F325H, CF=0
52
2.4.2 减运算指令
1.减1指令DEC
2.减指令SUB
3.带借位减指令 SBB
4.求补指令NEG
5.比较指令 CMP
53
1.减1指令DEC
语句格式:DEC OPD
功能:将目的操作数减1,结果送
目的地址。即(OPD)-1→OPD。
DEC指令是一个单操作数指令,操
作数可以是寄存器或存储器操作数。
如:DEC CX。即(CX)-1→CX。
减1指令DEC也一般用于对计数器和
地址指针的调整。
54
2.减指令SUB
语句格式:SUB
OPD,OPS
功能:目的操作数减源操作数,结果存于
目的地址,源地址内容不变。
即(OPD)-(OPS)→OPD
【例】减法运算。
MOV AX ,5678H
;(AX)=5678H
SUB AX ,1234H
;(AX)=4444H
MOV BX ,3354H
;(BX)=3354H
SUB BX ,3340H
;(BX)=0014H
55
3.带借位减指令 SBB
语句格式:SBB OPD ,OPS
功能:目的操作数减源操作数再减低位借位
CF,结果送目的地址。
即(OPD)―(OPS)―CF → OPD
4.求补指令NEG
语句格式:NEG
OPD
功能:将目的操作数的每一位求反(包括符
号位)后加1,结果送目的地址。
即 0FFFF -(OPD)+1→OPD。
56
【例】求补运算。
MOV AX,0FF64H ;1111 1111 0110 0100
NEG AL ;(AX)=0FF9CH (1001 1100)
SUB AL,9DH ;(AX)=0FFFFH CF=1
NEG AX
;(AX)=0001H
DEC AL
;(AX)=0000H
NEG AX
;(AX)=0000H
57
5.比较指令 CMP
语句格式:CMP OPD,OPS
功能:目的操作数减源操作数,结果只影响标
志位,不送入目的地址。
即(OPD)-(OPS)。
【例】比较AL的内容数值大小。
CMP
AL,50;(AL)-50
JB
BELOW;(AL)<50,转到BELOW处执行
SUB
AL,50;(AL)>=50,(AL)-50→AL
INC
AH
;(AH)+1→AH
BELOW:
…
58
2.4.3 乘运算指令
1.无符号数乘法指令MUL
2.有符号乘指令IMUL
59
1.无符号数乘法指令MUL
语句格式: MUL OPS
功能: 若是字节数据相乘,(AL)与OPS相乘
得到字数据存入AX中;若是字数据相乘,则
(AX)与OPS相乘得到双字数据,高字存入DX、
低字存入AX中。
即字节乘法:(AL)* (OPS) →AX,
字乘法:(AX) * (OPS) →DX,AX
【例】无符号数0A3H与11H相乘。
MOV
AL,0A3H ;(AL)=0A3H
MOV
BL, 11H ;(BL)=11H
MUL
BL
;(AX)=0AD3H
60
2.有符号乘指令IMUL语句
格式:IMUL OPS
功能:字节乘法:(AL)*(OPS)→AX,
字乘法:(AX)*(OPS)→DX、AX。
IMUL指令除计算对象是带符号二进制数外,其
他都与MUL一样,但计算结果不同。
【例】有符号数0B4H与11H相乘。
MOV
AL,0B4H ;(AL)=B4H
MOV
BL,11H
;(BL)=11H
IMUL
BL
;(AX)=0FAF4H
61
2.4.4 除运算指令
1.无符号除指令DIV
2.有符号除指令IDIV
62
1.无符号除指令DIV
语句格式:DIV OPS
功能:
字节除法:(AX)/(OPS)→ AL(商)、AH(余数)
字除法:(DX、AX)/(OPS)→ AX(商)、DX(余数)
【例】写出实现无符号数0400H/0B4H运算的
程序段。
MOV
AX,0400H ;(AX)=0400H
MOV
BL,0B4H ;(BL)=0B4H
DIV
BL
;商(AL)=05H,余数(AH)=7CH
63
2.有符号除指令IDIV
语句格式:IDIV OPS
功能:
字节除法:(AX)/(OPS)→AL(商),AH(余数)
字除法:(DX,AX)/(OPS)→AX(商),DX(余数)
除法指令DIV和IDIV虽然对标志的影响未定义,
但可产生溢出。
【例】写出实现有符号数0400H/0B4H运算的
程序段。
MOV
AX,0400H ;(AX)=0400H
MOV
BX,0B4H ;(BX)=0B4H
IDIV
BX
;(AL)=0F3H,(AH)=24H
64
2.4.5 符号扩展指令
1.字节转换成字指令CBW
2.将字转换成双字指令CWD
65
1.字节转换成字指令CBW
语句格式:CBW
功能:将AL中的符号位数据扩展至AH。
【例】将字节数据扩展成字数据。
MOV
AL,0A5H
CBW
ADD
CBW
;(AL)=0A5H
;(AX)=0FFA5H
AL,70H
;(AL)=25H
;(AX)=0025H
66
2.将字转换成双字指令CWD
语句格式:CWD
功能:将AX中的符号位数据扩展至DX 。
【例】将字数据扩展成双字数据。
MOV
DX, 0
;(DX)=0
MOV
AX, 0FFABH
;(AX)=0FFABH
CWD
;(DX)=0FFFFH (AX)=0FFABH
67
2.4.6 十进制调整指令
1.压缩BCD码调整指令
2.非压缩BCD码调整指令
68
1.压缩BCD码调整指令
(1)加法的十进制调整指令DAA语句
格式:DAA
功能:如果AL寄存器中低4位大于9或辅助进位(AF)
=1,则(AL)=(AL)+6且(AF)=1;如果(AL)
>=0A0H或(CF)=1,则(AL)=(AL)+60H且(CF)
=1。同时,SF、ZF、PF均有影响。
【例】压缩BCD码的加法运算。
MOV AL,68H ;(AL)=68H,表示压缩BCD码68
MOV BL,28H ;(BL)=28H,表示压缩BCD码28
ADD AL,BL
;二进制加法:(AL)=68H+28H=90H
DAA
;十进制调整:(AL)=96H
;实现压缩BCD码加法:68+28=96
69
(2)减法的十进制调整指令DAS语句
格式:DAS
功能:如果(AF)=1或AL寄存器中低4位大于9,
则(AL)=(AL)-6且(AF)=1;如果(AL)
>=0A0H或(CF)=1,则(AL)=(AL)-60H且
(CF)=1。同时SF、ZF、PF均受影响。
【例】压缩BCD码的减法运算。
MOV
AL,67H ;(AL)=67H,表示压缩BCD码67
MOV
BL,28H ;(BL)=28H,表示压缩BCD码28
SUB
AL,BL ; (AL)=67H-28H=3FH
DAS
;十进制调整:(AL)=39H
;实现压缩BCD码减法:67-28=39
70
2.非压缩BCD码调整指令
(1)加法的非压缩BCD码调整指令AAA
语句格式:AAA
功能:如果AL的低4位大于9或(AF)=1,则:
(AL)=(AL)+6
(AH)=(AH)+1
(AF)=(CF)=1
且AL高4位清零。
否则:(CF)=(AF)=0
AL高4位清零。
71
(2)减法的非压缩BCD码调整指令AAS
语句格式:AAS
功能:如果AL的低4位大于9或(AF)=1,
则:(AL)=(AL)-6
(AH)=(AH)-1
(AF)=(CF)=1
AL高4位清零。
否则:(CF)=(AF)=0
AL高4位清零。
其他标志位OF、PF、SF、ZF不确定。
72
(3)乘法的非压缩BCD码调整指令AAM
语句格式:AAM
功能:被调整的乘积在AX中,对AL按10取模,
则:
(AL)/0AH→AH(商):AL(余数)
其中AH为商,AL为余数,标志位AF、CF、OF、
PF、SF、ZF受影响。
73
(4)除法的非压缩BCD码调整指令AAD
语句格式:AAD
功能:除法运算前,先调整被除数AX内容,使:
(AL)=(AL)+(AH)*0AH
(AH)=0
即把非压缩型十进制数变成二进制数。
74
2.5 位操作类指令
2.5.1 逻辑运算指令
2.5.2 移位指令
75
2.5.1 逻辑运算指令
1.求反指令NOT
2.逻辑乘指令AND
3.测试指令TEST
4.逻辑加指令OR
5.按位加指令XOR
76
1.求反指令NOT
语句格式:NOT OPD
功能:将目的地址中的内容逐位取反后送入
目的地址。即(OPD)→OPD
【例】逻辑非运算。
MOV AX,878AH ;(AX)=878AH
; 1000 0111 1000 1010 B
NOT AX,
;(AX)=7875H
77
2.逻辑乘指令AND
语句格式:AND OPD, OPS
功能:将目的操作数和源操作数进行逻辑乘运
算,结果存目的地址。
即(OPD)∧(OPS)→OPD。
该指令用于清除目的操作数中与源操作数置0
的对应位。说明:逻辑乘的运算法则为:
1∧1=1,1∧0=0,0∧1=0,0∧0=0
【例】将AL中第3位和第7位清零。
MOV
AL,0FFH
AND
AL,77H ;0111 0111 B
78
3.测试指令TEST
语句格式:TEST OPD,OPS
功能:源地址和目的地址的内容执行按位的逻
辑乘运算,结果不送入目的地址。
即(OPD)∧(OPS)。
【例】测试AX中的第12位是否为0,不为0则
转L。
TEST
AX,1000H ; 0001 0000 0000 0000B
JNE
L
79
4.逻辑加指令OR
语句格式:OR
OPD,OPS
功能:将目的操作数和源操作数进行逻辑加运
算,结果存目的地址。
即(OPD)∨(OPS)→OPD。
说明:逻辑加的运算法则为:1∨1=1,1∨0=1,
0∨1=1,0∨0=0。
【例】将AL寄存器中第3位和第7位置1。
MOV
AL,0
OR
AL,88H
80
5.按位加指令XOR
语句格式:
XOR
OPD,OPS
功能:目的操作数与源操作数做按位加
运算,结果送入目的地址。
即(OPD)⊕(OPS) →OPD。
说明:按位加的运算法则为;1⊕1=0,
1⊕0=1,0⊕1=1,0⊕0=0。
【例】按位加运算。
MOV
AL,45H
;(AL)=45H
XOR
AL,31H
;(AL)=74H
81
2.5.2
移位指令包括算术移位指令、逻辑移位指令和
循环移位指令,分别进行左移和右移操作。这
些指令均有统一的语句格式:
[标号:]操作符 OPD,1
或
移位指令
[标号:]操作符 OPD,CL
其功能为将目的操作数的所有位按操作符规定
的 方 式 移 动 1 位 或 按 寄 存 器 CL 规 定 的 次 数
(0~255)移动,结果送入目的地址。目的操作
数是8位(或16位)的寄存器数据或存储器数据。
82
1.算术左移和逻辑左移指令SAL(SHL)
语句格式:SAL OPD,1 或 SHL OPD,1
SAL OPD,CL 或 SHL OPD,CL
功能:将(OPD)向左移动CL指定的次数,最低
位补入相应的0,CF的内容为最后移入位的值。
SAL/SHL
SAR
2.算术右移指令SAR
语句格式:SAR OPD,1或SAR OPD,CL
功能:将(OPD)向右移动CL指定的次数且最高
位保持不变;CF的内容为最后移入位的值。
83
【例】算术右移运算。
MOV
BH,0F4H ; (BH)=0F4H,1111 0100B
MOV
CL, 2
;(CL)=2
SAR
BH, CL ;(BH)=0FDH,(CF)=0
该例语句“SAR BH,CL”实际上完成了(BH)/
4→BH的运算,所以,用SAR指令可以实现对有
符号数除2n的运算(n为移位次数)。
84
3.逻辑右移指令SHR
语句格式:SHR OPD,1或SHR OPD,CL
功能:将(OPD)向右移动CL规定的次数,最
高位补入相应个数的0,CF的内容为最后移
入位的值。
85
4.循环左移指令ROL
语句格式:ROL OPD,1或ROL LPD,CL
功能:将目的操作数的最高位与最低位
连成一个环,将环中的所有位一起向左
移动CL规定的次数。CF的内容为最后移
入位的值。
86
5.循环右移指令ROR
语句格式: ROR OPD,1或ROR OPD,CL
功能:将目的操作数的最高位与最低位连
成一个环,将环中的所有位一起向右移动
CL规定的次数,CF的内容为最后移入位的
值。
7
0 CF
87
6.带进位的循环左移指令RCL
语句格式: RCL OPD, 1
或 RCL OPD,CL
功能:将目的操作数连同CF标志一起向
左循环移动CL规定的次数。
88
7.带进位的循环右移指令RCR
语句格式:RCR OPD,1
或 RCR OD,CL
功能:将目的操作数连同CF标志一起向右
循环移动所规定的次数。
89
2.6 串操作类指令
串操作指令 :
数据传送类指令每次只能传送一个数
据,若要传送大批数据就需要重复编程,
这样就浪费了大量的时间和空间。为此
8086提供了一组处理主存中连续存放数据
串的指令,这就是串操作指令。
90
MOVS 串传送
CMPS 串比较
SCAS
串扫描
LODS
从串取
STOS
存入串
INS
串输入
OUTS
串输出
与上述基本指令配使用的前缀有:
REP
重复
REPE/REPZ 相等/为零则重复
REPNE/REPNZ
不相等/不为零则重复
91
1.重复前缀指令REP、REPZ、REPNZ
(1)REP :REP前缀用在MOVS、STOS 、LODS、INS
和OUTS指令前。
格式:REP string primitive
其中string primitive可为MOVS,LODS等
指令。
功能:
(1)如果(CX)=0,则退出REP,否则往下执行。
(2)(CX)=(CX)-1
(3)执行其后的串指令
(4)重复(1)-(3)
92
(2)REPZ/REPE:该指令一般用在CMPS、SCAS指令前。
格式:REPE(或REPZ) string primitive
其中string primitive可为CMPS或SCAS指令。
功能:
(1)如果(CX)=0或ZF=0时退出,否则往下执行。
(2)(CX)=(CX)-1
(3)执行其后的串指令
(4)重复(1)-(3)
与REP相比,除满足(CX)=0的条件可结束操作
外,还增加了ZF=0的条件,也就是说,如果两数相
等就可继续比较,如果遇到了两数不相等可提前结
束操作。
93
(3)REPNZ/REPNE :该指令一般用在CMPS、SCAS
指令前。
格式:REPE(或REPZ) string primitive
其中string primitive可为CMPS或SCAS指令。
功能:
(1)如果(CX)=0或ZF=1时退出,否则往下执行。
(2)(CX)=(CX)-1
(3)执行其后的串指令
(4)重复(1)-(3)
与REP相比,除满足(CX)=0的条件可结束操作外,
还增加了ZF=1的条件,也就是说,如果两数不相等
就可继续比较,如果遇到了两数相等可提前结束操
作。
94
2.传送指令MOVS
语句格式:① MOVS DST,SRC
② MOVSB——字节串传送
③ MOVSW——字串传送
其中后两种明确注明是传送字节还是字,第一种格式
则应在操作数中表明是字节还是字的操作.例如:
MOVS ES:BYTE PTR[DI],DS:[SI]
功能:将以SI为指针的源串中的一个字节(或字)存
储单元中的数据传送至以DI为指针的目的地址中去,
并自动修改指针,使之指向下一个字节(或字)存储
单元。
即:①(DS:[SI])→ES:[DI]。
② 当DF=0时,(SI)和(DI)增量。
当DF=1时,(SI)和(DI)减量。
95
③当操作为字节操作时,(SI)、(DI)增减量为1,当操
作为字操作时, (SI)、(DI)增减量为2。
④当该指令与前缀REP联用时,则可将数据段中的整
串数据传送到附加段中去,这里源串必须在数据段中,
目的串必须在附加段中,但源串允许使用段跨越前缀
来修改。在与REP联用时,还必须先把数据串的长度
值送到计数寄存器中,以便控制指令结束。因此在执
行该指令前,必做如下准备工作:
I.把存放在数据段中的源串首地址(如反向传送则
应是末地址)放入源变址寄存器中;
II.把将要存放数据串的附加段中的目的串首址(反
向传送时为末地址)放入目的变址寄存器;
Ⅲ.把数据串长度放入计数寄存器;
Ⅳ.建立方向标志。
96
例:在数据段中有一个字符串,其长度为17,要求把它们转
送到附加段中的一个缓冲区中。
data segment
mess1 db ‘personal computer$’
data ends
extra segment
mess2 db 17 dup(?)
extra ends
code segment
assume
cs:code,ds:data,es:extra
…
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
…
lea si,mess1
lea di,mess2
mov cx,17
cld
rep movsb
…
code ends
97
3.串比较指令CMPS
语句格式:①CMPS SRC,DST ——需指定操作类型字
②CMPSB——字节串比较
③CMPSW——字串比较
功能:将SI所指的源串中的一个字节(或字)存储单元
中的数据与DI所指的目的串中的一个字节(或字)存储
单元中的数据相减,并根据相减的结果设置标志,但结
果并不保存。
即:①([SI])-([DI])。
② 修改串指针,使之指向串中的下一个元素。当
DF=0 时 ,( SI )和(DI)增量 。 当DF=1时,( SI)和
(DI)减量。
③当操作为字节操作时,(SI)、(DI)增减量为1,当操
作为字操作时, (SI)、(DI)增减量为2。
98
4.串搜索指令SCAS
语句格式:① SCAS DST
② SCASB——字节串搜索
③ SCASW——字串搜索
功能:AL(字节)或AX(字)中的内容与DI所指的目的串
中的一个字节(或字)存储单元中的数据相减,根据相减
结果设置标志位,结果不保存,
即:① 字节操作:(AL)-([DI]),字操作:(AX)-
([DI])。
② 修改指针使之指向串中的下一个元素。当DF=0时,
(DI)增量。当DF=1时,(DI)减量。
③当操作为字节操作时,(SI)、(DI)增减量为1,当操
作为字操作时, (SI)、(DI)增减量为2。
99
以上3,4两条串处理指令和REPE或REPNE
相结合,可以用来比较两个数据串,或从一
个字符串中查找一个指定的字符。
当要求从一个字符串中查找一个指定的
字符,可用指令REPNZ SCASB。
当要求比较两个字符串,找出它们不相
区配的位置,则可以使用指令REPE CMPSB。
100
5.从源串中取数指令LODS
语句格式:① LODS SRC
② LODSB——从字节串中取数
③ LODSW——从字串中取数
功能:将SI所指的源串中的一个字节(或字)存储单
元中的数据取出来送入AL(或AX)中。
即:
① 字节操作:([SI])→AL,字操作:([SI])
→AX。
② 修改指针SI,使它指向串中的下一个元素。
当DF=0时,(SI)增量。当DF=1时,(SI)减量。
③当操作为字节操作时,(SI)、(DI)增减量为1,
当操作为字操作时, (SI)、(DI)增减量为2。
101
6.往目的串中存数指令STOS
语句格式:① STOS DST
② STOSB——往字节串中存数
③ STOSW——往字串中存数
功能:将AL或AX中的数据送入DI所指的目的串中的字
节(或字)存储单元中。
即:
① 字节操作:(AL)→[DI],字操作:(AX)
→[DI]。
② 修改指针DI,使之指向串中的下一个元素。当
DF=0时,(DI)增量)。当DF=1时,(DI)减量。
③当操作为字节操作时,(SI)、(DI)增减量为1,
当操作为字操作时, (SI)、(DI)增减量为2。
102
对串处理指令,需注意:
(1)串处理指令在不同的段之间传送或比较数据,
如果需要在同一段内处理数据,可以在DS和ES中设
置同样的地址,或者在源操作数字段使用段跨越前
缀来实现。例如:
MOVS [DI],ES:[SI]
(2)当使用重复前缀时,(CX)是每次减1的,因此
对于字指令来说,预置时设置的值应该是字的个数
而不是字节数。
103
2.7 控制转移类指令
2.7.1
2.7.2
2.7.3
2.7.4
2.7.5
条件转移指令
无条件转移指令
循环指令
子程序调用指令
中断指令
104
2.7.1 条件转移指令
1.简单条件转移指令
2.无符号数条件转移指令
3. 有符号数条件转移指令
它们都有通用的语句格式和功能。
语句格式:[ 标号:]
功能:如果条件满足,
操作符
短标号
则(IP)+位移量→IP。
105
1.简单条件转移指令
106
2.无符号数条件转移指令
【例】比较无符号数大小,将较大的数存放
AX寄存器。
CMP
AX, BX ;(AX)-(BX)
JNB
NEXT ;若AX>=BX,转移到NEXT
XCHG AX,BX ;若AX<BX,交换
NEXT:…
107
3. 有符号数条件转移指令
【例】比较有符号数大小,将较大的数存放在
AX寄存器。
CMP
AX,BX
;(AX)-(BX)
JNL
NEXT
;若AX>=BX,转移到NEXT
XCHG
AX,BX
;若AX<BX,交换
NEXT:…
108
2.7.2 无条件转移指令
其中:段内直接短转移:JMP SHORT OPR(IP加8位位移量)
段内直接近转移:JMP NEAR PTR OPR(IP加16位位移量)
段内间接转移:JMP WORD PTR OPR
段间直接转移:JMP FAR PTR OPR
段间间接远转移:JMP DWORD PTR OPR
执行:(EA)->(IP),(EA+2)->CS
109
2.7.3 循环指令
1.循环指令LOOP
2.相等/为零循环指令LOOPE
3.不相等/不为零循环指令LOOPNE
4.CX为零转移指令JCXZ
110
1.循环指令LOOP
语句格式: LOOP 短标号
功 能 : ( CX ) - 1 ≠0 , 则 程 序 转 移 ( 循
环);否则,顺序执行。
说明:使用LOOP指令可代替两条指令:
DEC CX
JNE 短标号
2.相等/为零循环指令LOOPE
语句格式:① LOOPE 短标号
② LOOPZ 短标号
功能:(CX)-1 ≠0且ZF=1,则程序转移
(循环);否则,顺序执行。
111
3.不相等/不为零循环指令LOOPNE
语句格式:① LOOPNE 短标号
② LOOPNZ 短标号
功能:(CX)-1≠0且ZF=0,则程序转移
(循环);否则,顺序执行。
4.CX为零转移指令JCXZ
语句格式: JCXZ 短标号
功 能 : ( CX ) - 1≠0 , 则 程 序 转 移 ( 循
环);否则,顺序执行。
112
例:有一串L个字符的字符串存储于首地址为ASCII_STR的
存储区中,如要求在字符串中查找“空格”(ASCII码为
20H),找到则继续执行,未找到则转到NOT_FOUND去执行。
MOV CX,L
MOV SI,-1
MOV AL,20H
NEXT:INC SI
CMP AL,ASCII_STR[SI]
LOOPNE NEXT
JNZ NOT_FOUND
…
NOT_FOUND:
…
113
2.7.4
子程序调用指令
子程序结构相当于高级语言中的过程。为便
于模块化程序设计,往往把程序中某些具有独立
功能的部分编写成独立的程序模块,称为子程序。
1.子程序调用指令CALL
(1)段内直接调用
格式:CALL DST
执行操作:PUSH (IP)
(IP)<-(IP)+D16
DST给出转向地址,D16为机器指令中的位移量,
是转向地址和返回地址之间的差值。
114
(2)段内间接调用
格式:CALL DST
执行操作:PUSH (IP)
(IP)<-(EA)
指令中的DST可使用寄存器寻址方式或任一
种存储器寻址方式,由指定的寄存器或存储单
元的内容给出转向地址。
(3)段间直接调用
格式:CALL DST
执行操作:PUSH (CS)
PUSH (IP)
(CS)<-DST指定段地址
(IP)<-DST指定偏移地址
115
(4)段间间接调用
格式:CALL DST
执行操作:PUSH (CS)
PUSH (IP)
(IP)<-(EA)
(CS)<-(EA+2)
EA是由DST的寻址方式确定的有效地址,可
用任一种存储器寻址方式来取得。
2.返回指令RET
(1)语句格式:RET ;(IP)<-POP()
(2)语句格式:RET EXP;
在完成出栈操作后,还要修改堆栈指针
116
2.7.5 中断指令
有时系统运行或者程序运行期间在遇到某些
特殊情况时,需要计算机自动执行一组专门的例
行程序来进行处理,这种情况称为中断,所执行
的这组程序称为中断例行程序或中断子程序。
当CPU响应一次中断时,也要把(IP)和(CS)入
栈,同时为了全面保存现场信息,以便在中断处
理结束时返回现场,还需要把反映现场状态的
(FLAGS)入栈,然后才转到中断例行程序去执行。
当从中断返回时,要恢复(IP)和(CS),也要恢复
(FLAGS)。
中断例行程序的入口地址称为中断向量。
117
1.中断调用指令INT
语句格式:INT n;n为中断类型,0-255
功能:①(FLAGS)→↓(SP),0→ IF、TF。
②(CS) →↓(SP),(4*n+2) → CS。
③(IP) →↓(SP),(4*n) → IP。
2.中断返回指令IRET
语句格式:IRET
功能:①↑(SP)→IP
②↑(SP) →CS
③↑(SP) → FLAGS
118
2.8 处理机控制类指令
2.8.1 标志位设置指令
2.8.2 CPU状态控制指令
119
2.8.1 标志位设置指令
1.进位标志操作指令
CLC 进位标志清0指令
CMC 进位位求反指令
STC 进位标志置1指令
2.方向标志操作指令
CLD 方向标志清0指令
STD 方向标志置1指令
3.中断标志操作指令
CLI 中断标志清0指令
STI 中断标志置1指令
120
2.8.2 CPU状态控制指令
1.空操作指令NOP:
该指令不执行任何操作,其机器码占有一
个字节单元,在调试程序时往往用这条指令占
有一定的存储单元,以便在正式运行时用其他
指令取代。
2.总线封锁前缀指令LOCK:
该指令是一种前缀,可与其他指令联合,
用来维持总线的锁存信号,直到与其联合的指
令执行完为止.
3.暂停指令HLT:
该指令可以使机器暂停工作,使处理机处
于停机状态以等待一次外部中断的到来,中断
结束后可继续执行下面的程序.
121
4.交权指令ESC:
这条指令在使用协处理机时,可指定由
协处理器执行的指令.
5.等待指令WAIT:
该指令使处理机处于空转状态,它也可
以用来等外部中断发生,但中断结束后仍返
回WAIT指令继续等待.
122
本章小结
80x86与数据有关的寻址方式主要有:立即寻
址、寄存器寻址、直接寻址、寄存器间接寻址、
寄存器相对寻址、基址变址寻址、相对基址变
址寻址等。
与转移地址有关的寻址方式主要有段内直接寻
址、段内间接寻址、段间直接寻址和段间间接
寻址。
80x86的指令系统可分为以下6组:
数据传送指令
串处理指令
算术指令
控制转移指令
逻辑指令
处理机控制指令
返回本章 123