1.71k likes | 1.88k Views
第三章 指令系统. www.qust.edu.cn. 第三章 指令系统. 指令是让计算机完成某种操作的命令,指令的集合称作指令系统,不同系列的计算机有不同的指令系统。一般的小型或微型计算机的指令系统可以包括几十种或百余种指令。本章将介绍 86x86 指令中为取得操作数地址所使用的寻址方式及其指令系统。. § 3.1 概述. § 3.2 寻址方式. § 3.3 基本指令集. § 3.1 概述. 指令 是让计算机完成某种操作的命令,指令的集合称作 指令系统 ,不同系列计算机有不同的指令系统。
E N D
第三章 指令系统 www.qust.edu.cn
第三章 指令系统 指令是让计算机完成某种操作的命令,指令的集合称作指令系统,不同系列的计算机有不同的指令系统。一般的小型或微型计算机的指令系统可以包括几十种或百余种指令。本章将介绍86x86指令中为取得操作数地址所使用的寻址方式及其指令系统。 §3.1 概述 § 3.2 寻址方式 § 3.3 基本指令集 www.qust.edu.cn
§3.1 概述 • 指令是让计算机完成某种操作的命令,指令的集合称作指令系统,不同系列计算机有不同的指令系统。 • 任何一种汇编语言的指令语句都是与机器指令一一对应的,它通过汇编程序将其翻译成机器指令代码(目标代码),让CPU执行某种操作。 • 86系列汇编语言指令语句格式如下图所示,带方括号的项表示是可选项。 [标号:] 指令助记符 [操作数] [;注释] www.qust.edu.cn
§3.1 概述 • 标号 是给该指令所在地址取的名字,必须后跟冒号“:”,它可以缺省,是可供选择的标识符。 • 86系列汇编语言中的标识符必须遵循下列规则: 由字母(a-z,A-Z)、数字(0-9)或某些特殊字符(@,-,?)组成。 第一个字符必须是字母(a-z,A-Z)或某些特殊符号(@,-,?),但“?”不能单独作标识符。 标识符有效长度为31个字符,若超过31个字符,则只保留前面的31个字符为有效标识符。 • 下面是有效的标识符: START:MY-CODE:?MORE-350:BETA-1:DELAYIS: • 下面是无效的标识符: 4LOOP:START=3:GAMA$1:NUM+1:?:ONE*TWO: www.qust.edu.cn
§3.1 概述 • 指令助记符 • 是指令名称的代表符号,它是指令语句中的关键字,不可缺省,表示本指令的操作类型,如传送、运算、移位、跳转等操作。如MOV-传送、ADD-加法、SUB-减法等等。 • 操作数 • 是参加本指令运算的数据,有些指令不需要操作数,可以缺省;有些指令需要两个操作数,这时必须用逗号(,)将两个操作数分开;有些操作数可以用表达式来表示。 • 操作数可以是常数、寄存器、标号、变量或表达式。 • 注释部分 • 是可选项,注释必须用分号(;)开头,注释用来对指令功能加以说明,汇编程序不对它做任何处理。 www.qust.edu.cn
§3.2 寻址方式 • 指令系统设计了多种操作数的来源,操作数可以定位在以下地方之一:指令中、寄存器、存储单元、I/O端口。寻找操作数的过程就是操作数的寻址方式。 • 操作数采取哪一种寻址方式,会影响机器运行的速度和效率。 • 如何寻址一个操作数对程序的设计来讲也很重要。 www.qust.edu.cn
相对基址变址寻址 立即寻址 寻址方式 基址变址寻址 寄存器寻址 寄存器相对寻址 直接寻址 §3.2 寻址方式 www.qust.edu.cn
§3.2 寻址方式 1. 立即寻址方式 8086 CPU指令系统中,有一部分指令所用的8位或16位操作数就在指令中提供,这种方式叫立即寻址方式。 • 例如: • MOV AL,80H;将十六进制数80H送入AL • MOV AX,1090H;将1090H送AX,AH中为10H,AL中为90H • 采用立即数寻址方式的指令主要用来对寄存器赋值。因为操作数可以从指令中直接取得,所以,立即寻址方式的显著特点就是速度快。 • 注意: • 立即数可以为8位,也可以为16位;对386及其后继机型则可以为8位或32位。 • 立即数只能是整数,不能是小数、变量或者其他类型的数据; • 立即数只能作为源操作数。 • 源操作数和目的操作数类型要匹配。 www.qust.edu.cn
§3.2 寻址方式 立即数寻址方式演示 www.qust.edu.cn
§3.2 寻址方式 2. 寄存器寻址方式 • 如果操作数就在CPU的内部寄存器中,那么寄存器名可在指令中指出。这种寻址方式就叫寄存器寻址方式。 • 对16位操作数,寄存器可以为AX,BX,CX,DX,SI,DI,SP或者BP; • 对8位操作数,寄存器可为AH,AL,BH,BL,CH,CL,DH,DL; • 对32位操作数,寄存器可以为EAX,EBX,ECX,EDX,ESI,EDI,ESP或者EBP。 • 例如: • INCCX ;将CX的内容加1 • ROLAH,1 ;将AH中的内容循环左移一位 • 采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,不需要使用总线周期,因此,执行速度快。 www.qust.edu.cn
§3.2 寻址方式 寄存器寻址方式的演示 www.qust.edu.cn
AH AL 30 50 32000 50 30 (AX) = 3050H §3.2 寻址方式 3. 直接寻址方式 使用直接寻址方式时,数据总是在存储器中,存储单元的有效 地址EA由指令直接指出,所以直接寻址是对存储器进行访问时 可采用的最简单的方式。 例如: MOV AX, [ 2000H ] EA=2000H, 假设(DS)=3000H, 那么物理地址PA=32000H www.qust.edu.cn
§3.2 寻址方式 3. 直接寻址方式 注意: • 隐含的段为数据段DS • 可使用段跨越前缀MOV AX, ES: [2000H] • 操作数地址可由变量(符号地址)表示, 但要注意变量的属性。 VALUE DB 10 MOV AH, VALUE MOV AX, VALUE MOV AX, WORD PTR VALUE www.qust.edu.cn
§3.2 寻址方式 直接寻址方式的演示 MOV AX,DS:[2000H] www.qust.edu.cn
[EAX] [EBX] [ECX] [EDX] [ESI] [EDI] [ESP] [EBP] [BX] [BP] [SI] [DI] EA= 或 §3.2 寻址方式 4. 寄存器间接寻址方式 • 采用寄存器间接寻址方式时,操作数一定在存储器中,存储单元的有效地址由寄存器指出。 • 16位寻址时可用的寄存器是BX,BP,SI和DI; • 32位寻址时可用EAX,EBX,ECX,EDX,ESI,EDI,ESP或者EBP。即有效地址等于其中某一个寄存器的值: • 以BP、ESP、EBP寄存器进行间接寻址——默认段为SS寄存器 • 以其他寄存器进行间接寻址——默认段为DS寄存器 • 适于数组、字符串、表格的处理 www.qust.edu.cn
§3.2 寻址方式 寄存器间接寻址方式的演示 www.qust.edu.cn
§3.2 寻址方式 例如: MOV AX,[BX] 设DS=5000H,BX=3000H,则本指令在执行时,将53000H 和53001H两个单元的内容送AX。 MOV BX,[BP] 设SS=5000H,BP=4000H,则本指令在执行时,将54000H 和54001H两个单元的内容送BX。 MOV ECX,[EDX] 把数据段中有效地址存放在EDX寄存器中的32位操作数传送 到ECX寄存器中。 • 如果要对其它段寄存器所指的区域进行寻址,则必须在指令前用前缀指出段寄存器名。例如: • MOV CX, ES∶[BX] • 设ES=3000H,BX=4000H,则本指令在执行时,将34000H和34001H两个单元的内容送CX。 www.qust.edu.cn
[EAX] [EBX] [ECX] [EDX] [ESI] [EDI] [ESP] [EBP] [BX] [BP] [SI] [DI] EA= 或 +位移量 §3.2 寻址方式 5. 寄存器相对寻址方式(直接变址寻址) 操作数的有效地址EA为基址或变址寄存器的内容与指令中指定的位移量之和,操作数在存储器中。 可用寄存器及其对应的默认段情况与寄存器间接寻址方式相同。 EA计算方法如下: www.qust.edu.cn
§3.2 寻址方式 5. 寄存器相对寻址方式(直接变址寻址) • 例如: MOV AX,COUNT[SI](MOV AX,[COUNT+SI]) 若(DS)=3000H,(SI)=2000H, COUNT=3000H,(35000H)=1234H 则物理地址=30000+2000+3000=35000H 执行结果为(AX)=1234H MOV EAX,TABLE[ESI] • 寄存器相对寻址通常用于对数组元素、字符串等进行操作,操作过程中,指令会自动修改变址寄存器中的地址,以指向下一个操作数。 www.qust.edu.cn
操作码 24H 00H 12H 34H 56H 78H 9AH 例,利用该寻址方式对于一维数组的访问 MOV AL,0024H[SI] 代码段 EA=24H+(SI) 可看作数据起始单元的偏移量 (SI)=0 (AL)=12H (SI)=1 (AL)=34H DS (SI)=2 (AL)=56H (SI)=3 (AL)=78H 数组内某元素距数组起始单元的偏移 0024H (SI)=4 (AL)=9AH 数据段 (SI) 通过修改SI可遍历整个数组
§3.2 寻址方式 6. 基址变址寻址方式 用这种寻址方式时,操作数的有效地址等于基址寄存器的内容加上一个变址寄存器的内容。 • 16位寻址时,基址寄存器可用BX和BP,变址寄存器可用SI和DI;32位寻址时,基址寄存器可用任何32位通用寄存器,变址寄存器可用除ESP以外的32位通用寄存器。 例如: MOV AX,[BX+SI] 设DS=1000H,BX=5000H,SI=2000H,则上面指令在执行时,有效地址为7000H,本指令将17000H和17001H两单元的内容取到AX中。 • 基址变址寻址方式中,允许两个地址分量分别改变,而且有一个对段寄存器的约定规则: • 如果基址寄存器用BP或32位的ESP、EBP,则默认的段寄存器为SS; • 其他情况,默认的段寄存器为DS。 www.qust.edu.cn
§3.2 寻址方式 6. 基址变址寻址方式 例如: MOV AX,[BX+SI] 设DS=1000H,BX=5000H,SI=2000H,则上面指令在执行时,有效地址为7000H,本指令将17000H和17001H两单元的内容取到AX中。 MOV AX, ES:[BX] [SI] MOV EDX,[EBX][ESI] • 该寻址方式使用起来很灵活,适用于数组、字符串或表格 • 处理。 • 必须是一个基址寄存器和一个变址寄存器的组合 • MOV AX, [BX] [BP] • MOV AX, [SI] [DI] www.qust.edu.cn
§3.2 寻址方式 7.相对基址变址寻址方式 • 相对基址变址寻址方式中,操作数的有效地址EA是基址寄存器内容、变址寄存器内容和指令中指定的位移量三项之和,操作数在存储器中。 • 16位寻址时,基址寄存器可用BX和BP,变址寄存器可用SI和DI;32位寻址时,基址寄存器可用任何32位通用寄存器,变址寄存器可用除ESP以外的32位通用寄存器。 • 常用于对二维数组的寻址。 例如:MOV AX,MASK[BX][SI] (也可写成 MOV AX,MASK[BX+SI] 或 MOV AX ,[MASK+BX+SI]) 若(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H,(33250H)=1234H, 则物理地址=30000+2000+1000+0250=33250H 执行结果为(AX)=1234H。 MOV EAX,ARRAY[EBX][ECX] www.qust.edu.cn
数据段 DS ARRAY 二维数组起始单元 ⊕ BX EA SI §3.2 寻址方式 利用相对基址变址寻址方式对于二维数组的访问 MOV AL,ARRAY[BX][SI] • [ ]之间表示相加的关系 • [BX][SI] ←→ [BX+SI] BX、SI分别存放数组的脚标 www.qust.edu.cn
§3.2 寻址方式 80x86 新增的寻址方式 以下3种寻址方式均与比例因子(其值可为1、2、4、8)有关,只能用在80386及其后继机型中,8086/80286不支持这几种寻址方式。 EA= (基址寄存器) + (变址寄存器) 比例因子 + 位移量 ( 1 ) 比例变址寻址方式 例:MOV EAX, COUNT [ ESI 4 ] www.qust.edu.cn
§3.2 寻址方式 80x86 新增的寻址方式 (2) 基址比例变址寻址方式 例:MOV ECX, [ EAX ][ EDI 4 ] (3) 相对基址比例变址寻址方式 例:MOV EAX, TABLE [ EBP ][ EDI 4 ] ▲ 16位和32位寻址的差异 地址成分 16位寻址 32位寻址 基址寄存器 BX、BP 任何32位通用寄存器 变址寄存器 SI、DI 除ESP外的任何32位通用寄存器 比例因子 1 1、2、4、8 www.qust.edu.cn
§3.2 寻址方式 存储器寻址规定使用的寄存器与段约定 www.qust.edu.cn
§3.2 寻址方式 说明: • 在一条指令中,若有两个操作数,可以采用不同的寻址方式,也可以采用相同的寻址方式。 • 例如:ADD AX,3064H MOV AX ,CX • “[]”:汇编语言中,常将“[]”方括号中的内容作为存储单元的地址。如:[BX]、[DI]、[2056H] • 除立即数寻址和寄存器寻址外,其他寻址方式都有隐含的段寄存器,操作数实际的物理地址是由段寄存器的内容和指令码中求得的有效地址的相加来求得。 www.qust.edu.cn
处理机控制指令 数据传送指令 基本指令集 控制转移指令 算术指令 串处理指令 逻辑指令 §3.3 基本指令集 www.qust.edu.cn
§ 3.3.1 数据传送指令 • 传送类指令是指令系统中最活跃也是条数最多的一类指令,负责把数据、地址或立即数传送到寄存器或存储单元中。 • 数据传送指令可以分为5种: • 通用数据传送指令:MOV、MOVSX、MOVZX、PUSH、 POP、 PUSHA/PUSHAD、 POPA/POPAD、XCHG • 累加器专用传送指令:IN、OUT、XLAT • 地址传送指令: LEA、LDS、LES、LFS、LGS、LSS • 标志寄存器传送指令:LAHF、SAHF、PUSHF/PUSHFD、 POPF/POPFD • 类型转换指令: CBW、CWD/CWDE、CDQ、BSWAP www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令 1)传送指令 MOV 、MOVSX、MOVZX 2)堆栈操作指令 PUSH、POP、PUSHA/PUSHAD、 POPA/POPAD 3)数据交换指令 XCHG www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-传送指令MOV • MOV指令是形式最简单、用得最多的指令。它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或内存单元。 • 语句格式:MOV DST,SRC • 功能:将源操作数传送入目的地址,源地址内容不变。 即(DST)←(SRC) • 对标志位的影响:无 (1) 最基本的传送指令MOV www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-传送指令MOV 右图描述了MOV指令在传送数据时允许传送的路径及类型。 MOV指令所允许的数据传送路径及类型 www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-传送指令MOV 例如: • MOV AX,BUF ;BUF是变量,源操作数为直接寻址 • MOV BH,[DI] ;源操作数为寄存器间接寻址 • MOV DI,ES:[SI] ;源操作数为变址寻址,使用跨段前缀 • MOV BP,[BX+SI] ;源操作数为基址变址寻址 • MOV BUFA,DL ;BUFA是一字节变量 • MOV [BP],AX ;使用SS段寄存器 • MOV DS: [BP],DL ;使用跨段前缀 • MOV BUF,DS ;BUF是个字变量 • MOV ES ,BUF www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-传送指令MOV 说明: (1)双操作数指令不允许两个操作数同时为段寄存器或存储 器操作数; MOV segreg ,segreg ;错误 MOV mem ,mem ;错误 (2)立即数不能传送到段寄存器中; MOV segreg ,data ; 错误 (3)目的操作数不允许使用立即数和CS段寄存器; (4)指令指针IP,不能作为MOV指令的操作数; (5)dst与src必须类型匹配,即同时是字节或字类型; (6)MOV指令不影响标志寄存器的值。 www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-传送指令MOV 注意: • 寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。 • 有时MASM不能确定内存操作数的类型,需要用byte ptr和word ptr明确指出是字节或字类型。 • 如,判断下述指令是否正确: MOV [2345H],12H www.qust.edu.cn
;错误,类型不匹配 ;正确,MASM可以判断出要送字节0 § 3.3.1 数据传送指令 1 通用数据传送指令-传送指令MOV 例:错误的MOV 指令如下所示: • MOV AX,BL • MOV DS,1000H • MOV [BX] ,[SI] • MOV ES,CS • MOV CS,AX 例:设B是已定义的字节变量,判断指令的正确性。 • MOV AX,B • MOV AL,0 ;类型不匹配 ;不允许立即数送段寄存器 ;不允许内存操作数之间传送 ;不允许段寄存器之间传送 ; CS不能作为目的操作数 www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-传送指令MOVSX MOVSX带符号扩展传送指令(386及其后继机型可用) • 语句格式:MOVSX DST,SRC • 功能:将源操作数的符号位向高位扩展使其与目标字长相同,然后再传送到目标寄存器,而源操作数不变。 • 说明:目标为16或32位的寄存器,源是小于(或等于)目标字长的寄存器或内存操作数。 • 例如:MOVSX BX,DL MOVSX EAX,CL MOVSX EDX,[EDI] www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-传送指令MOVZX MOVZX带零扩展传送指令(386及其后继机型可用) • 语句格式:MOVZX DST,SRC • 功能:将源操作数高位用零补足16位或32位,然后再传送到目标寄存器,源操作数不变。 • 说明:目标为16或32位的寄存器,源是小于(或等于)目标字长的寄存器或内存操作数。 • 例如:MOVZX DX,AL MOVZX EAX,DATA www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-堆栈操作指令 (2) 堆栈操作指令 堆栈: • ‘先进后出’的存储区,段地址存放在SS中, • SP在任何时候都指向栈顶,进出栈后自动修改SP。 作用: • 在子程序调用或中断调用时,保存返回地址; • 暂时存放寄存器或存储器单元操作数的内容。 进栈 PUSH SRC 操作: 16位指令:(SP)←(SP)-2 ((SP)+1,(SP)) ←(SRC) 32位指令: (ESP)←(ESP)-4 ((ESP)+3, (ESP)+2, (ESP)+1,(ESP)) ←(SRC) www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-堆栈操作指令 • 出栈 POP DST • 操作: 16位指令:(DST)←((SP)+1,(SP)) (SP) ←(SP)+2 32位指令:(DST)←((ESP)+3,(ESP)+2, (ESP)+1, (ESP)) (ESP)←(ESP)+4 www.qust.edu.cn
堆栈 堆栈 1 2 SS:01F8 SS:01F8 SS:01FA SS:01FA SS:01FC AX SS:01FC SP 1101H SS:01FE 1101H SS:01FE SP AA BB AA BB 堆栈 3 SS:01F8 SS:01FA AX SS:01FC 1101H SS:01FE SP AA BB (执行PUSH AX之前) (执行PUSH AX之后) PUSH AX POP AX (执行POP AX之后)
§ 3.3.1 数据传送指令 1 通用数据传送指令-堆栈操作指令 注意: • 堆栈操作必须以字或双字为单位,不允许字节堆栈; • 不影响标志位; • 8086不允许使用立即寻址方式,286及其后继机型则允许使用立即寻址方式; • POP指令的目的操作数不能是CS。 www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-堆栈操作指令 PUSHA/PUSHAD 所有寄存器进栈指令 POPA/POPAD 所有寄存器出栈指令 其中,PUSHA和POPA可用于286及其后继机型; PUSHAD和POPAD可用于386及其后继机型。 PUSHA:16位通用寄存器依次进栈,进栈次序为:AX、CX、DX、BX,指令执行前的SP、BP、SI、DI。指令执行后(SP)←(SP)-16仍指向栈顶。 PUSHAD:32位通用寄存器依次进栈,进栈次序为:EAX、ECX、EDX、EBX,指令执行前的ESP、EBP、ESI、EDI。指令执行后(SP)←(SP)-32。 www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-堆栈操作指令 POPA:16位通用寄存器依次出栈,出栈次序为: DI、 SI、 BP、 SP、 BX、 DX、 CX、 AX 。指令执行后(SP)←(SP)+16仍指向栈顶。 POPAD:32位通用寄存器依次出栈,出栈次序为:EDI、 ESI、 EBP、 ESP、 EBX、 EDX、 ECX、 EAX 。指令执行后(ESP)←(ESP)+32仍指向栈顶。 www.qust.edu.cn
§ 3.3.1 数据传送指令 1 通用数据传送指令-数据交换指令 (3)数据交换指令 交换指令XCHG可以实现字节交换,也可以实现字交换。 386及后继机型还允许双字操作。 格式:XCHG DST ,SRC; • 功能:将源操作数与目的操作数的内容互换。 • 交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行,但不能在两个存储单元之间执行数据交换过程。 • 例如: XCHGAL,BL ;AL和BL之间进行字节交换 XCHGBX,CX ;BX和CX之间进行字交换 XCHG[2530],CX ;CX中的内容和2530,2531两单元的内容交换 XCHG EAX,EBX ; EAX和EBX寄存器的内容互换 www.qust.edu.cn
外设 I/O CPU 外设 I/O § 3.3.1 数据传送指令 2 累加器专用传送指令(只限使用AX或AL) (1)输入指令IN (2)输出指令OUT (3)换码指令XLAT www.qust.edu.cn
长格式 短格式 § 3.3.1 数据传送指令 2 累加器专用传送指令(只限使用AX或AL)-输入指令IN 输入指令用来从指定的端口取信息送入累加 器。它有四种形式: (1)语句格式:IN AL,PORT 功能:(PORT)→AL (2)语句格式:IN AX,PORT 功能:(PORT+1,PORT)→AX (3)语句格式:IN AL,DX 功能: ((DX))→AL (4)语句格式:IN AX,DX 功能: ((DX)+1,(DX))→AL (1)输入指令IN www.qust.edu.cn
§ 3.3.1 数据传送指令 2 累加器专用传送指令(只限使用AX或AL)-输入指令IN 例如: • 直接IN指令(口地址只能 8 位) IN AL ,50H IN AX ,80H • 间接IN指令(口地址是16 位,也可8位。) MOV DX,0FFF2H IN AL ,DX www.qust.edu.cn
长格式 短格式 § 3.3.1 数据传送指令 2 累加器专用传送指令(只限使用AX或AL)-输出指令OUT 输出指令用来把累加器的内容送往指定的端 口,它有四种形式: (1)语句格式:OUT PORT,AL 功能:(AL)→ (PORT) (2)语句格式:OUT PORT,AX 功能:(AX)→(PORT+1, PORT ) (3)语句格式:OUT DX,AL 功能:(AL)→((DX)) (4)语句格式:OUT DX,AX 功能:(AX)→((DX)+1, (DX)) (2) 输出指令OUT www.qust.edu.cn