1、第3章 指令格式与寻址方式,【本章提要】本章讲述Intel系列微处理器的指令通用格式和各种寻址方式。除无操作数指令以外,一般指令都需要指出操作数,指令中操作数的给出(即寻址方式)有多种方法。通过多种寻址方式,提高了程序设计的灵活性,也扩充了指令的具体功能。 【学习目标】 熟练掌握汇编语言指令和机器指令的基本格式 明确操作数的各种寻址方式 掌握各种寻址方式物理地址的计算,2019/3/22,3.1 指令格式,机器指令格式: 汇编指令格式:指令助记符表示指令的名称,它是指令功能的英文缩写,对应的是机器指令中的操作码部分; 操作数即被处理的对象,若指令中包含多个操作数,则操作数之间以逗号分隔; 注释
2、以分号开始,用来说明程序功能,不影响指令的执行。最常用的数据传送指令MOV的格式为:MOV DEST,SRC ;将源操作数SRC的值传送至目的操作数 【例】 MOV EAX,EBX ;将EBX的值送给EAX,2019/3/22,指令的3种操作数,(1)立即数操作数以常量的形式出现在指令中,称为立即数。如:20、3AH、1234Q、1011B立即数只能作为指令的源操作数。 (2)寄存器操作数指令要使用的数据存放在CPU内部寄存器中,在指令中给出寄存器名。如:AL、BX、ECX (3)内存操作数指令要用的数据存放在内存单元中,在指令中给出内存地址或访问存储器的方法。如:2000、BX注意:指令中的
3、某个操作数可能是上述3种中的任意一种形式,为了 明确具体操作数的存在位置,必须首先要明确操作数的寻址方式。,2019/3/22,立即数(常数),立即数只能作为源操作数,如 MOV AX,0FA00H;正确不能作为目的操作数,如 MOV 8000H,AX ;错误,2019/3/22,3.2.2 有效地址的概念,在80X86系列CPU中,内存单元的地址由两部分组成:段基地址和段内偏移地址(也称段内偏移量) 1)段基地址一般可由段寄存器直接给出,如CS、DS、SS、ES等,也可以通过段寄存器的内容进行计算得出。 2)段内偏移量最多可以由四个基本部分,按照一定的规则计算组合而成,所以也称为有效地址EA
4、。 有效地址四分量包括:基址寄存器内容: 变址寄存器内容:比例因子: 在32/64位寻址方式中使用位移量: 一般是一个具体数值,基址、变址寄存器的值通常为某局部存储区的首地址(比如数组),2019/3/22,有效地址EA计算方法:,EA基址寄存器(变址寄存器比例因子)位移量 有效地址四分量的使用规则:,如:ADD AX,20BXSI ;EA=(BX)+(SI)+20MOV EBX,EAX4*EDX+2AH ;EA=(EAX)+(EDX)4+2AH,2019/3/22,16位寻址方式主要是针对于实地址存储模式的应用,兼容了Intel 8086的工作模式。存储器的最大分段不超过64KB,最大线性地
5、址空间是1MB。 32位寻址方式主要是用于保护模式下,程序只能存取最低4GB地址空间,使用16位或32位地址。使用16位的分段选择子以及32位的段内偏移地址,每个段最大可达4GB。 64位寻址方式采用64位线性地址空间,支持40位物理地址空间。通常不采用分段方式,而是将CS,DS,ES和SS的段基址看成0,这样线性地址等于有效地址,是一种平展存储管理模式。,不同方式下的寻址空间,2019/3/22,3.3 各种寻址方式,一、立即寻址 操作数作为立即数直接包含在指令中,在指令执行时不需再访问存储器。立即数可以是8、16 、32 、64位。 MOV BL,12H ;字节传送 MOV AX,1020
6、H ;字传送 MOV EDX,12345678H ;32位传送 MOV RAX,1122334455667788H ;64位传送(四字),2019/3/22,二、寄存器寻址方式,寄存器寻址方式下,被访问的操作数存放在指令规定的寄存器中。 INC CL ;8位寄存器加1 MOV DS,AX ;16位寄存器传送 MOV ECX,EAX ;32位寄存器传送 MOV RBX,RAX ;64位寄存器传送 CPU执行指令时,不需要使用访问总线,所以指令的执行速度快。,2019/3/22,三存储器寻址方式,含义:操作数在存储区中,指令的操作数部分指出此操作数的有效地址EA。根据EA的生成方式的不同,可分为以
7、下几种寻址分式: (1)直接寻址:是存储器直接寻址的简称,指令中的操作数部分直接给出操作数的有效地址EA,是16位或32位的位移量数据,它放在代码段中,操作数一般在数据段中,也可以进行段超越 。MOV AX,2000H ;将DS段中2000H和2001H单元内容; 分别送AL和AHMOV AX,ES:2000H ;将ES段中2000H和2001H单 ;元内容分别送AL和AH,2019/3/22,(2)寄存器间接寻址,操作数在存储器中,而操作数的有效地址EA却在指定的寄存器中,即 EA寄存器 1)16位寻址时,EA放在SI、DI、BP或BX中。 若以SI、DI、BX间接寻址,则默认操作数在DS段
8、中。MOV AX,SI ;默认DS为段基址 若以寄存器BP间接寻址,则默认操作数在堆栈段中。MOV AX,BP ;默认SS为段基址 如果操作数不在上述规定的默认段,则必须在指令中相应的操作数前加上段超越前缀。MOV CX,DS:BP ;DS:是段超越前缀, 表示访问数据段,而非堆栈段 2)32位寻址时,8个32位通用寄存器均可作寄存器间接寻址。MOV CH,EAXMOV DX,EBX 除EBP、ESP默认段寄存器为SS外,其余6个寄存器均默认段寄存器DS,可以采用段超越前缀对其它段进行寻址。 CS和ES不能被超越,在堆栈操作时,SS也不能被超越。,2019/3/22,3)64位寻址时,16个3
9、2位/64位通用寄存器均可作寄存器间接寻址使用。 MOV CL,R10 ;操作数是8位的,操作数地址由64位寄存器R10指出 MOV RDX,EBX ;操作数是64位的,操作数地址由32位寄存器EBX,指 出经零扩展后形成64位有效地址 MOV AX,BX 的执行过程:假设BX寄存器的内容为1000H,则把DS段中的1000H号单元的16位数据传送给AX寄存器,该指令的机器码为8B07H。,注意:直接寻址中有效地址EA来自指令自身,相当于一个常量;而寄存器间接寻址中有效地址EA来自寄存器,该内容由前面的指令确定,相当于一个变量。,2019/3/22,(3)寄存器相对寻址,EA基址/变址寄存器位
10、移量 其中位移量由指令直接给出,是指令的一部分。 基址寄存器的使用规则: 1)16位寻址时,BP和BX作为基址寄存器,默认情况下,BX以DS作为段寄存器,BP以SS作为段寄存器;SI(源变址)和DI(目的变址)作为变址寄存器,默认DS作为段基址寄存器。位移量是8位或16位。 2)32位寻址时,8个32位通用寄存器都能作为基址或变址寄存器。其中ESP、EBP默认段寄存器为SS,其余6个寄存器均默认段寄存器为DS,段可以超越;除ESP外的任何32位通用寄存器均可作变址寄存器。且EBP以SS为默认段寄存器,其余以DS为默认段寄存器。位移量是8位或32位,当位移量超过8位则按照32位处理。,2019/
11、3/22,3)64位寻址时,16个32位/64位通用寄存器都能作为基址寄存器。当使用32位通用寄存器时,先将32位通用寄存器内容零扩展为64位,再与经过符号扩展为64位的位移量相加形成64位有效地址。只有MOV指令允许使用64位的位移量,而其他指令只能使用不超过32位的位移量。MOV RAX,R155;有效地址为R15寄存器内容加5 的和 MOV RCX,EDX0F0H ;有效地址为EDX寄存器内容零扩展为64位后,再与位移量0F0H符号扩展成64位(0FFFFFFFFFFFFFFF0H)相加的和,2019/3/22,MOV AX,BX24 ;也可写成 MOV AX,24BX MOV ECX,
12、EBP50 ;也可写成 MOV ECX,50EBP MOV DX,EAXBASE ;也可写成 MOV DX,BASEEAX BASE是符号常量或变量MOV ECX,EBP+50指令执行时,EBP寄存器内容为3000H,再加上位移量50H之和为3050H,然后把由SS寄存器寻址的段中的3050H单元的32位数据传送给ECX。,2019/3/22,(4)基址加变址寻址,EA 基址寄存器+变址寄存器 MOV AX,BX+SI ;或写成MOV AX,BXSI,BX决定默认段基址由DS指出 MOV EAX,EDXEBP ;由EBP决定默认SS为段基址寄存器 MOV R12,EAX+EDX ;用于64位方
13、式,有效地址为EAX+EDX的和再扩展为64位 MOV RBX,R10+RBP ;有效地址为R10+RBP的64位和。,2019/3/22,(5)带位移的基址加变址寻址,EA基址寄存器变址寄存器位移量 MOV AX,BX+SI+SOME ;16位寻址 MOV EAX,EBX+EBP+2 ;32位寻址 MOV R8,R9+R10+4 ;64位寻址,(6)比例变址寻址 EA变址寄存器比例因子位移量 乘比例因子的操作是在CPU内部靠硬件完成的。MOV EAX,ARRAYESI4 ;32位寻址MOV RAX,RBX8+10H ;64位寻址,2019/3/22,(7)基址加比例变址寻址,EA基址寄存器变
14、址寄存器比例因子 只适于32/64位寻址的情况 【例】 MOV EDX,EAX8EBX 或MOV EDX,EAX4EBXMOV EAX,EBX4ESI 或MOV EAX,EBX4ESI MOV RBX,RAX4+RCX ;64位方式,(8)带位移的基址加比例变址寻址 EA基址寄存器变址寄存器比例因子位移量 【例】 MOV AX,EBX8+ECX+100 ;或 MOV AX,EBX8ECX100 -只能是32位或64位寻址,2019/3/22,四端口寻址方式,端口寻址方式只在对外部设备的访问指令中适用,包括端口的直接寻址和间接寻址两种方式,具体细节在3.3.1节的I/O数据传送类指令的叙述中,结合具体指令详细介绍。,2019/3/22,段寄存器的使用规则,