1.5k likes | 2.92k Views
第 3 章 指令系统. 指令 是计算机用以控制各个部件协调工作的命令, 指令系统 是微处理器所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统. 3.1 8086 指令系统概述. 计算机的工作就是运行程序,而程序由存储在存储器中的指令序列构成 。 微处理器高效软件的发展要求对每条指令的寻址方式 (Addressing Mode) 都要相当地熟悉。机器语言指令由二进制代码组成。 指令语句 一般由 操作码 (Operating Code) 和 操作数 (Operating Data) 两部分组成:. 助记符指令格式.
E N D
第3章 指令系统 指令是计算机用以控制各个部件协调工作的命令,指令系统是微处理器所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统
3.1 8086指令系统概述 计算机的工作就是运行程序,而程序由存储在存储器中的指令序列构成。 微处理器高效软件的发展要求对每条指令的寻址方式(Addressing Mode)都要相当地熟悉。机器语言指令由二进制代码组成。 指令语句一般由操作码(Operating Code)和操作数(Operating Data)两部分组成:
助记符指令格式 汇编语言助记符指令书写的基本格式为(标号): 操作码(操作数) (;注释)其中,操作码是指令语句中不可缺少的;带括号的项是可选项,如果有此项时,不能加括号;多个操作数间是以‘,’隔开的;操作码与操作数之间必须以空格分开。
操作码由便于记忆的助记符表示(通常为英文单词缩写),操作码表示计算机执行什么操作;操作码由便于记忆的助记符表示(通常为英文单词缩写),操作码表示计算机执行什么操作; 操作数可能指明了参与操作的数本身,或规定了操作数的地址。 8086/8088系统中一条指令的操作数可以是双操作数(源操作数和目的操作数),也可以是单操作数,有的指令还可以没有操作数或隐含操作数。而80386/80486系统中的指令则有多个操作数
操作数主要分为三类: • 立即数操作数 • 立即数即常数,是一个固定数值的操作数; • 寄存器操作数 • 寄存器操作数存放在CPU的某个寄存器中; • 存储器操作数 • 存储器操作数则存放在内存的数据区中。
3.2 寻址方式 通过指令采用合适的方式指定操作数的地址。寻找操作数所在地址的方法称为寻址方式。 在80X86系统中,寻址方式通常分为两种:一种为寻找操作数的地址,称为数据寻址;另一种为寻找要执行的下一条指令的地址,即程序转移或子程序调用时的目的地址或入口地址,称为程序转移地址寻址。
3.2.1 数据的寻址方式 本节中寻址方式一般针对源操作数而言,以通用传送指令为例 MOV DST,SRC SRC为源操作数,指令执行过程中原值保持不变;DST为目的操作数,原值不保留,MOV指令完成从源操作数向目的操作数拷贝数据的功能。
3.2.1 数据的寻址方式 1.立即寻址(Immediate Addressing)操作数包含在指令码中,由指令给出。汇编语言可用多种方式描述立即数。立即操作数可以是常数,如果操作数以字母开头,汇编程序要求操作数在其前加0。 立即寻址通常用于给寄存器赋值,并且只适用于源操作数字段,不能用于目的操作数字段,要求源操作数与目的操作数长度一致。
3.2.1 数据的寻址方式 MOV AL,100指令执行后,(AL)=64HMOV CL,01001100B指令执行后,(CL)=4CHMOV AX,1234H指令执行后,(AX)=1234H
3.2.1 数据的寻址方式 立即数如果是多字节数,则高位字节存放在高地址中,低位字节存放在低地址中。
3.2.1 数据的寻址方式 2.寄存器寻址(Register Addressing)寄存器寻址是一种最普遍的数据寻址方式,指令指定寄存器号,操作数存放在指令规定的CPU内部寄存器中。可用于寄存器寻址的为通用寄存器。 寄存器寻址不需要访问存储器,也不需要使用总线周期,操作在CPU内部进行,因而可取得较高的运算速度。
3.2.1 数据的寻址方式 MOV AX,BX指令执行前,(AX) = 5678H,(BX) = 1234H; 指令执行后,(AX) = 1234H,(BX) = 1234H。 除上述两种寻址方式外,以下各种寻址方式的操作数均在代码段以外的存储区中,寻址方式通过不同的途径求得操作数的偏移地址,即有效地址EA (Effective Address)。
3.2.1 数据的寻址方式 3.直接寻址(Direct Addressing)直接寻址由指令直接给出操作数的有效地址EA,操作数本身在存储单元中,通常存放在数据段,默认的段寄存器为DS。操作数有效地址格式为[数值] 或 符号 或 [符号]MOV AX,[2040H] 执行结果为 (AX) = 6A4BH 注意:本指令不是将立即数2040H传送到AX,而是将有效地址是2040H的存储单元的内容传送到AX。
3.2.1 数据的寻址方式 汇编语言指令中可以用符号地址代替数值地址:MOV AX,[TABLE];或MOV AX,TABLE;这两者等价,此处TABLE为存放操作数单元的符号地址。 如果要对其他段寄存器所指出的存储区进行直接寻址,则在指令前必须用前缀指出段寄存器名。MOV AX,ES:[2000H]; 将ES段的2000H和2001H两单元的内容传送到AX。
3.2.1 数据的寻址方式 4.寄存器间接寻址(Register Indirect Addressing)操作数的有效地址存放在基址寄存器或变址寄存器中,而操作数则在存储器中。对16位数进行寄存器间接寻址时可用的寄存器是基址寄存器BX、BP和变址寄存器SI、DI。使用BP时默认的段寄存器为SS,使用其他寄存器默认的段寄存器为DS。 操作数有效地址格式为:[间接寻址的寄存器]。寻址寄存器放在方括号中。
3.2.1 数据的寻址方式 MOV BX,[BP]指令执行前,(BP) = 4000H, 执行结果为:(BX) = 50A0H。
3.2.1 数据的寻址方式 寄存器间接寻址方式可用于表格处理,执行完一条指令后,只需修改寄存器的内容就可以取出表格中的下一项。
3.2.1 数据的寻址方式 5.寄存器相对寻址(Register Relative Addressing)操作数的有效地址为指令中规定的间接寻址寄存器的内容和指令中指定的位移量之和。操作数存放在存储器中。操作数有效地址格式为 位移量[间接寻址的寄存器] 或 [位移量 + 间接寻址的寄存器]
3.2.1 数据的寻址方式 MOV AX,TAB[SI] 如果TAB为16位的符号地址,其值为3080H,(SI) = 2000H,默认的段寄存器为DS,则 EA=TAB+(SI)=3080H+2000H=5080H
3.2.1 数据的寻址方式 寄存器相对寻址可用于表格处理或访问一维数组中的元素。把表格的首地址设置为位移量,利用修改间接寄存器的值来存取表格中的任意一个元素。
3.2.1 数据的寻址方式 6.基址变址寻址(Based Indexed Addressing)操作数的有效地址是一个基址寄存器和变址寄存器的内容之和,操作数本身在存储单元中。操作数有效地址格式为: [基址寄存器][变址寄存器]
3.2.1 数据的寻址方式 MOV AX,[BX][SI]如果(BX) = 0200H,(SI) = 0010H, (DS) = 3000H,则EA=(BX)+(SI)=0200H+0010H=0210H物理地址=(DS)×10H+EA =3000H×10H+0210H =30210H 若30210H和30211H中分别存放的数值为56H、78H,则指令执行结果(AX) = 7856H。
3.2.1 数据的寻址方式 基址变址寻址同样适用于数组或表格处理,首地址存放在基址寄存器中,变址寄存器访问数组中各元素。因两个寄存器都可以修改,所以它比寄存器相对寻址方式更灵活。需要注意的是,两个寄存器不能均为基址寄存器,也不能均为变址寄存器。
3.2.1 数据的寻址方式 7.基址变址相对寻址(Relative Based Indexed Addressing)操作数的有效地址为指令中规定的1个基址寄存器和1个变址寄存器的内容及指令中指定的位移量三者之和。 位移量[基址寄存器][变址寄存器] 可以表示成多种形式组合。寻址寄存器要放在方括号中。
3.2.1 数据的寻址方式 MOV AX,TAB[BX][SI](BX) = 1000H,(SI) = 2000H, TAB = 0150H则EA = (BX) + (SI) + TAB = 3150H执行结果 (AX) = 1234H。
3.2.1 数据的寻址方式 基址变址相对寻址通常用于对二维数组的访问。位移量为数组起始地址。基址寄存器和变址寄存器分别存放行和列的值,利用相对基址变址寻址就可以直接访问二维数组中指定的某个元素。
3.2.1 数据的寻址方式 8.隐含寻址(Concealed Addressing)有些指令的指令码中不包含指明操作数地址的部分,而其操作码本身隐含地指明了操作数的地址。 如:LODSB; 表示SI的内容送到AL,SI指针加1。该指令将在后面串操作指令部分详细介绍。
3.2.1 数据的寻址方式 9.I/O端口寻址 I/O端口寻址就是寻找输入输出设备的端口地址对I/O端口的寻址有以下两种方式。 (1) 直接端口寻址方式 端口地址用8位地址码表示:IN AL(AX or EAX),port8; OUT port8,AL(AX or EAX)如:IN AL,21H。表示从I/O地址为21H的端口中读取数据到AL中。
3.2.1 数据的寻址方式 (2) 间接端口寻址方式 端口地址为16位,并规定存放在寄存器DX中。格式如下:IN AL(AX or EAX),DX; OUT DX,AL(AX or EAX) 如:IN AL,DX。这条指令表示从DX寄存器内容所指定的端口中读取数据到AL中。
3.2.2 程序转移地址寻址方式 CPU执行指令时,指令是按顺序存放在存储器中的,而程序执行顺序是由CS和IP的内容来决定的。当程序执行到某一转移或调用指令时,需脱离程序的正常顺序执行,而把它转移到指定的指令地址,程序转移及调用指令通过改变IP和CS内容,就可改变程序执行顺序。
3.2.2 程序转移地址寻址方式 根据程序转移地址相对于当前程序地址的关系,可分为段内、段外;又根据转移地址是否直接出现在指令中,分为直接、间接,所以有四种程序转移寻址方式:段内直接寻址、段内间接寻址、段间直接寻址及段间间接寻址。
3.2.2 程序转移地址寻址方式 1.段内直接寻址(Intrasegment Direct Addressing)段内直接寻址方式也称为相对寻址方式。指令码中包括一个位移量disp,转移的有效地址为: EA = (IP) + disp。 当位移量是8位时,称为短程转移;当位移量是16位时,称为近程转移。 JMP NEAR PTR 符号地址 JMP SHORT 符号地址
3.2.2 程序转移地址寻址方式 2.段内间接寻址(Intrasegment Indirect Addressing)程序转移的有效地址是一个寄存器或存储单元的内容。所得到的转向的有效地址用来取代IP寄存器的内容。 JMP 寄存器 JMP 存储单元 由于以上两种寻址方式仅修改IP的内容, 所以这种寻址方式只能在段内进行程序转移。
3.2.2 程序转移地址寻址方式 • JMP BX如果(BX) = 1020H, • 则指令执行后(IP) = 1020H • JMP TABLE[BX][SI]如果(DS) =2000H,(BX) = 1020H, • (SI) = 0002H, TABLE = 0010H, • (21032H) = 1234H, • 则指令执行后(IP)=((DS)×10H+(BX)+(SI)+TABLE) • =(2000H×10H+1020H+0002H+0010H) • =(21032H)=1234H
3.2.2 程序转移地址寻址方式 3.段间直接寻址(Intersegment Direct Addressing)指令中直接给出程序转移的代码段地址和偏移地址来取代当前的CS和IP。 指令的汇编语言格式为JMP FAR PTR 符号地址; FAR PTR表示段间转移的操作符
3.2.2 程序转移地址寻址方式 4.段间间接寻址(Intersegment Indirect Addressing)程序转移的有效地址是一个存储单元中连续4个字节的内容。这个存储单元的内容可以用数据寻址方式中除立即数和寄存器方式以外的任何一种寻址方式获得,将所寻址的存储单元前2个字节内容送IP,后2个字节内容送CS。 指令的汇编语言格式为JMP DWORD PTR 存储单元
3.2.2 程序转移地址寻址方式 JMP DWORD PTR [BX] 如果(BX) = 1034H,且从1034H开始的连续4个存储单元内容分别为12H、34H、56H、78H,则指令执行后 (IP)=1234H,(CS)=5678H。
3.3 8086指令系统 指令系统是指微处理器所能执行全部指令的集合。不同微处理器具有不同的指令系统,这在微处理器设计时就已决定了。80X86系列的CPU中,其指令系统的机器代码是完全向上兼容的。80X86指令系统按功能可分为以下9类:
3.3 8086指令系统 (1) 数据传送类指令;(2) 算术运算类指令;(3) 逻辑运算和移位类指令;(4) 位操作指令;(5) 串操作指令;(6) 控制转移类指令;(7) 处理器控制指令;(8) 高级语言类指令;(9) 操作系统型指令。
3.3 8086指令系统 常用到的一些符号所表示的含义。 src源操作数 dst目的操作数 data 立即数 disp 8位或16位位移量 [ ]存储单元的内容 mem存储器操作数 opr 表示操作数 reg 寄存器 count移位次数,可以是1或CL
3.3.1 数据传送类指令 数据传送类指令用于实现立即数到寄存器或存储器、CPU内部寄存器之间、寄存器与存储器之间、累加器与I/O口之间的数据传送。除标志位传送指令之外,数据传送类指令不会影响标志寄存器中的标志位。这类指令又分为通用数据传送、地址传送、标志传送和输入输出等4组指令。
3.3.1 数据传送类指令 1.通用数据传送指令通用数据传送指令包括最基本的传送指令、堆栈指令、数据交换指令、换码指令。 (1) 数据传送指令 基本的传送指令包括MOV、MOVSX、MOVZX。其中MOVSX、MOVZX仅在386及其后继机型中可用。
3.3.1 数据传送类指令 ● 传送指令(move)——MOV指令格式:MOV DST,SRC 指令功能:将源操作数SRC的内容传送到目的操作数DST所指单元,完成字节、字或双字传送。源操作数可以是通用寄存器(REGn)、段寄存器(SEG)、立即数(DATAn)和存储单元(MEMn)。目的操作数可以是REGn、SEG和MEMn。存储单元可通过数据寻址的各种寻址方式寻址。
3.3.1 数据传送类指令 在使用MOV指令时应注意以下几点:(1) 目的操作数不得为立即数。 如:MOV 12H,BL为非法指令。(2) 不影响标志位。(3) 操作数类型必须一致。如:MOV AX,BL为非法指令,应为MOV AL,BL。(4) 源操作数为非立即数时,两操作数之一必为寄存器。如:MOV [DX],[SI]为非法指令,不能在两个存储单元之间进行数据传送。
3.3.1 数据传送类指令 (5) 目的操作数为段寄存器(CS和IP或EIP不能作为目的寄存器),源操作数不得为立即数。(6) 不能在段寄存器之间进行直接数据传送。如:MOV DS,ES为非法指令。
3.3.1 数据传送类指令 几个不能传送操作的解决办法是通过AX作桥梁。 存储器←存储器:MOV AX,MEM1MOV MEM2,AX 段寄存器←段寄存器:MOV AX,SEG1MOV SEG2,AX 段寄存器←立即数:MOV AX,DATAMOV SEG,AX