8086 8088指令系统
04 8088(8086)的指令系统
INC OPRD
操作数:通用寄存器、存储器 (不能是段寄存器或立即数) 执行的操作:OPRD OPRD + 1
功能: 用于在循环中修改地址指针及循环次数等。
注:该指令影响标志位
例: INC BX INC byte ptr [SI]
1. 先将SP所指单元内容 送至AL, 然后 SP+1SP ;
2. 再SP所指单元内容送 至AH, 然后 SP+1 SP
例:MOV AX,5678H POP AX
(3) 交换指令 XCHG OPRD1, OPRD2
在寄存器间或寄存器与存储器间交换信息(不允许使用段寄存器)。
源操作数: 寄存器、存储器 目的操作数:寄存器、存储器 执行的操作:( OPRD1) (OPRD2 )
DS=1000h
buffer 10100h 00 02 00 20
0100h BX
(2) LDS 把源操作数指定的内存的4个相继字节的内容送至指定寄存器及DS中
LDS REG, SRC
(REG) (SRC)
(DS) (SRC+2)
目的操作数
源操作数
(16位通用寄存器) (内存操作数)
• 该指令完成一个32位地址指针的传送; • 该指令通常指定 SI 作寄存器 REG。
• CPU内部寄存器之间的数据传送(除CS,IP外) MOV AL,BL MOV DX, DI MOV SI, BP MOV DS, BX MOV AX,DX
• 立即数传送到CPU内部通用寄存器组(AX,BX,CX,DX,BP,SP,DI,SI)
MOV CL, 4 MOV DX, 03FFH MOV DI, 04BFH
DST+SRC+C
第四章 8086 8088的指令系统
第四章 8086/8088的指令系统
第一节 指令格式 第二节 寻址方式
操作数的来源问题, 就是操作数的寻址方式问题。 指令系统中有一类指令叫转移指令,还有一类叫调用 指令,这两类指令涉及转移地址或者调用地址的提供 方式,称为指令地址的寻址方式。 8086/8088 的寻址方式可分为两种: 操作数的寻址 方式和 转移地址寻址方式. 8086/8088 的 操作数的寻址方式有: 1、立即寻址 2、寄存器寻址 3、存储器寻址 4、I/O寻址
例如:MOV AX, [BP+SI+1000H] 或:MOV AX, 1000H [BP+SI] 或:MOV AX, 1000H [BP][SI]
三 、存储器寻址
(一) (二) (三) (四) 直接寻址 寄存器间接寻址 基址寻址和变址寻址 基址变址寻址
(五) 固定寻址 固定寻址又叫隐含寻址,操作码本身隐含地指 明了操作数的地址 例:DAA 四、I/O端口寻址 (一)直接端口寻址 例: MOV DX,030EH (二)间接端口寻址 例:IN AL,20H 只能访问256个端口 OUT DX,AL OUT 20,AL 可以访问 64K个端口 就是对AL进行十进制的调整 8086/8088采用IN/OUT对端口 进行访问。寻址范围64K
存储器
分析: EA=[BX]+[SI] =1000H+04H 物理地址 =[DS] ×16+EA =11004H 45H AL
物理 地质 25H 30H FFH 20H 45H 11000H 11001H 11002H 11003H 11004H
一、数椐传送类指令
(一)通用数椐传送指令 4、栈操作指令 堆栈是在RAM 中开辟的一个存储区域,严格按照先进后 出的原则进行操作。8086/8088的堆栈操作都是16位操作, 它的段寄存器是SS ,堆栈指针寄存器SP提供偏移地址, 物理地址=(SS)×16+(SP)。 REG SREG MEM REG MEM SREG(CS除外)
第三章80868088指令系统
第三章80868088指令系统机器语言指令由二进制代码组成。
一条指令一般包含操作码(OP )和操作数两部分,操作码指明指令所完成的操作,操作数指出该指令在执行规定操作时所需的信息。
指令中用于说明操作数(一般指源操作数)所在地址的方式被称为寻址方式。
(8086的寻址方式分两类:数据寻址方式和转移地址的寻址方式)3.2.1数据寻址方式 P51 1.立即寻址:数据是8位或16位,直接放在指令的最后一个(8位)或两个字节(16位)中,这样的数据称为立即数。
MOV AL ,80HADD AX ,0F000HMOV AX ,1234HADD AL ,10H操作码字节AX操作数字节操作码字节操作数(a )MOV AL , 80H(b )MOV AX , 1234H图3-2 立即寻址方式指令举例 P522. 寄存器寻址:数据存放在指令规定的寄存器中。
MOV CL ,DL MOV AX ,BX注意:在双操作数指令中源操作数寻址方式和目的操作数寻址方式。
CL DL AXAL AHBL BH (a )MOV CL , DL (b )MOV AX , BX图3-3 寄存器寻址方式指令举例 P523. 直接寻址:操作数在存储器中,其16位有效地址,即段内偏移地址在指令码中,占两个字节。
MOV AL ,[1064H] ;设(DS )=2000HADD AX ,[2000H]代码段操作数偏移地址数据段图3-4 直接寻址方式指令举例 P53操作数数据4. 寄存器间接寻址:操作数在存储器中,其16位有效地址EA 在指令指定的基址寄存器BX 或变址寄存器SI 、DI 中。
BX EA = SIDI 注意:新教材中有BP 【例】 MOV AX ,[SI] MOV [BX] , AL 如果:(DS )=3000H ,(SI )=2000H ,(BX )=1000H,(AL )=64H注意:默认段地址寄存器为DS 以上为二字节指令;MOV AX,[BP]为三字节指令;实为指令MOV AX ,[BP+0]的简写!图3-5 寄存器间接寻址方式指令举例 P535. 寄存器相对寻址:操作数在存储器中,其效地址是一个8位或16位的位移量与一个基址寄存器或变址寄存器的内容之和。
03_8086 8088指令系统
————————— │ ├───────┤
32050H ┐ │ │ 操作码│
│ │ ├───────┤
│ │ ┌──────┼ 50H │
AL│64H│ │ │ ... │
└─┬─┘ └──→31000H├───────┤
└───────────────→│ │
├───────┤
寄存器间接寻址方式的指令执行情况
│ opcode │ │ mod │ reg │ r/m │ │ disp │ │ Data │
└─────────┘ └────────┴────────┴────────┘ └───────┘ └───────┘
操作码 方式寄存器 (Mod) 位移量 立即数
---规定操作数的方法,即指令中用于说明操作数所在地址的方法,称为寻址方式
----8086/8088 的寻址方式分为两类:数据寻址方式,转移地址寻址方式
①,数据寻址方式
a,立即寻址
----立即操作数:
--当数据为8位或16位时,可直接放在指令本身的最后一个字节(8位)或两个字节(16位)中,这样的数据
+ 1000H ├───────┤
————————— │ │
31000H ─┐ ├───────┤
│ │ │
┌───┐ │ 30000H├───────┤ MOV [BX],AL
称为立即操作数
----例子:
MOV AL,80H
MOV AX,1234H
----图示: AH AL
┌──────┐ 程序存储器 ┌───┬───┐ 程序存储器
第3章 80888086指令系统
①立即寻址 ②直接寻址 ③寄存器寻址 ⑤寄存器相对寻址 ⑥基址-变址寻址 ⑦相对的基址-变址寻址
在8086指令系统中,寻址方式可分为8种:
④寄存器间接寻址
⑧隐含寻址
14
一. 立即寻址
操作数直接由指令给出——立即数
例: MOV AX, 1C8FH MOV BYTE PTR[2A00H], 8FH MOV 2A00H, AX ; 错误!
(BX) (BP) (SI) (DI)
物理地址=(DS)左移四位+(BX)或(SI)或(DI) 物理地址=(SS)左移四位+(BP)
例: MOV AX, [BX] MOV CL, CS:[DI] × MOV AX, [DX] × MOV CL, [AX]
21
例3-5 MOV AX,[SI]
若 (DS)=6000H, (SI)=1200H, (61200H)=44H, (61201H)=33H 则指令执行后,(AX)= 3344
DS BX + SI
8000 2000 1000
操作码
. .
代码段
83000 83000H
AX AH AL
. . .
YY XX 数据段
. . .
30
七. 相对的基址-变址寻址
在基址-变址寻址的基础上再加上一个相对位移量 注意事项同基址-变址寻址
EA =
(BX)
(BP)
+
(SI) (DI)
+
指令中直接给出操作数的16位偏移地址
偏移地址也称为有效地址(EA, Effective Address)
默认的段寄存器为DS,但也可以显式地指定其 他段寄存器——称为段超越前缀
第4讲 8086&8088指令系统
20 20
地址传送指令
. 偏移地址传送指令
格式: LEA 寄存器,源 其功能是将源操作数的偏移地址送到一个寄 存器中。所以是16位地址的传送指令。 此时,指令的操作数就是一个地址了。 源操作数必定是存储器操作数。 源操作数可以采用任何一种存储器操作数的 寻址方式。
21 21
地址传送指令
11
32H 54H
11
出栈指令pop
堆栈操作指令
出栈:POP 目的 目的← [SP] ; SP ←SP+2; 如:POP AX 若:SP=FFECH 堆栈数据如图 FFEEH 结果:AX=5432H
12
32H 54H
12
堆栈操作指令
堆栈操作指令都隐含了一个操作数:SP所指 的栈顶数据; 堆栈操作的另一个操作数一定是16位操作数: 可以是寄存器操作数,也可以是存储器操作 数,但不能是立即数; 由于一定是16位操作数,因此存储器操作数 也不必用算符来说明位数了,如 PUSH [DI] 是正确表示的指令,当然,也可以写为: PUSH WORD PTR[DI] 13 13
8 8
堆栈操作指令
堆栈-在内存储区中开辟若干单元作为栈去按先 进后出方式工作。 堆栈操作便于实现子程序调用和中断处理。 8086/8088指令系统规定堆栈操作设置在ss内, 只有一个出入口,要求堆栈指针始终指向堆栈 的顶部 堆栈是由高地址向低地址发展 8086/8088指令系统提供了堆栈专用操作指令:
标志寄存器出栈指令
PUSHF 和POPF指令一般用在子程序和中断程序 的首尾,对主程序标志起保护和恢复作用。
29 29
8088/8086指令系统
第4章 8086(8088)CPU指令系统
4.1.1 8086CPU指令格式
操作码 操作数(操作数地址)
指令由操作码和操作数(操作数地址)两部分组
成 操作数操作数是参加本指令操作的数据 有些指令不需要操作数,通常的指令都有一个或 两个操作数,也有个别指令有3个甚至4个操作数
指令中的操作数:
可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址
存储单元中,在指令操作过程中需要BIU通过一 个总线周期的访问,才能获得操作数。 存储器操作数的寻址方式是怎么根据给出的操 作数地址因子,计算出操作数的有效地址EA (Effective Address)。 有效地址EA是以下三个地址因子的组合 ,由 CPU的执行单元EU计算出来:
立即数寻址方式常用来给寄存器赋值
1. 立即寻址方式
MOV AL,34H
代码段 10000H
;AL←34H
1000H:0000H
10100H 10101H 10102H AH AL
操作码 34H
1000H:0100H
1. 立即寻址方式
MOV AH,80H ;AH←80H ADD AX,1234H ;AX←AX+1234H MOV BX,1000H ;BX←0102H 立即数可以简单理解为常数,在指令中只 能作为源操作数。立即数不能作为目的操 作数。 使用立即寻址的指令主要用来给寄存器或 者存储器赋初值。
6. 基址加变址寻址方式
有效地址由基址寄存器(BX或BP)的内
容加上变址寄存器(SI或DI)的内容构成:
有效地址=BX/BP+SI/DI
段地址对应BX基址寄存器默认是DS,对
应BP基址寄存器默认是SS;可用段超越 前缀改变 MOV AX,[BX+SI] MOV AX,[BP+DI]
8086,8088指令系统
第4章 80x86指令系统
程序流程图如图4.16所示。程序如下:
MOV CX,5
;设置循环次数
MOV SI,0
;置位移量初值
CLC
;清进位CF
LOOPER:MOV AL,DATA2[SI];取一个加数
ADC DATA1[SI],AL ;和一个被加数相加
INC SI
;位移量加1
DEC CX
;循环次数减1
②堆栈按字操作;
③每执行一条入栈指令,堆栈地址指针SP减2,入栈 的数据位于栈顶;
④高位字节先入栈,放在高位地址单元,低位字节 后入栈,放在较低地址单元;先进先出原则;
⑤执行弹出指令时,过程相反,栈顶指针的值加2;
⑥CS段寄存器的值可以入栈,但不能反过来弹出一 个字到CS
第4章 80x86指令系统
所有的通用寄存器或存储器 AX、DX寄存器
所有的通用寄存器或存储器 AX寄存器
所有的通用寄存器或存储器 AX、DX寄存器
AX寄存器 AX寄存器 AX寄存器
第4章 80x86指令系统
1.加法指令
指令格式
ADD dst, src ADC dst, src INC dst AAA DAA
操作功能
(dst) ←(dst) +(src) (dst) ←(dst)+(src)+(CF) (dst) ←(dst) + 1 ASCII码调整指令 BCD调整指令
JNZ LOOPER ;加完否,若没完,转LOOPER,继续相加
XLAT Hex_table
;查表转换
Hex_table=1000H
…
60000H
Hex_table
30H
61000H
8086,8088指令系统
Hex_table=1000H
Hex_table Hex_table+1 A Hex_table+2 S C I Hex_table+A I Hex_table+B 表 Hex_table+F
…
30H 31H 32H
60000H 61000H 61001H 61002H
A S C I I 表
DS:60000H BX: 1000H + AX: 000AH
DI ES
1234H 4000H
34H 12H 00H 40H
2130H 2132H
第4章 80x86指令系统
(四) 标志传送指令 1.取标志指令 将标志寄存器F的低字节传送到AH中。 指令格式: LAHF 2.置标志指令 将AH寄存器的内容传送到标志寄存器F的低字节。 通过AH对标志寄存器的SF、ZF、AF、PF、CF标志位 置位。 指令格式: SAHF AH FLAG OF DF IF TF SF ZF AF PF CF
× × × ○ × 1
× ○ ○ ○ ○ ○
在微处理器中,没有专用的BCD码运算指令, 使用二进制运算指令进行BCD码数的运算,然后用 BCD码运算调整指令进行调整,重新得到BCD码的 结果。
第4章 80x86指令系统
① ADD
dst, src (dst) ←(dst) +(src)
功能:源操作数和目的操作数相加,结果 送到目的操作数。 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 提示:目的操作数不能为立即数,源操作 数和目的操作数不能同时为存储器。
第4章 80x86指令系统
4.1.3 8086/8088指令系统
8086/8088CPU指令系统包含有133条基本指 令。按其功能可以分为6类,它们是: ⑴ 数据传送类指令 ⑵ 算术运算类指令 ⑶ 逻辑运算与位移类指令 ⑷ 字符串指令 ⑸ 控制转移类指令 ⑹ 处理器控制类指令。
第5章 8086 8088的指令系统
8086/8088的指令系统5.1.1 8086/8088的寻址方式指令中用以说明操作数所在地址的方法称为寻址方式。
8086/8088的操作数可以放在寄存器、存储器或I/O 接口中,也可以立即数方式放在指令代码中。
在转移类指令中的寻址方式是要寻找转移新地址。
8086/8088 CPU 内部提供的寄存器资源均为16位,而实际的物理地址需要20位,这就给它的寻址方式带来复杂性。
8086/8088 CPU 共有7种寻址方式,它们是立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址。
寻址方式中找到的地址是指令所需的偏移地址(或称有效地址EA )。
此处仅对今后三种寻址方式加以说明。
1. 寄存器相对寻址操作数在存储单元中,有效地址是一个8位或16位的位移量与一个基址或变址寄存器的内容之和,位移量和寄存器均由指令给出,段地址则依使用寄存器不同而不同。
可表示为2. 基址变址寻址操作数在存储单元中,有效地址是一个基址寄存器和一个变址寄存器的内容之和,可表示为()()()()BX SI EA BP DI ⎡⎤⎡⎤=+⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦段寄存器则根据所使用基址寄存器而定(默认段)。
3. 相对基址变址寻址操作数在存储单元中,有效地址是一个8位或16位的位移量、一个基址寄存器和一个变址寄存器三部分之和,可表示为:()()()()816BX SI EA BP DI ⎡⎤⎡⎤⎡⎤=++⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦位偏移量位偏移量 段寄存器为DS(对BX 而言)或SS(对BP 而言)。
学习指令系统除弄清楚每类指令的作用外,懂得了寻址方式有利于掌握指令系统。
()()()()816BX BP EA SI DI ⎡⎤⎢⎥⎡⎤⎢⎥=+⎢⎥⎢⎥⎣⎦⎢⎥⎢⎥⎣⎦位偏移量位偏移量5.1.2 数据传送指令数据传送指令用于实现寄存器阵列间、存储器、累加器、I/O接口之间数据的传递。
可按字节或字进行数据传送。
第3章 8086 8088指令系统
如: MOV AX,[BX] [DI]或写成MOV AX,[BX+DI] 设(DS)=2000H,(BX)=0256H,(DI)=6694H,则 PA=(DS)×16+(BX)+(DI)=268EAH 指令执行后,将把268EAH和268EBH两单元的内容送 到AX中,即(AH)=3BH,(AL)=20H 由于基址寄存器和变址寄存器的内容都是可以修改, 因此,在处理二维数组和表格时用这种寻址方式较 为方便。
29
3)不能用CS作目的操作数,即CS寄存器的内容不得 随意改变,CS和IP的值一般只能在转移指令时改变 4)不在段寄存器间直接传送数据 5)不允许用立即数作目的操作数dst 6)不允许直接向段寄存器传送立即数,如果需要, 则应通过通用寄存器或存储单元传送。
30
2、堆栈操作指令PUSH,POP
3.1.2 寻址方式
包括:操作数的寻址方式和指令的寻址方式。 指令通常顺序存放,因此,指令寻址只要通过对指 令指针IP内容自动加1,便可形成下一条指令地址。 当遇到转移或调用指令时,按照转移目标修改IP或 CS,因此,指令的寻址主要是转移指令和调用指令 的转移目的地址的形成方式,这里先讨论操作数的 寻址方式
②通用寄存器和段寄存器间传送
MOV MOV
③通用寄存器和存储单元间传送
MOV MOV
AL,[BX] ;AL ←(BX) [1400H],BX; (1400H)←BX
27
④段寄存器和存储单元之间的传送
MOV
DS,[3000H] ;将3000H和3001H两字节单元的 内容送到DS MOV [BX+SI],CS ;CS的内容送到BX+SI和BX+SI+1 所指的两个字节存储单元
第3章 8086(8088)CPU指令系统
3.1 8086CPU指令概述
操作码
操作数(操作数地址)
操作数是参加本指令操作的数据
有些指令不需要操作数,通常的指令都有一个或两个操
作数,也有个别指令有3个甚至4个操作数
源操作数和目标操作数
寻址方式:指令中如何计算操作数的存放位置即操作
数的偏移地址或有效地址。CPU在执行该指令时能够按照
MOV AX,ES:[2000H];AX←ES:[2000H]
1、有效地址在指令中给出
2、需要使用总线周期
3、默认的段地址在DS段寄存器,可使用段超越前缀改变
3. 直接寻址方式
4. 寄存器间接寻址方式 MOV AX, [SI] ;AX←DS:[SI] MOV AL,[BP] ;AL←SS:[BP]
的集合
每种计算机都有它支持的指令集合 16位8086指令系统是Intel 80x86系列微处理器指令系
统的基础
8086/8088的指令系统,按照其功能可以分为以下六个
功能组: ① 数据传送 ③ 逻辑运算 ⑤ 程序控制 ② 算术运算 ④ 串操作 ⑥ 处理器控制
3.2 指令系统
学习指令的注意事项
3.直接寻址方式 4.寄存器间接寻址方式 5.寄存器相对寻址方式 6.基址变址寻址方式 7.基址变址相对寻址方式 端口寻址
1. 立即寻址方式 MOV AL,34H
代码段 10000H
;AL←34H
1000H:0000H
10100H 10101H 10102H AH AL
操作码 34H
1000H:0100H
在寄存器相对寻址或相对基址加变址寻址方式中,位移 量可用符号表示
MOV AX,[SI+COUNT]
第三章 8086 8088指令系统
MOV MOV MOV MOV MOV MOV MOV
AX , 3102H AX , [3102H] SI , AX AX , [SI] AX , [BX ] DATA AX , [BX][SI] AX, [BX] [DI] DATA
MOV AX , MOV [3102H] , MOV [SI] , MOV [BX] DATA , MOV [BX][SI] , MOV [BX] [DI ]DATA,
[例3-7] 指令 MOV AX,DATA[BX]
设:(DS)=6000H,(BX)=1000H,DATA=08H, 则物理地址=60000H+1000H+08H= 610008H
指令的执行情况如图3-6所示。执行结果为AX=5566h
DS BX ﹢) 6000 1000 0008 61008 位移量 高8位 0 位移量 低8位
MOV AX,[6000H]
③立即数到寄存器的传送
MOV MOV AL,5 BX,3078H ; 将立即数5送累加器AL ; 将立即数3078H送寄存器BX
④立即数到存储器的传送
MOV BYTE PTR[BP+SI],5 MOV WORD PTR[BX],1005H ; 将5送堆栈段中偏移地址为BP+SI所指的单元中 ;1005H 送数据段中偏移地址为BX和BX+1两单元
图 3-4 寄存器寻址示意图
采用寄存器寻址方式,虽然指令操作码在代码段中,但操作数在内部寄存器中,
指令执行时不必通过访问内存就可取得操作数,故执行速度较快。
3.2.4寄存器间接寻址
寄存器间接寻址 ——是用寄存器的内容表示操作数的偏移地址。此时寄存
器中的内容,只是存放数据的偏移地址,操作数本身在内存储器中。
第4章 8086-8088指令系统
MOV AL, [BX+5]
BP, SI或DI, 使用规则同寄存器间接寻址。
注意: 1.书写时,0100H[BP]==[BP+0100H]
2.通过修改位移量D的内容,适合对 一维数组的操作。
23
8086/8088指令系统
【例】设执行前: (AX)=0040H,(BX)=0030H, (DS)=2000H,(20036H)=0050H 执行指令:ADD 6[BX],AX 执 行 后 : ( AX)=?,(BX)=?,(DS)=?, (20036H)=? 图形表示:
MOV AX, 1234H
10
8086/8088指令系统
【例】MOV AX, 10
执行后(AX)=? 该例中源操作数为立即寻址方式,立即数为10,存 放在指令的下一单元。 图形表示:
MOV AX 立即数10 操作码 10
执行:10→AX 执行后:(AX)=000AH
11
8086/8088指令系统
在一条指令中,只能有一个操作数为存储器操作数,或 源或目的(串操作属特殊情况)。
17
8086/8088指令系统
(1) 直接寻址
操作数在存储器中,16位有效地 址EA由指令中直接给出(操作 码之后)。 MOV AL, [2000H] 默认为操作数在数据段,即PA =(DS×16)+EA。 注意: 1. 为了区别于立即数,书写汇编语 言指令时,有效地址用方括号[ ] 括起来;如果有效地址是符号地 址,则不用加方括号。 2. 如果操作数不在数据段,可使用 段超越前缀指明。
2
8086/8088指令系统
第4章 8086/8088指令系统4.1 指Fra bibliotek的基本概念和格式
80868088指令系统指令系统
0, JNO 标号 测试条件:OF=0 1, JP 标号 测试条件:PF=1 PF 0, JNP 标号 测试条件:PF=0 1, JC 标号 测试条件:CF=1 CF 0, JNC 标号 测试条件:CF=0
44..22 88008866//88008888 指指令令系系统统
44..22 88008866//88008888 指指令令系系统统
④取负指令(NEG)
格式:NEG DST 功能: DST 0-(D操作,它的被减数一定为零,因此
它是一条单操作数指令。
44..22 88008866//88008888 指指令令系系统统
实际它是将目的操作数的值取负。若操 作数的原值为一正数,那么,执行该指令后, 其值变为该数的负数的补码;而若操作数的 原值为一负数(补码表示),那么,执行该 指令后,其值变为该数所对应的正数。该指 令将正常影响各标志位,并且CF表示最高位 产生的借位。指令中的目的操作数可以采用 除立即数以外的各种寻址方式。
②带CF的减法指令(SBB)
格式:SBB DST , SRC 功能: (1)DST (DST)-(SRC)-CF
(2)根据差设置6个状态标志
44..22 88008866//88008888 指指令令系系统统
③减1指令(DEC)
格式:DEC DST 功能: (1)DST (DST)-1,
(2)根据差设置除CF以外的6 个状态标志,对CF无影响
44..22 88008866//88008888 指指令令系系统统
例1: 若(AL)=03H ,则CPU执行
NEG AL 指令后, -3的补码 AF=1
(AL)=0FDH
PF=0
微机原理第4章80868088指令系统
第4章8086/8088指令系统指令是指挥计算机进行各种操作的命令。
指令系统是指微处理器所执行各种指令的集合。
指令系统中的每一条指令都对应着由微处理器所完成的一种功能: 操作。
4.1 概述计算机的语言可分为机器语言、汇编语言和高级语言。
机器语言是计算机能够识别的语言,它是由0和1组成的一种编码。
为解决某一具体问题或达到某些目的,将二进制数0和1组成不同的代码串,这些代码串称之为机器指令。
全部机器指令的集合构成了计算机的指令系统,被称为机器语言(Machine Language)。
指令和数据编写成一个相互联系的序列,称之为程序。
4.1.1机器语言机器语言的每一条指令是以二进制为代码的指令,它能够被计算机直接执行。
例如要将以基址指针为地址BP中的内容送入累加器AL,其机器指令为100010100100011000000000B写成16进制可以表示为(8A4600H)。
当微处理器将这条指令取出并执行这条指令时,微处理器会将以基址指针BP为地址单元中的内容送入累加器AL操作。
这是由于微处理器在设计时指定这样一组代码应完成这样的功能。
不同的代码完成不同的功能。
同时,对于不同型号的微处理器,完成相同的任务其指令的机器码各不相同,不同的代码完成的功能: 也各不相同。
每个微处理器都有一套自己特有的指令系统。
若要完成某种操作和运算,依据指令系统选择指令,并按一定规律排列起来存放到内存中,微处理器就可以运行程序。
采用机器语言编写程序的一个最大好处是,程序送入计算机后,可以直接执行,对于8位微处理器,我们只要有一张指令编码表,可以通过查表找出每条指令的机器编码。
根据设计任务很容易进行编程。
但对于8086系统,情况就不同了,这是因为8086系统的操作数比8位微处理器丰富的多,它可以选寄存器、存储器、立即数和端口地址等可以都用作目的操作数,并且可以有不同的组合。
而每一种组合又有几十种编码方式。
所以,很难列出一张8086指令与机器语言的对照表,很明显,用机器语言编写程序的缺点是,不容易书写,指令代码难于记忆,编写程序易于出错,出错后不易查找错误,编程效率非常低。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8086/8088指令系统一、数据传送指令1.通用数据传送指令MOV(Move)传送PUSH(Push onto the stack)进栈POP(Pop from the stack)出栈XCHG(Exchange)交换.MOV指令格式为: MOV DST,SRC执行的操作:(DST)<-(SRC).PUSH进栈指令格式为:PUSH SRC执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(SRC).POP出栈指令格式为:POP DST执行的操作:(DST)<-((SP+1),(SP))(SP)<-(SP)+2.XCHG 交换指令格式为:XCHG OPR1,OPR2执行的操作:(OPR1)<-->(OPR2)2.累加器专用传送指令IN(Input) 输入OUT(Output) 输出XLA T(Translate) 换码这组指令只限于使用累加器AX或AL传送信息. .IN 输入指令长格式为: IN AL,PORT(字节)IN AX,PORT(字)执行的操作: (AL)<-(PORT)(字节)(AX)<-(PORT+1,PORT)(字)短格式为: IN AL,DX(字节)IN AX,DX(字)执行的操作: AL<-((DX))(字节)AX<-((DX)+1,DX)(字).OUT 输出指令长格式为: OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作: (PORT)<-(AL)(字节)(PORT+1,PORT)<-(AX)(字)短格式为: OUT DX,AL(字节)OUT DX,AX(字)执行的操作: ((DX))<-(AL)(字节)((DX)+1,(DX))<-AX(字)在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息..XLA T 换码指令格式为: XLA T OPR或: XLA T执行的操作:(AL)<-((BX)+(AL))3.有效地址送寄存器指令LEA(Load effective address)有效地址送寄存器LDS(Load DS with Pointer)指针送寄存器和DSLES(Load ES with Pointer)指针送寄存器和ES.LEA有效地址送寄存器格式为: LEA REG,SRC执行的操作:(REG)<-SRC指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS指令格式为: LDS REG,SRC执行的操作:(REG)<-(SRC)(DS)<-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器..LES 指针送寄存器和ES指令格式为: LES REG,SRC执行的操作: (REG)<-(SRC)(ES)<-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.4.标志寄存器传送指令LAHF(Load AH with flags)标志送AHSAHF(store AH into flags)AH送标志寄存器PUSHF(push the flags) 标志进栈POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为: LAHF执行的操作:(AH)<-(PWS的低字节).SAHF AH送标志寄存器格式为: SAHF执行的操作:(PWS的低字节)<-(AH).PUSHF 标志进栈格式为: PUSHF执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW).POPF 标志出栈格式为: POPF执行的操作:(PWS)<-((SP)+1,(SP))(SP)<-(SP+2)二、算术指令1.加法指令ADD(add)加法ADC(add with carry)带进位加法INC(increment)加1.ADD 加法指令格式: ADD DST,SRC执行的操作:(DST)<-(SRC)+(DST).ADC 带进位加法指令格式: ADC DST,SRC执行的操作:(DST)<-(SRC)+(DST)+CF .ADD 加1指令格式: INC OPR执行的操作:(OPR)<-(OPR)+12.减法指令SUB(subtract)减法SBB(subtract with borrow)带借位减法DEC(Decrement)减1NEG(Negate)求补CMP(Compare)比较.SUB 减法指令格式: SUB DST,SRC执行的操作:(DST)<-(DST)-(SRC).SBB 带借位减法指令格式: SBB DST,SRC执行的操作:(DST)<-(DST)-(SRC)-CF .DEC 减1指令格式: DEC OPR执行的操作:(OPR)<-(OPR)-1.NEG 求补指令格式: NEG OPR执行的操作:(OPR)<- -(OPR).CMP 比较指令格式: CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.3.乘法指令MUL(Unsigned Multiple)无符号数乘法IMUL(Signed Multiple)带符号数乘法.MUL 无符号数乘法指令格式: MUL SRC执行的操作:字节操作数:(AX)<-(AL)*(SRC)字操作数:(DX,AX)<-(AX)*(SRC).IMUL 带符号数乘法指令格式: IMUL SRC执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.4.除法指令DIV(Unsigned divide)无符号数除法IDIV(Signed divide)带符号数除法CBW(Convert byte to word)字节转换为字CWD(Contert word to double word)字转换为双字.DIV 无符号数除法指令格式: DIV SRC执行的操作:字节操作:(AL)<-(AX)/(SRC)的商(AH)<-(AX)/(SRC)的余数字操作: (AX)<-(DX,AX)/(SRC)的商(AX)<-(DX,AX)/(SRC)的余数.IDIV 带符号数除法指令格式: DIV SRC执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW 字节转换为字指令格式: CBW执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH.CWD 字转换为双字指令格式: CWD执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.这两条指令都不影响条件码.三、逻辑指令1.逻辑运算指令AND(and) 逻辑与OR(or) 逻辑或NOT(not) 逻辑非XOR(exclusive or)异或TEST(test) 测试.AND 逻辑与指令格式: AND DST,SRC执行的操作:(DST)<-(DST)^(SRC).OR 逻辑或指令格式: OR DST,SRC执行的操作:(DST)<-(DST)V(SRC).NOT 逻辑非指令格式: NOT OPR执行的操作:(OPR)<-(OPR).XOR 异或指令格式: XOR DST,SRC执行的操作:(DST)<-(DST)V(SRC).TEST 测试指令格式: TEST OPR1,OPR2执行的操作:(DST)^(SRC)两个操作数相与的结果不保存,只根据其特征置条件码2.移位指令SHL(shift logical left) 逻辑左移SAL(shift arithmetic left) 算术左移SHR(shift logical right) 逻辑右移SAR(shift arithmetic right) 算术右移ROL(Rotate left) 循环左移ROR(Rotate right) 循环右移RCL(Rotate left through carry) 带进位循环左移RCR(Rotate right through carry) 带进位循环右移格式: SHL OPR,CNT(其余的类似)其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.四、串处理指令1.与REP相配合工作的MOVS,STOS和LODS指令.REP重复串操作直到(CX)=0为上格式: REP string primitive其中String Primitive可为MOVS,LODS或STOS指令执行的操作:1)如(CX)=0则退出REP,否则往下执行.2)(CX)<-(CX)-13)执行其中的串操作4)重复1)~3).MOVS 串传送指令格式:可有三种MOVS DST,SRCMOVSB(字节)MOVSW(字)其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:MOVS ES:BYTE PTR[DI],DS:[SI]执行的操作:1)((DI))<-((SI))2)字节操作:(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1当方向标志DF=0时用+,当方向标志DF=1时用-3)字操作:(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2当方向标志DF=0时用+,当方向标志DF=1时用-该指令不影响条件码..CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量..STOS 存入串指令格式: STOS DSTSTOSB(字节)STOSW(字)执行的操作:字节操作:((DI))<-(AL),(DI)<-(DI)+-1字操作: ((DI))<-(AX),(DI)<-(DI)+-2该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中. .LODS 从串取指令格式: LODS SRCLODSBLODSW执行的操作:字节操作:(AL)<-((SI)),(SI)<-(SI)+-1字操作: (AX)<-((SI)),(SI)<-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令.REPE/REPZ 当相等/为零时重复串操作格式: REPE(或REPZ) String Primitive其中String Primitive可为CMPS或SCAS指令.执行的操作:1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)<-(CX)-13)执行其后的串指令4)重复1)~3).REPNE/REPNZ 当不相等/不为零时重复串操作格式: REPNE(或REPNZ) String Primitive其中String Primitive可为CMPS或SCAS指令执行的操作:除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同..CMPS 串比较指令格式: CMP SRC,DSTCMPSBCMPSW执行的操作:1)((SI))-((DI))2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同..SCAS 串扫描指令格式: SCAS DSTSCASBSCASW执行的操作:字节操作:(AL)-((DI)),(DI)<-(DI)+-1字操作: (AL)-((DI)),(DI)<-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.五、控制转移指令1.无条件转移指令.JMP(jmp) 跳转指令1)段内直接短转移格式:JMP SHORT OPR执行的操作:(IP)<-(IP)+8位位移量2)段内直接近转移格式:JMP NEAR PTR OPR执行的操作:(IP)<-(IP)+16位位移量3)段内间接转移格式:JMP WORD PTR OPR执行的操作:(IP)<-(EA)4)段间直接(远)转移格式:JMP FAR PTR OPR执行的操作:(IP)<-OPR的段内偏移地址(CS)<-OPR所在段的段地址5)段间间接转移格式:JMP DWORD PTR OPR执行的操作:(IP)<-(EA)(CS)<-(EA+2)2.条件转移指令1)根据单个条件标志的设置情况转移.JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移格式:JE(或JZ) OPR测试条件:ZF=1.JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE) OPR测试条件:ZF=0.JS(Jump if sign) 结果为负则转移格式: JS OPR测试条件:SF=1.JNS(Jump if not sign) 结果为正则转移格式:JNS OPR测试条件:SF=0.JO(Jump if overflow) 溢出则转移格式: JO OPR测试条件:OF=1.JNO(Jump if not overflow) 不溢出则转移格式: JNO OPR测试条件:OF=0.JP(或JPE)(Jump if parity,or parity even) 奇偶位为1则转移格式: JP OPR测试条件:PF=1.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0则转移格式: JNP(或JPO) OPR测试条件:PF=0.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC) OPR测试条件:CF=1.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或进位位为0则转移格式:JNB(或JAE,JNC) OPR测试条件:CF=02)比较两个无符号数,并根据比较的结果转移.JB(或JNAE,JC)格式:同上.JNB(或JAE,JNC)格式:同上.JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移格式:JBE(或JNA) OPR测试条件:CFVZF=1.JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA) OPR测试条件:CFVZF=03)比较两个带符号数,并根据比较的结果转移.JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE) OPR测试条件:SFVOF=1.JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移格式:JNL(或JGE) OPR测试条件:SFVOF=0.JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG) OPR测试条件:(SFVOF)VZF=1.JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG) OPR测试条件:(SFVOF)VZF=04)测试CX的值为0则转移指令.JCXZ(Jump if CX register is zero) CX寄存器的内容为零则转移格式:JCXZ OPR测试条件:(CX)=0注:条件转移全为8位短跳!3.循环指令.LOOP 循环指令格式: LOOP OPR测试条件:(CX)<>0.LOOPZ/LOOPE 当为零或相等时循环指令格式: LOOPZ(或LOOPE) OPR测试条件:(CX)<>0且ZF=1.LOOPNZ/LOOPNE 当不为零或不相等时循环指令格式: LOOPNZ(或LOOPNE) OPR测试条件:(CX)<>0且ZF=0这三条指令的步骤是:1)(CX)<-(CX)-12)检查是否满足测试条件,如满足则(IP)<-(IP)+D8的符号扩充.4.子程序.CALL调用指令.RET返回指令5.中断.INT指令格式: INT TYPE或INT执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2((SP)+1,(SP))<-(CS)(SP)<-(SP)-2((SP)+1,(SP))<-(IP)(IP)<-(TYPE*4)(CS)<-(TYPE*4+2).INTO 若溢出则中断执行的操作:若OF=1则:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2((SP)+1,(SP))<-(CS)(SP)<-(SP)-2((SP)+1,(SP))<-(IP)(IP)<-(10H)(CS)<-(12H).IRET 从中断返回指令格式: IRET执行的操作:(IP)<-((SP)+1,(SP))(SP)<-(SP)+2(CS)<-((SP)+1,(SP))(SP)<-(SP)+2(PSW)<-((SP)+1,(SP))(SP)<-(SP)+2六、处理机控制指令1.标志处理指令.CLC进位位置0指令(Clear carry)CF<-0.CMC进位位求反指令(Complement carry)CF<-CF .STC进位位置1指令(Set carry)CF<-1.CLD方向标志置0指令(Clear direction)DF<-0.STD方向标志置1指令(Set direction)DF<-1.CLI中断标志置0指令(Clear interrupt)IF<-0.STI中断标志置1指令(Set interrupt)IF<-02.其他处理机控制指令NOP(No Opreation) 无操作HLT(Halt) 停机WAIT(Wait) 等待ESC(Escape) 换码LOCK(Lock) 封锁这些指令可以控制处理机状态.这们都不影响条件码..NOP 无操作指令该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代..HLT停机指令该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序..W AIT等待指令该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行..ESC换码指令格式ESC mem其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件. .LOCK封锁指令该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.。