本章内容
指令的基本概念和指令所包含的基本内容。
8086指令的格式及编码方式。
8086指令的寻址方式及寻址过程。
8086指令系统的分类、功能及操作过程,每条指令的格式及用法。
学习目的
掌握指令及指令系统的基本概念。
掌握 8086各种寻址方式所执行的数据寻址过程。
牢固地掌握存储器段地址 ∶ 偏移地址的组织结构和段约定的基本概念。
掌握每条 8086指令的格式、功能及用法。
掌握指令的操作过程中操作数的变化情况以及对标志位的影响。
学会正确选用指令完成简单的任务。
5.1 概 述一、指令 (Instruction):
指令通常以二进制代码的形式提供给计算机,
这种指令称为机器指令 。
例,10001000 11011000
就是一条 2字节的机器指令,指示计算机执行:,把寄存器 BL内容复制到寄存器 AL之中,的操作 。 表示为,AL?BL。
指示计算机执行什么 操作的 命令 。
二、指令系统 (Instruction System):
三、程序 (Program),
完成某个特定任务而编制的一系列指令的 有序 集合 。
程序的执行一般是按指令的先后次序一条一条执行,但遇到转移类指令时则可能改变指令的执行次序 。
计算机所能执行的 全部 指令 。
四、指令包含的基本内容
1,做什么操作由指令的 操作码 字段规定。
2,操作数的来源操作数来自于什么地方 。 由指令的 操作数 字段规定 。
操作数的来源可以是:
a,CPU内的某个 寄存器 ;
b,存储器内的某一个或几个 单元 ;
c,I/O端口 。
3,操作结果的去向操作的 结果 将存放在何处。
4,下一条指令的位置指示下一条指令是 顺序 执行还是 转移 执行。
五、指令的种类
1,数据处理指令
2,数据传送指令
3,程序处理指令
4,状态管理指令六、指令的表示方法
1,二进制代码表示 —机器语言指令
2,助记符表示 —汇编语言指令例,10001000 11011000
例,MOV BL,AL
MOV表示,传送,助记符,BL( 寄存器 )
表示结果存放的位置,AL( 寄存器 ) 表示数据的来源 。
助记符表示的指令便于书写,理解和记忆,但最终必须将助记符指令,翻译,
成机器指令才能被识别和执行 。 这个过程叫,汇编,。
助记符指令 机器指令汇编
5.2 8086指令的格式及寻址一、编码方式一种 CPU能够执行的操作有上百种,将这些操作以 二进制代码 的形式科学,系统,合理地进行编排,这就是 编码格式 。
8086指令长度为 1~6字节。
1,无操作数指令指令只包含 1字节 操作码 OP,无操作数。
OP
2,单操作数指令指令只涉及一个操作数。
(1) 单操作数在 寄存器 中
a,单字节指令
OP REG
7 6 5 4 3 2 01
SEGOP OP
7 6 5 4 3 2 01
这里 REG代表通用寄存器的编码,SEG
代表段寄存器的编码 。
字操作 字节操作
AL
CL
DL
BL
AH
CH
DH
BH
REG=000
001
010
011
100
101
110
111
SEG = 00
01
10
11
AX
CX
DX
BX
SP
BP
SI
DI
ES
CS
SS
DS
例,DEC BX
指令编码,01001011 (4BH)
OP=01001:对某个 16位寄存器执行自减 1的操作
REG=011:该寄存器为 BX
例,PUSH CS
指令编码,00001110 (0EH)
OP=000110:对某个段寄存器执行压栈操作
REG=01:该寄存器为 CS
b,双字节指令这里双字节指令仍然为 单操作数,只是在指令编码中给出了更多的信息 。 如操作数是字节型还是字型,采用 8位还是 16位寄存器等 。
OP W MOD
15 8 7 6 5 4 3 2 1 0
OP R/M
OP OP
W=0,字节 操作
1,字 操作
MOD=11:操作数在 寄存器 中
00:
01:
10:
操作数在 存储器 中
R/M:寄存器编码或存储器偏移地址的形成方式
(2) 单操作数在 存储器 中指令长度可为 2~4字节,具体编码格式与寻址方式 (见以下描述 )有关 。
3,双操作数指令
(1) 两个操作数均在 寄存器 中 。
(2) 两个操作数,一个在 寄存器 中,另一个在 存储器 中 。
(3) 两个操作数,一个在 寄存器 中,另一个是指令给出的 立即数 。
(4) 两个操作数,一个在 存储器 中,另一个是指令给出的 立即数 。
二、寻址方式
地址,数据和指令存放的位置。
数据存放的位置可以是 寄存器,存储器或 I/O端口,指令存放的位置只能是存储器中的 代码段 。
寻址方式,寻找指令地址和操作数地址的方式。
寻址过程,形成指令地址和操作数地址的过程。
结果
AHAL
1,固定寻址 (隐含寻址 )
操作数在某个固定的 寄存器 中。
这个固定的寄存器大多为 AL或 AX。
例,AAA
操作,对固定寄存器 AL中的内容进行十进制调整,结果仍在 AL中 。 (可能影响 AH的内容 )
十进制调整影响
+1
送回
2,立即数寻址操作数作为 立即数 就在指令中给出。
例,MOV AX,1234H
操作,把立即数 1234H送寄存器 AX中 。
机器码,B8 34 12 (低字节在地址小的单元 )
AH AL
AX
...
B8
34
12
...
56 78
代码段 (存储器中 )
操作码 (B8)
操作数 (1234H)
立即数一条指令指令执行后,AX=1234H (原有的内容被新的内容替换 )。
12 34
MOV AX,1234H
3,寄存器寻址操作数在某个 寄存器 中。
例,INC BL
操作,使 BL中内容加 1后送回
+1
BL
00
若 BL=00H,则执行后 BL=01H
BL=FFH,则执行后 BL=00H (自动溢出 )
01
4,存储器寻址操作数在 存储器 中的一个或几个 单元 中 。
在这种寻址方式下,要找到该操作数,关键是必须找到该操作数所在单元的 地址 。
由于 8086采用存储器段组织结构,内存单元的地址由 段起始地址 (基地址 ) 和该单元与段起始地址之间的 距离 (以 字节数 计 ) 两部分共同决定 。
段起始地址 (基地址 ):某个段寄存器的内容
(又称 段基值 ) 乘以 16得到 。
段内偏移量,该单元与段起始地址之间的 距离 ( 字节数 ) 。 又称有效地址 EA。
有效地址 EA待寻址的内存单元
(CS,DS,ES,SS)?16?段基地址物理地址 =段基值?16+EA
内存单元物理地址
8086规定,在执行某种操作时,采用的段寄存器有一个预先的 约定 。 故指令中一般只需给出有关 EA的信息,则 CPU将能够根据该次操作 自动 选用 段寄存器,并与
EA一起形成 物理地址 。
存储器寻址的实质就是如何形成 有效地址 EA。
(1) 直接寻址方式指令中以偏移量方式 直接 给出操作数的有效地址 。 即
EA=指令中给出的偏移量例,MOV AX,[1234H]
机器码,A1 34 12
操作,把偏移量 1234H作为 EA,在 数据段 中找到相应的 字 单元,再将字单元的内容送 AX。
本例执行完后,
AX=3050H
EA=1234H
设 DS=3000H
31234H
1234H+ EA=1234H
31234H
56 7830 50
DS?16
=30000H 30000H
= 3000H× 16
...
A1
34
12...
...
50
30...
指令 代码段数据段
AH AL
AX
MOV AX,[1234H]
a,直接寻址的操作过程与立即寻址不同 。
为表示它们的区别,直接寻址的偏移量用一对,[ ]”表示 。
立即寻址,MOV AX,1234H
直接寻址,MOV AX,[1234H]
b,段基值乘以 16,相当于段基值 (二进制表示) 左移 4位,或段基值(十六进制表示)在 末尾添一个 0H。
注:
(2) 间接寻址方式以 间接 的方式得到有效地址 EA,有几个专用的寄存器可用于间接寻址,BX,BP,SI,DI。
a,基址寻址方式
以 BX作为基址寻址寄存器,操作数在 数据段 中 。
以 BP作为基址寻址寄存器,操作数在 堆栈段 中 。
EA=BX或 BP的内容 +8位或 16位位移量例,MOV AX,[BX]
机器码,8B 04
操作,以 BX的内容作为有效地址 EA,
在 数据段 中找到对应的字单元,再将该字单元的内容送 AX中 。
EA=BX (位移量为 0)
设 DS=2000H,BX=1000H
本例执行后 AX=50A0H
DS=2000H
DS?16 20000H
EA=BX(=1000H)
21000H
50 A0
8B
...
...04
A0
50
代码段数据段
AX
AH AL
这种寻址方式的优点就在于可以随时修改 BX寄存器的内容,而指向不同的存储单元 。 故 BX又称为基址指针寄存器 。
例,MOV AL,DATA[BP]
这里 DATA是以 符号 表示的 位移量 。
EA=BP+位移量 DATA
操作,以 EA作为有效地址,在 堆栈段 中去寻址 字节 单元,再将该字节单元内容送 AL。
b,变址寻址方式以 SI,DI寄存器作为 间接寻址 寄存器,操作数在 数据段 中 。
EA=SI或 DI内容 +8位或 16位位移量例,ADD AX,[SI]
EA=SI
操作,以 EA作为有效地址,在 数据段 中找到某个操作数,再将该操作数与 AX的内容相加,结果存放在 AX中 。
c,基址变址寻址方式既有基址寄存器 (BX或 BP),又有变址寄存器参与 (SI或 DI)寻址,操作数在 基址 寄存器所规定的段中 。
EA=BX或 BP+SI或 DI+8位或 16位位移量例,MOV AX,0260H [BX] [SI]
EA=BX+SI+0260H,操作数在 数据段 中
MOV AX,INF [BP+DI]
EA=BP+DI+位移量 INF,操作数在 堆栈段 中
* 以上两种基址 +变址的格式都是合法的。
(3) 串操作指令寻址这类指令规定,
源串 操作数在 数据段,且有效地址 EA=SI
目的串 操作数在 附加段,且有效地址 EA=DI
指令执行后,自动 修改 SI,DI的值,使之指向新的单元 。
8086的段约定
8086在执行某种操作时,预先 规定了采用的段寄存器和段,即有基本的 段约定 。 如果要改变默认的段约定,则 需要在指令中明确指出来 。
8086/8088的段约定存储器存取方式 基本段约定 允许修改的段 偏移地址取指令堆栈操作源串目的串用 BP作基址寄存器通用数据读写
CS
SS
DS
ES
SS
DS
无无
ES,CS,SS
无
CS,DS,ES
CS,ES,SS
IP
SP
SI
DI
EA
EA
5,I/O端口寻址方式
(1) 直接端口寻址操作数在某个 8位 或 16位 端口 中。
端口地址可以置于 DX中,但不能置于其它寄存器中。
端口的输入,输出数据只能置于累加器
AL或 AX中 。
注:
b,端口输出
OUT port,AL
a,端口输入
IN AL,port
port=端口地址 (8位,0~255)
例,IN AL,80H
操作,从端口地址为 80H的端口输入一字节送 AL。
(2) 间接端口寻址可以把端口地址送入 DX,然后进行端口寻址:
输入,IN AL,DX
输出,OUT DX,AL
注,① 若用 AX代替 AL,则表示 16位数据的端口 。
② 端口地址大于 255时,必须将端口地址送入 DX,即采用间接寻址端口方式 。
6,转移类指令的寻址方式前面所述的各种寻址方式实际上是 数据寻址 方式,关键是如何找到 操作数 。
转移类指令寻址方式属于 程序存储器寻址,关键是要找到下一条待执行指令的 地址 。
(1) 转移范围段内转移:转移范围在 同一个段 以内段间转移:从 一个 代码段转移至 另一个代码段
(2) 转移条件无条件转移有条件转移 (转移范围仅为 –128~+127)
(3) 转移方式直接转移 (转移目标 直接 在指令中给出 )
间接转移 (转移目标预先放入某个 寄存器 或 存储器 中 )
寻址方式小结:
固定寻址,操作数固定在某个 寄存器 中
寄存器寻址,操作数在某个 寄存器 中
立即数寻址,操作数就是操作码后跟的 立即数
存储器寻址直接寻址间接寻址串操作寻址基址寻址变址寻址基址 +变址寻址
I/O端口寻址直接端口寻址间接端口寻址
转移类指令寻址课堂练习与思考:
请指出下列每条指令源操作数的寻址方式。
(1) MOV AX,BX
(2) MOV CH,3AH
(3) MOV BX,[2000H]
(4) MOV DX,[BX]
(5) MOV CX,[BP+2]
(6) MOV AX,3[BX] [DI]
(7) MOV AL,ES:[SI]
(8) MOV BX,DS:[BP];寄存器寻址,操作数在 BX中;立即数寻址,操作数为 3AH;直接寻址,EA=2000H,数在数据段;间接寻址,EA=BX,数在数据段;间接寻址,EA=BP+2,数在堆栈段;间接寻址,EA=BX+DI+3,数在数据段;间接寻址,EA=SI,数在附加段;间接寻址,EA=BP,数在数据段
5.3 8086指令系统
8086指令按功能分为六大类。
8086指令系统数据传送指令算术运算指令逻辑运算指令串操作指令程序控制指令
CPU控制指令一、数据传送指令数据传送指令能够完成下列操作数的传送任务 。
立即数存储器段寄存器
CS,DS,ES,SS
通用寄存器组
AX,BX,CX,DX
BP,SP,SI,DI
(CS不能作目的 )
1,通用数据传送指令
(1) MOV d,s
功能,将源操作数 s复制到目标操作数 d,
源保持不变,目标被源代替 。
注,① d,s不能同时为存储器错误指令,MOV [BX],[SI] ×
② d不能为立即数错误指令,MOV 1234H,AX ×
③ d,s必须同时为字节型或字型错误指令,MOV AX,BL ×
指令后的分号,;,以后为注释部分,
对指令的执行没有任何影响,主要是便于阅读或解释指令的功能 。
例,MOV AX,0 ; AX?0,AX清 0
执行后,AX=0
MOV SI,BP ; SI?BP,BP内容送 SI
执行后,SI=BP,BP不变
MOV AL,BUFFERS ; BUFFERS内存单元内容送入 AL
这里,BUFFERS代表 符号地址,从该地址单元中取出内容送 AL寄存器 。
相当于直接寻址方式。
EA=BUFFERS偏移量
30
30HBUFFERS
AL
MOV AX,DATA [SI+BX]
EA=SI+BX+DATA,在数据段中寻找字单元,
取出该字单元的内容送入 AX。
设 DS=3000H,SI=200H,BX=1000H,DATA
的偏移量为 100H,则
EA=SI+BX+DATA=200H+1000H+100H=1300H
物理地址 =DS?16+EA=30000H+1300H=31300H
即从 31300H和 31301H两单元中取出内容送 AX。
DS?16 30000H
12 34
34H
12H
AX
AH AL
EA=1300H
DATA
SI
BX
DATA
31300H
31301H
MOV AX,DATA [SI+BX]
(2) PUSH s; SP–2? SP,
源 操 作 数 压入 堆栈 保存
POP d; SP所指堆栈 的 内容 送目 标,
SP+2? SP
例,PUSH BX;把 BX内容压入堆栈设 SS=2000H,SP=0040H,BX=2340H
则执行后,2340H被保存到堆栈,同时
SP=003EH,BX内容不变
SS?16 20000H
SP=0040H
(初值 )
20040H
2003EH 40
23
SP=003EH
(压栈后 )
XX
23 40BX
注,s和 d只能为 16位寄存器或存储器错误指令,PUSH 1234H
POP AL
×
×
(3) XCHG d,s ;交换源和目标操作数注,d=通用寄存器
s=通用寄存器或存储器例,XCHG AX,[SI+400H]
执行后,5678H被送到内存单元
AX=1234H
34
12
SI+400H
56 78
AH AL
AX 3412 78
56
(4) XLAT ; 查表转换注,a,表首相对于段起始地址的偏移量预先送入 BX中;
b,待查找的 表内 某单元相对于表首的 偏移量 送入 AL中;
c,以 EA=BX+AL在表中 ( 数据段 ) 查找,将查得的数据再送回 AL中 。
例,设表首的偏移地址为 2000H,要查找表内第 4号单元 (从 0号算起 )的内容并送回 AL,则程序段如下:
MOV BX,2000H
MOV AL,04H
XLAT
设表中内容如下页图所示,
则执行后,AL=09H
18H
34H
05H
06H
09H
2000H?BX
04H?AL
(表首 )TABLE
DS?16
04
AL
09
2,目标地址传送指令对于任一个存储器操作数,由段地址和偏移地址确定了它们在存储器中的位置 。 目标地址传送指令就用于获得存储器操作数的段地址或偏移地址 。
(1) LEA d,s
功能,取存储器源操作数 有效地址 送入目标 d
d=通用寄存器例,LEA BX,COUNTER;
取 COUNTER地址偏移量?BX
若 COUNTER地址偏移量为 0002H,则执行后
BX=0002H
(2) LDS d,s
功能,装入地址指针,段地址?DS,
偏移地址?d
这条指令往往改变了 段寄存器 DS的内容,使得 DS指向了另外一个数据段 。
例,LDS SI,BASE
设执行前,DS=1000H,SI=0000H,BASE
偏移地址为 0004H,10004H~10007H单元内容依次为 00H,30H,00H,20H,则执行后,DS=2000H,SI=3000H
00
30
00
20
0004H
SI=3000H
原 DS所指向的数据段新 DS所指向的数据段
1000H?16?10000H
DS
BASE
30 00
2000
SI
DS
2000H?16?20000H
DS
(3) LES d,s
功能,装入地址指针,段地址? ES,
偏移地址?d
3,标志位传送指令
(1) LAHF
功能,将标志寄存器 低 8位 装入 AH寄存器
(对应不变 )
SF ZF AF PF CFFR7~0
AH
(2) SAHF
功能,把 AH的内容送入标志寄存器的低 8位 。
(3) PUSHF
功能,把 16位的标志寄存器压入 堆栈保存,同时 SP–2?SP。
(4) POPF
功能,将 当前 SP所指内容 (2字节 )弹出至 标志寄存器,同时 SP+2?SP。
4,I/O数据传送指令功能:从指定端口输入数据至累加器 acc (AL或 AX) port=0~255
(1) IN acc,port
AH AL
acc
端口 port
16位数据时
(2) IN acc,DX
功能,从 DX指示的端口输入数据至累加器 acc,DX=0~65535
(3) OUT port,acc
功能:将累加器的数据输出至指定端口 。
(4) OUT DX,acc
功能,将累加器的数据输出到 DX所指示的端口 。
注,① 16位端口地址必须送入 DX中 。
② 若采用 AX,则表示 16位数据传送 (输入 /输出 )
二、算术运算指令
算术运算指令的操作数可以是无符号数,
也可以是有符号数 。
算术运算指令一般影响标志位,而数据传送指令一般不影响标志位 。
1,加法指令
(1) ADD d,s
功能,将 s与 d相加,结果在 d中 。 根据操作结果设置 标志位 。
例,ADD [BX+106BH],1234H
设 DS=2000H,BX=1200H,EA=1200H+106BH
=226BH
物理地址,2000H?16+226BH=2226BH
又设原来 (2226BH)=90H,(2226CH)=30H
则指令执行后,3090H+1234H=42C4H
即 (2226BH)=C4H,(2226CH)=42H
又? 42C4H=0100,0010,1100,0100B
标志位,CF=0,ZF=0,SF=0
AF=0,PF=0(5个 1),OF=0
(2) ADC d,s
功能,将 s与 d再与进位 CF相加,结果留在 d
中,ADC指令主要用于连续相加 。
例,MOV AX,0FH ; AX=000FH
ADD AL,0F1H ; AL+F1H?AL
ADC AH,0 ; AH+0+CF?AH
最后结果,AH=01H,AL=00H
注,若是立即数,且最高位为数码 A~F,则必须在前面添加一个 0,以避免混淆 。
(3) INC d
功能,将 d加 1后送回 d。
注,INC指令 不影响 进位标志 CF。
该指令经常用于修改地址指针寄存器
(BX,BP,SI,DI),使之指向下一个单元 。
2,减法指令
(1) SUB d,s
功能,d–s?d,同时 影响 标志位。
(2) SBB d,s
功能,d–s–CF?d,同时 影响 标志位。
(3) DEC d
功能,d–1?d
该指令与 INC相反操作,也 不影响 进位标志 CF。
(4) NEG d
功能,对 d进行求补运算后送回 (按位求反再加 1)。
例,MOV AL,7FH
NEG AL
结果,AL=7F按位求反 +1=80H+1=81H
(5) 比较指令 CMP d,s
功能,作一次减法运算 d–s,但 不送结果,
只根据结果 设置 标志位 。
比较指令往往用于判断两数是否相等,或两数大小关系 。 若相等,则零标志 ZF=1。
3,乘法指令乘法指令在指令中只出现一个操作数
s (乘数 ),另一个操作数固定在 累加器 (AX
或 AL)中 。
(1) MUL s
功能,无符号数乘法指令
a,8位乘法被乘数 =AL,乘数 =s
积 (16位 )=AH:AL中,即在 AX中
AH为高 8位,AL为低 8位。
AL (8位 )
s (8位 )?
AH AL (16位 )
b,16位乘法被乘数 =AX,乘数 =s
积 (32位 )=DX:AX
DX为高 16位,AX为低 16位。
AX (16位 )
s (16位 )?
DX AX (32位 )
例,MUL BX
若执行前 AX=0012H,BX=0066H
则执行后 DX=0000H,AX=072CH
(2) IMUL s
功能,有符号数乘法指令
8086规定,有符号数一般采用补码表示 。
故有符号数作乘法运算时,必须先把它们转变为原码数相乘,积也为原码数,再将原码数转变为补码数 。 这个工作由 CPU自动完成 。
例,MOV AL,88H; 88H为 –120的补码
MOV BL,2
IMUL BL
结果,AX=FF10H ; FF10H为 –240的补码若直接用 MUL BL指令,则 AX=0110H
4,除法指令
(1) DIV s
功能,无符号数相除
a,字节除被除数 =AX,除数 =s (s?0)
结果:商 =AL,余数 =AH
AL
AH AL
(8位 )
(16位 )...
AH (8位 )
s(8位 )
商余数
b,字除被除数 =DX:AX,除数 = s (s?0)
结果:商 =AX,余数 =DX
AX
DX AX
(16位 )
(32位 )...
DX (16位 )
s (16位 )
商余数注,如果除数太小,使得商超出了一个字节或字所能表示的范围,则会产生,被 0除,错误 。
例,MOV AX,800H
MOV BL,2
DIV BL
结果错误,“被 0除”
(2) IDIV s
功能,带符号数除法采用的固定寄存器与 DIV相同。
(3) CBW和 CWD
CBW:字节除法的符号扩展指令功能,若 AL为 正数 (D7=0) 则 AH=00H
AL为 负数 (D7=1) 则 AH=FFH
CWD:字除法的符号扩展指令功能,若 AX为 正数 (D15=0) 则 DX=0000H
AX为 负数 (D15=1) 则 DX=FFFFH
CBW和 CWD一般用于带符号数除法指令之前。
5,十进制调整指令运算器按二进制规律进行运算,如果参与运算的是 BCD码数,则需要对结果进行调整 。
1000 1001
0000 1001
0000 1000
组合 的 BCD码数未组合 的 BCD码数
89
9(低位 )
8(高位 )
代表
89
(1) AAA
功能,对 未组合型 BCD码加法 的结果进行校正
(调整 )。
校正 (调整 )方法:
若 AL中低 4位数值 > 9 或 AF = 1,则,
a,AL+6? AL,且 AL 高 4位清 0
b,AH+1? AH
否则不作调整。
(2) DAA
功能,对 组合型 BCD码加法 的结果进行校正 (调整 )。
DAA同时对 AL中 低 4位 和 高 4位 进行调整。
例,MOV AH,0
MOV AL,00000110B ; 代表 6
ADD AL,00000111B ; 代表 7
AAA
00000110 6
+ 00000111 7
调整 + 00000110
00001101
00010011 00000011?AL
清 0 00000000+1=00000001?AH
最后结果 AH = 01H,AL = 03H
例,组合 BCD码调整
MOV AL,00100111B ; 代表 27
ADD AL,10000110B ; 代表 86
DAA
+ 10000110
00100111
调整 + 01100110
10101101
1 00010011
进位 1
调整后结果:
CF=1,AL=00010011
(代表 13)
进位位与 AL合成结果,113
(3) AAS
功能,对 未组合型 BCD的减法 结果进行调整。
功能,对 组合型 BCD的减法 结果进行调整。
(4) DAS
最后结果 AL = 00110110B(代表 36),CF=0
例,MOV AL,01110011B (代表 73)
MOV BL,00110111B (代表 37)
SUB AL,BL
01110011
00110111
00111100
00110110
DAS
相减调整? 00000110
(5) AAM
功能,对未组合型 BCD的 乘法 结果进行调整。
例:
MOV AL,00001000B (代表 8)
MOV BL,00001001B (代表 9)
MUL BL
AAM
00001000
00001001
AL= 01001000 AH = 00000000
最后结果 AH = 00000111B (代表 7)
对结果进行调整,AL/00001010B=00000111B?AH
AL%00001010B = 00000010B?AL
AL = 00000010B (代表 2)
AH,AL中表示未组合型 BCD码 72。
(6) AAD
功能,对未组合型 BCD码 (在 AX中 )进行除法 前的校正 。
例,MOV AX,00000111 00000010B (代表 72)
AAD
调整前,AH = 00000111
AL = 00000010
调整后,AH = 00000000
AL = 00000111B?00001010B + 00000010B = 01001000B
7D 10D 2D 72D=48H
AAD相当于将两个未组合型 BCD码数合并为一个二进制数 。
三、逻辑运算和移位循环指令逻辑指令在底层软件中提供了对二进位的控制 。 可以对位进行置位,清 0或取反 。 常用于控制系统的 I/O设备 。
1,逻辑运算指令
(1) AND d,s
功能,s 和 d 按位 相,与,,结果在 d 中。
AND指令通常用于使某些位清 0,而另一些位保持不变 。
例,AND BX,0F0FH
若 BX=5555H,则执行后 BX=0505H
0101,0101,0101,0101B
0000,1111,0000,1111B
0000,0101,0000,0101B
AND
(2) OR d,s
功能,s 和 d 按位 相,或,,结果送 d 。
OR 操作经常用于将某些位置位,其它位不变 。
(3) XOR d,s
功能,s 和 d 按位 相,异或,,结果送 d 。
XOR 操作经常用于将某些位取反,其它位不变。
0101,0101,0101,0101B
0000,1111,0000,1111B
0101,1010,0101,1010B
XOR
例:
(4) NOT d
功能,将 d 按位求反 后送回。
(5) TEST d,s
功能,s 和 d 按位 相,与,,但不送结果,只根据结果 设置 标志位。
TEST 指令通常用于测试某些位是为 0还是为 1。
2,移位指令和循环移位指令
(1) 算术移位
a,算术左移
CF
01 0 1 1 0 1 0 10
CF
00 1 1 0 1 0 1 01
左移 1 次,SAL d,1
左移多次,SAL d,CL (CL中为移位次数 )
例,MOV BL,10001001B
SAL BL,1
结果,CF = 1,BL = 00010010B
0
CF
注,移位多次时,移位次数必须预先置入 CL中。
右移 1 次,SAR d,1
右移多次,SAR d,CL
b,算术右移
CF
符号位
(2) 逻辑移位
a,逻辑左移 SHL与 SAL等价。
b,逻辑右移 SHR d,1
SHR d,CL
CF
0
(3) 循环左移
a,不带进位循环左移
ROL d,1 ROL d,CL
CF
b,带进位循环左移
RCL d,1 RCL d,CL
CF
(4) 循环右移
a,不带进位循环右移
ROR d,1 ROR d,CL
CF
b,带进位循环右移
RCR d,1 RCR d,CL
CF
例,设 32位数在 DX,AX中,实现 32位数整个左移 1次 。
SAL AX,1
RCL DX,1
0
CF AX
SAL
DX
RCL
四、串操作指令
1,串的概念串是连续存放在内存中的字节块或字块。
每个串有一个起始地址和长度。
2,方向标志方向标志
DF选择串操作期间寄存器 DI,
SI 的自增 (DF=0)
或自减 (DF=1)
操作 。
起始地址 'A'
00H
'H'
'G'
'F'
'E'
'D'
'C'
'B'
串长 =8
字节块(
串)
3,串所在的段规定,(1) 源串在数据段,用 SI作地址指针
(2) 目的串在附加段,用 DI作地址指针如果源串与目的串实质上在一个段中,则要令 ES = DS。
4,串操作指令
(1) MOVS d,s
或写成 MOVSB (字节串 传送 )
MOVSW (字串 传送 )
功能,源串 DS,[SI] 目的串 ES,[DI]
同时自动修改 SI,DI
重复前缀 (REP)可以加到串数据传送指令上 。 REP前缀使得每次执行串指令后 CX减
1。 CX减 1以后,重复执行串指令,直到 CX
值为 0时,指令才终止 。
REP 无条件 重复直至 CX- 1→CX = 0
REPE/REPZ 当 ZF = 1且 CX- 1→CX≠0
则重复
REPNE/REPNZ 当 ZF = 0且 CX- 1→CX≠0
则重复
(2) 串比较 CMPS d,s
CMPSB (字节串 比较 )
CMPSW (字串 比较 )
功能,作一次 减法,DS,[SI] — ES,[DI]
但 不送结果,同时自动修改 SI,DI
串比较指令常常与有条件重复前缀配合。
(3) 串搜索 SCAS d
SCASB (字节串 搜索 )
SCASW (字串 搜索 )
功能,做一次 减法 AL —ES,[DI] (字节 )
AX —ES,[DI] (字 )
同时自动修改 DI
串搜索指令也常与有条件重复前缀相配合。
(4) 装载串 LODS s
LODSB (字节串 )
LODSW (字串 )
功能,DS,[SI] → AL或 AX
同时自动修改 SI
(5) 存储串 STOS d
STOSB (字节串 )
STOSW (字串 )
功能,AL或 AX → ES,[DI]
同时自动修改 DI
例 1,设源串在 1000H,2000H开始的 100个字节单元中,要求将源串送到 3000H,1020H开始的目的串中 。
MOV AX,1000H
MOV DS,AX ; 置源数据段寄存器
MOV SI,2000H ; 置源串指针初值
MOV AX,3000H
MOV ES,AX ; 置目的附加段寄存器
MOV DI,1020H ; 置目的串指针初值
CLD ; DF = 0,使 SI,DI自增
MOV CX,64H ; 置重复次数 100D
REP MOVSB ; 重复串传送,直到 CX = 0
初始化例 2,比较两个串,发现有不同的字符时则停止比较 。
CLD
MOV CX,100
MOV SI,2500H
MOV DI,1400H
REPE CMPSB ; 串比较,直到 ZF = 0或 CX=0才停止。
结果,若 ZF=0,则两个串不相等;
若 ZF=1,则两个串相等。
五、程序控制指令程序控制指令用来控制程序的走向,其实质 是设法改变当前的 CS和 IP值,以使 CPU
转移到一个新的地址处执行程序 。
1,无条件转移指令
(1) JMP 目标
a,段内 直接 转移格式 JMP 目标标号特点,仅仅改变 IP值,而 CS值不变。
例,JMP ADDI
这里 ADDI为转移目标的标号。
指令中的位移量 =标号偏移地址 -当前 IP值
E9 位移量 (低 ) 位移量 (高 )
操作码
EA IP(低 ) IP(高 ) CS(低 ) CS(高 )
转移指令 JMP有三种编码格式操作码
EB 位移量例,设标号偏移地址 =1000H,执行完 JMP指令后的当前 IP值为 0009H,则位移量 =1000H- 0009H = 0FF7H
编码格式 E9 F7 0F (代表 JMP 1000H)
b,段内 间接 转移格式,JMP BX
以 BX的内容作为转移目标的 偏移地址 。
CS值不变,IP值改变。
c,段间 直接 转移格式,JMP FAR_ADDR
功能,转移到另一 个代 码段 的目 标
FAR_ADDR处执行 。 即以另一个段的基地址 → CS,标号的偏移地址 → IP。
当前 CS=2100H
JMP
0C
02
00
65
转移目标的偏移地址转移目标的段地址
× 16 21000H
代码段 1
× 16 65000H
新 CS=6500H
代码段 2 转移至此当前 IP
=1500H
新 IP =
020CH
…
d,段间 间接 转移格式,JMP [ BX+位移量 ]
功能,以 有效地址 EA = BX +位移量 作为开始地址,从前 2个单元中取出内容 → IP,
后 2个单元中取出内容 → CS,以转移到新的地址执行程序。
例,JMP [ BX+ADDR3]
设 DS=2000H,BX=1400H,ADDR3=020AH,
则执行过程如下:
2000H
3000
4000
IP
CS
00
30
00
40
EA=1400H+020AH
执行跳转指令后,转移至 4000H,3000H
处执行程序 。
数据段
(2) CALL 目标 (过程名 )
CALL指令完成 调用子程序 的功能。
CALL指令完成的操作:
将程序的 返回地址 (CALL的下一条指令地址 )
压入 堆栈 中保存 。
将目标的 偏移地址 → IP。 若为远调用则再将目标的 段地址 → CS。
转移 至新的目标 (子程序 )
如果是近调用,则堆栈中只保存返回地址的偏移地址;若是远调用,则还必须保存返回地址的段地址 。
在子程序中 (过程 ),最后一条指令必须是返回指令 RET,它将堆栈中保存的返回地址自动弹出至 CS和 IP。
CALL指令段内调用段间调用直接调用间接调用直接调用间接调用
(近调用 )
(远调用 )
(3) RET n
返回指令 。 n为弹出值,它使 SP值在正常返回之后的基础上再加上 n (n为偶数 )。 这是为了丢弃原已压栈的一些参数 。
2,条件转移指令条件转移指令共有 18条,这些指令根据状态标志决定是否转移,转移的目标范围在 -128~ +127之间 。
条件转移指令的执行流程条件满足
?
顺序执行下一条指令目标处执行
N
Y,转移
(1) 无符号数条件转移指令设执行了指令 CMP AX,BX,其中 AX,
BX中均为无符号数 (设 AX=A,BX=B),则采用以下指令进行转移:
含 义 指 令 转 移 条 件
A高于 B
A高于等于 B
A低于等于 B
A低于 B
JA / JNBE
JAE / JNB
JB / JNAE
JBE / JNA
CF=0 AND ZF=0
CF=0 OR ZF=1
CF=1 AND ZF=0
CF=1 OR ZF=1
(2) 有符号数条件转移指令设执行了指令 CMP AX,BX,其中 AX,
BX中均为有符号数 (设 AX=A,BX=B),则采用以下指令进行转移:
含 义 指 令 转 移 条 件
A> B
A≥B
A≤B
A< B
JG / JNLE
JGE / JNL
JL / JNGE
JLE / JNG
SF⊕ OF=0 AND ZF=0
SF⊕ OF=0 OR ZF=1
SF⊕ OF=1 AND ZF=0
SF⊕ OF=1 OR ZF=1
(3) 单状态标志转移指令含 义 指 令 转 移 条 件等于 / 结果为 0 JE / JZ
JNE / JNZ
JC
JNC
ZF=0
ZF=1
CF=0
CF=1
不等于 / 结果不为 0
有进位 / 有借位无进位 / 无借位溢出不溢出有偶数个,1”
有奇数个,1”
符号位为 1
符号位为 0
JO
JNO
JP / JPE
JNP / JPO
JS
JNS
OF=0
OF=1
PF=0
PF=1
SF=0
SF=1
3,循环控制指令以 CX寄存器作为计数指针,每循环一次,CX减 1,当 CX减至 0时,停止循环。
(1) LOOP 目标标号功能,CX- 1 →CX,若 CX≠0则转移至目标,
否则顺序执行 LOOP指令的下一条指令。
循环前 CX必须赋初值 (循环次数 )
(2) LOOPE/LOOPZ 目标标号功能,CX- 1→CX,若 CX≠0且 ZF=1则转移至目标,否则停止循环 (CX=0或 ZF=0)。
(3) LOOPNE/LOOPNZ 目标标号功能,CX- 1→CX,若 CX≠0且 ZF=0则转移至目标,否则停止循环 (CX =0或 ZF=1)。
(4) JCXZ 目标标号功能,若 CX=0则转移至目标,否则顺序执行 。
4,中断指令
(1) 中断入口地址表
8086系统允许有 256种中断类型 (0~ 255),
各种类型的中断在中断入口地址表中占 4个字节,前 2个字节用于存放中断入口地址的偏移地址,后 2个字节用来存放中断入口的段基址 。
……
偏移地址段基址偏移地址段基址
00000H
00004H
00008H
003FCH
003FFH
0#
1#
2#
255#
……
(2) 中断的响应过程
a,标志寄存器 FR压栈 ;
b,使 IF = 0,TF = 0;
c,将当前程序 断点 的基址和偏移地址入栈保护 (以便能够正确返回 );
d,将 中断类型号 × 4,得到中断入口地址在中断入口地址表的位置,从该位置起连续的
4个单元中获得中断入口地址置入 CS,IP;
e,CPU转向 中断服务程序 执行相关程序 。
(3) 中断指令
a,INT n
功能,执行软件中断,中断类型号为 n,
n = 0~ 255。
b,INTO
功能,等价于 INT 4,当运算结果产生溢出 (OF = 1)时,产生溢出中断。
c,IRET
功能,中断返回 。
执行的操作:
从堆栈中弹出断点地址送 CS和 IP;
恢复标志寄存器的内容;
CPU回到被打断的地址处继续执行主程序。
六、处理器控制指令
1,标志位操作指令
(2) CLD; 使 DF = 0 (用于串操作之中 )
STD; 使 DF = 1
(3) CLI; 使 IF = 0 (禁止可屏蔽中断 )
STI; 使 IF = 1 (允许可屏蔽中断 )
(1) CLC; 使 CF = 0
STC; 使 CF = 1
CMC; 使 CF = CF (非 )
2,同步控制指令
(1) ESC 外部操作码,源操作数交权指令,可以要求另外的处理器执行某种操作 。
等待指令,使处理器处于空转等待状态 。
(2) WAIT
(3) LOCK
锁定命令,锁定总线,使引脚 LOCK变成逻辑 0。
(4) HLT
处理器暂停命令,有 四种 状态可以使处理器脱离暂停:
a,RESET 信号有效
b,NMI 有效
c,INTR 有效 (且 IF = 1)
d,DMA 操作