《指令系统层》PPT课件.ppt
计算机系统结构系统的层次结构,面向问题语言层,汇编语言层,操作系统层,指令系统层,微体系结构层,5层,4层,3层,2层,1层,硬件-机器语言,机器与人的界面,符号化的机器语言,面向用户的语言,硬件/固件(微程序),翻译(编译器),翻译(汇编器),部分解释(操作系统),直接执行/解释(微程序),一台计算机所能执行的全部指令,称为该机的指令系统或指令集,具体内容包括指令格式、寻址方式、指令类型与功能。相对微体系结构层,指令系统层是一个抽象的层次,它是硬件和软件之间的接口,其主要特征就是指令系统。本章将以80 x86为背景讨论指令系统层,主要内容包括:80 x86系列CPU的结构特点;80 x86主存储器和寄存器组织;80 x86指令系统。,第4章 指令系统层,典型CPU漫谈 从 Intel 4004Pentium IV:4004 80088086/8088802868038680486(IA32位结构)Pentium Pentium Pro Pentium MMX Pentium II Pentium III CeleronPentium IV(IA准64位结构)Pentium D(2005-4发布)Pentium 6470,2.4G,3.8G,4.1 80 x86 CPU 80 x86 CPU概况如下表所示:,4.1.1 8086/8088 CPU,8086是16位,即CPU的内外数据总线为16位,一个总线周期可以传送一个字(16位)数据。8088是准16位,内部总线为16位,外部为8位,因此一个总线周期只能传送一个字节。地址20位,可寻址1MB主存空间。8086/8088的指令系统完全相同,完全兼容.,18086/8088 CPU内部结构 模型机CPU指令串行执行。在CPU执行指令时,系统总线与主存可能空闲,因此程序执行效率不高。,8086/8088CPU采用指令流水线结构 总线接口部件BIU(Bus Interface Unit)取指令(或取操作数)执行部件EU(Execute Unit)执行指令 EU和BIU两个部件并行工作,指令的读取与执行部分重叠,从而提高了指令的执行速度。,8086 CPU内部结构如下图所示:,下面讨论EU和BIU的功能:(1)执行部件EU:执行指令从指令队列中取出指令代码,由EU控制器进行译码后产生对应的控制信号到各部件以完成指令规定的操作。对操作数进行算术和逻辑运算,并将运算结果的特征状态存放在标志寄存器中。由于EU不直接与系统总线连接,因此当需要与主存储器或I/O端口传送数据时,EU向BIU发出命令,并提供给BIU 16位有效地址与传送的数据。,(2)总线接口部件BIU:完成CPU与主存或I/O端口之间的信息传送从主存取出指令送到指令队列中排队。从主存或I/O端口取操作数或存放运算结果。计算并形成访问主存的20位物理地址。,2.8086/8088 主存地址的形成,段基址:将1 MB主存空间划分为若干段,每个段的最大长度为64 KB。段的20位段起始地址称为段基址。段基值:20位段起始地址的高16位偏移地址(偏移量):一个主存单元与所在段的段基址之间的字节距离。逻辑地址:(段基址:偏移地址)物理地址:将16位段基值左移4位后与16位偏移地址相加,形成20位主存单元。有效地址?,4.1.2 80386/80486CPU(过渡产品)1Intel 8038632位地址,寻址空间为4GB。具有片内存储管理部件,使虚拟存储空间(逻辑地址空间)可达64TB。字长32位,系统总线的数据通路宽度32位。采用多级流水线结构。平均运算速度约为4 MIPS。,2Intel 80486,4.1.3 Pentium系列CPU(Pentium CPU的功能结构图),4.2.1 80 x86 CPU的寄存器 180 x86 CPU的寄存器分类(3大类)基本结构寄存器组:通用寄存器、IP、FR、段寄存器。系统级寄存器组:(不能访问)系统地址寄存器、控制寄存器、测试寄存器、调试寄存器。浮点寄存器组:(不讲,不做要求)数据寄存器、标记字寄存器、指令和数据指针寄存器、控制字寄存器。,4.2 80 x86 CPU的寄存器和主存储器,2基本结构寄存器组 通用寄存器;指令指针寄存器IP;标志寄存器FR;段寄存器(16位)。,(1)通用寄存器 AX(Accumulator)作为累加器用。在乘除等指令中指定用来存放操作数。另外,所有的I/O 指令都使用这一寄存器与外部设备传送信息。eg1 MUL SRC AXAL*SRC eg2 DIV SRC ALAX/SRC 商 AHAX/SRC 余数 eg3 MOV AH,4CH INT 21H 返回DOS BX(Base)可以作为通用寄存器使用。此外,在计算存储器地址时,它经常用作基址寄存器。,CX(Count)可以作为通用寄存器使用。此外,它还常用来保存计数值,如在移位指令、循环(LOOP)和串处理指令中用作隐含的计数器。DX可以作为通用寄存器使用。一般在做双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。此外,对某些I/O 操作,DX可用来存放I/O 的端口地址。SP、BP、DI、SI 这4个16位寄存器可以像数据寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用。此外,它们更经常的用途是在存储器寻址时,提供偏移地址。因此,可称它们为指针或变址寄存器。,(2)指令指针寄存器和标志寄存器IP(Instruction Pointer)为指令指针寄存器,它用来存放代码段中的偏移地址。IP作为指令的地址指针,其作用类似于其他计算机中的程序计数器PC,当现行指令执行完毕时,由IP提供下一条指令地址。FLAGS为标志寄存器,又称PSW(Program Status Word),即程序状态寄存器。这是一个存放条件码标志、控制标志和系统标志的寄存器。80386及其后继机型的指令指针寄存器EIP和标志寄存器EFLAGS是32位的,其作用和相应的16位寄存器相同。,下图说明了80 x86 CPU中标志寄存器的内容:,条件码标志包括以下6位:OF(Over Flow Flag)溢出标志。将参加算术运算的数看作带符号数,如运算结果超出补码表示数的范围N,即溢出时,则OF置1;否则OF置0。SF(Sign Flag)符号标志。把指令执行结果看作带符号数,如结果为负,则SF置1;结果为正,则SF置0。ZF(Zero Flag)零标志。如指令执行结果各位全为0时,则ZF置1;否则ZF置0。,CF(Carry Flag)进位标志。在进行算术运算时,如最高位(对字操作是第15位,对字节操作是第7位)产生进位或借位时,则CF置1;否则置0。在移位类指令中,CF用来存放移出的代码(0或1)。AF(Auxiliary Carry Flag)辅助进位标志。在进行算术运算时,如低字节中低4位(第3位)产生进位或借位时,则AF置1;否则AF置0。PF(Parity Flag)奇偶标志。用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当运算结果中1的个数为偶数时置1,否则置0。,控制标志位1位 DF(Direction Flag)方向标志,用来在串处理指令中控制处理信息的方向。当DF位为1时,每次操作后使变址寄存器SI和DI减小,这样就使串处理从高地址向低地址方向处理。当DF位为0时,则使SI和DI增大,使串处理从低地址向高地址方向处理。eg MOVSB 若DF=0,则 ES:DI(DS:SI)SI(SI)+1 DI(DI)+1,系统标志位有10位:TF(Trap Flag)陷阱标志,用于调试时的单步方式操作。IF(Interrupt Flag)中断标志。IOPL(I/O Privilege Level)I/O特权级标志。NT(Nested Task)嵌套任务标志,用来表示当前的任务是否嵌套在另一任务内。RF(Resume Flag)恢复标志位,它与调试寄存器的断点一起使用,以保证不重复处理断点。VM(Virtual-8086 Mode)虚拟8086模式位。AC(Alignment Check mode)对准检查方式位。VIF(Virtual Interrupt Flag)虚拟中断标志。VIP(Virtual Interrupt Pending flag)虚拟中断未决标志。ID(IDentification flag)标识标志,程序有设置和清除ID标识的能力,以指示处理机对CPU ID指令的支持。,在调试程序DEBUG中提供了测试标志位的手段,它用符号表示某些标志位的值:,(3)段寄存器16位 段寄存器用于存储器寻址,用来直接或 间接地存放段地址(段基值或段选择器)代码段CS(Code Segment)数据段DS(Data Segment)堆栈段SS(Stack Segment)附加段ES(Extra Segment)FS和GS,附加的数据段(80386以后),4.2.2 80 x86的主存储器 1存储单元的地址和内容计算机存储信息的基本单位是一个二进制位,一位可存储一个二进制数0或1.字节:8位字:16位双字:32位4字:64位,地址:以字节为单元编址,每个字节单元一个唯一的编号(房间号码),即存储器地址,称为物理地址.地址从0开始编号,顺序地每次加1.地址用二进制表示的无符号整数,书写格式为十六进制数),8086/8088的地址总线20位:可访问的字节单元地址范围为00000HFFFFFH;80286的地址总线24位:可访问的地址范围为000000HFFFFFFH;80386/80486和Pentium地址总线32位:可访问的地址范围为00000000HFFFFFFFFH;Pentium Pro和P地址总线36位:可访问的地址范围为000000000HFFFFFFFFFH。,内容:一个存储单元中存放的信息称为该存储单元的内容 0004H号字节单元中存放的信息为78H,表示为:(0004H)=78H,两个字节单元就构成了一个字单元,字单元的地址采用它的低地址来表示。右图中0004H字单元的内容为5678H,表示为:(0004H)=5678H,双字单元的地址由其最低字节的地址指定,因此0004H双字单元的内容为:(0004H)=12345678H。,说明,存放数据时,低位字节存入低地址,高位字节存入高地址字,双字的地址用低地址表示同一地址单元既可以看作字节、字、双字、4字单元的地址字单元的地址可以是偶数,也可以是奇数8086、80286,访问M以字为单位,以偶地址访问(读/写)M;奇地址取字需访问M两次X表示地址,(X)表示单元的内容(Y)=(X),实模式虚拟8086模式保护模式,实模式:8086用16根地址线提供1M寻址空间的工作模式保护模式:一种可提供虚拟存储管理和多任务管理机制的工作模式。虚模式:在一台机器上同时模拟多个8086处理器工作的模式。,2实模式存储器寻址 8086/8088只能在实模式下,其他的CPU均可在实模式或保护模式下工作。(1)存储器的分段 实模式下允许的最大寻址空间为1 MB。8086/8088的地址总线宽度为20位,因而其最大寻址空间正好是1MB。在1MB的存储器里,每个存储单元都有一个唯一的20位地址,称为物理地址。而对于其他微处理器在实模式下只能访问前1 MB的存储器地址。,8086/8088:16位字长的机器里怎么提供20位地址?,段基址:将1 MB主存空间划分为若干段,每个段的最大长度为64 KB。段的20位段起始地址称为段基址。段基值:20位段起始地址的高16位偏移地址(偏移量):一个主存单元与所在段的段基址之间的字节距离。逻辑地址:(段基址:偏移地址)物理地址:将16位段基值左移4位后与16位偏移地址相加,形成20位主存单元。有效地址?,实模式存储器寻址过程如下图所示:,(2)段寄存器 在808680286中,有4个专门存放段基值的寄存器,称为段寄存器。它们分别是代码段CS、数据段DS、堆栈段SS和附加段ES寄存器。每个段寄存器可以确定一个段的起始地址,而这些段则各有各的用途。代码段存放当前正在运行的程序。数据段存放当前运行程序所用的数据。堆栈段定义了堆栈的所在区域。附加段是附加的数据段,它是一个辅助的数据区,也是串处理指令的目的操作数存放区。在80386及其后继的80 x86中,除上述4个段寄存器外,又增加了2个段寄存器FS和GS,它们也是附加的数据段寄存器,所以808680286的程序允许4个存储段,而后继的80 x86程序可允许6个存储段。,一般情况下,各段在存储器中的分配是由操作系统负责的。每个段可以独立地占用小于或等于64 KB的存储区,如右图所示。,段重叠指每个段区的大小允许根据实际需要来分配,而不一定要占有64 KB的最大段空间。,在80 x86中,段寄存器和与其对应存放偏移地址的寄存器之间有一种默认的组合关系,如下表所示:,8086/8088、80286:,段寄存器 偏移地址,80386及其后继机型:段寄存器 偏移地址,3保护模式存储器寻址(1)逻辑地址 逻辑地址(段选择器:偏移地址)段选择器存放在段寄存器中,但它不能直接确定段基址,而由CPU通过一定的方法取得段基址,再和偏移地址相加,从而求得所选存储单元的线性地址,线性地址再通过分页部件转换成物理地址。,下图为保护模式存储器寻址示意图。可以看出,它和实模式寻址的另一个区别是:偏移地址为32位,最大段长可从64 KB扩大到4 GB。,(2)描述符 段选择器是通过描述符表取得描述符,从而得到段基址的。描述符有8个字节长,用来说明段的起始地址、段的大小、段在存储器中的位置及有关的控制和状态信息,其格式如下图所示:,(3)段选择器描述符表都存放在存储器中,每个表分别构成一个64 KB长的段,表中可存放8 K个描述符。,段选择器存放在段寄存器中,16位长,其格式如下:,INDEX为索引值,即描述符表索引值,它给出所选描述符在描述符表中的地址。该字段共13位,可从表中8K个描述符中选取一个。,下图说明了从逻辑地址通过段选择器找到描述符表,再找到描述符,由此确定所选段和存储单元的过程:,每当段寄存器中段选择器的值确定以后,硬件会自动地根据段选择器的索引值,从系统的描述符表中取出一个8字节(64位)的描述符,装入到相应的段描述符寄存器中,以后每当出现对该段存储器的访问时,就可直接使用相应的描述符寄存器中的段基址作为线性地址计算的一个元素,而不需要在内存中查表得到段基址,因此加快了存储器物理地址的形成。应当指出,段寄存器是程序可访问的,而描述符寄存器则是程序不可访问的。,为了提高保护模式存储器寻址的速度,CPU中设置了6个64位的描述符寄存器,用来存放对应段的描述符,如下图所示:,480 x86 CPU逻辑地址的来源 从以上内容可知,实模式下的逻辑地址由段基值和偏移地址组成;而保护模式下的逻辑地址由段选择器和偏移地址组成。实际上段基值和选择器都是由段寄存器提供。在汇编语言程序中,逻辑地址可表示为:段基值(或段选择器):偏移地址,在80 x86 CPU中,逻辑地址的两个分量之间存在一种默认组合关系,可以不在程序中指明。这种默认组合取决于指令所需的操作类型,表4-3给出了不同操作类型,获得段基值(或段选择器)和偏移地址的不同来源。,表4-3 逻辑地址的两个分量的默认组合关系,在这种默认组合下,程序中不必专门指定其组合关系,但程序如用到非默认的组合关系(如使用允许替代来源),则必须用段跨越前缀加以说明。,当CPU执行从存储器取指令的操作时,必须由代码段寄存器CS提供段基值(或段选择器),而偏移地址从指令指针IP或EIP中获得。如指令执行的是堆栈操作,则必须由SS提供当前段段基值(或段选择器),而堆栈指针SP或ESP给出栈顶单元的偏移地址。如指令执行时,需要存取存储器中的操作数,操作数通常存放在当前数据段中,则隐含由DS提供段基值(或段选择器);如操作数在其他当前段中,则用其他段寄存器(如CS、SS、ES)来指定操作数所在段,这时指令中必须要给出对应的段寄存器名,即段跨越前缀,而存放操作数单元的偏移地址是由CPU根据指令提供的寻址方式计算得到的。按寻址方式计算出来的偏移地址又称为有效地址EA(Effective Address)。,4.3 80 x86 CPU的指令系统,80 x86 CPU的指令集是在8086/8088 CPU的指令系统上发展起来的。8086/8088 指令系统是基本指令集,80286、80386、80486和Pentium指令系统是在基本指令集上进行了扩充。扩充指令的一部分是增强的8086/8088基本指令和一些专用指令;另一部分是系统控制指令,即特权指令,它们对80286、80386、80486和Pentium保护模式的多任务、存储器管理和保护机制提供了控制能力。,80 x86 CPU采用了变字长的机器指令格式,由115个字节组成一条指令。一般格式如下图所示:,本节先介绍80 x86的寻址方式,然后着重介绍用于运行应用程序的80 x86指令。,4.3.1 80 x86寻址方式 指令中的寻址方式是用来确定操作数地址以找到指令所需的操作数。在80 x86 CPU中,8086和80286的字长是16位,一般情况下只处理8位和16位操作数,只是在乘、除指令中才会有32位操作数;80386及其后继机型的字长为32位,因此它除可处理8位和16位操作数外,还可处理32位操作数,在乘、除法情况下可产生64位操作数。本节下面所述例子中,如处理的是32位操作50数,则适用于80386及其后继机型。,1立即寻址方式和寄存器寻址方式(1)立即寻址方式(Immediate Addressing)立即数寻址是指指令所需的操作数直接在指令代码中,随着取指令一起取到CPU中。这种操作数称为立即数。立即数可以是8位或16位的。对于80386及其后继机型则可以是8位或32位的。这种寻址方式如下图所示:,【例4-1】下述汇编指令的源操作数都采用立即寻址方式。MOV AL,5;将8位立即数05H送入AL中 MOV AX,0B064H MOV BX,AB MOV EAX,12345678H,立即数用来表示常数,它经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段,且源操作数长度应与目的操作数长度一致。在汇编指令中,立即数若是数值常数可直接书写,若是字符常数则应加上引号。,在汇编指令中,立即数若是以AF开始的十六进制数,则必须在数前面加上0,如上述第二条指令,否则汇编程序会将立即数当作符号处理。,寄存器寻址是指指令所需的操作数存放在CPU的寄存器(通用寄存器或段寄存器)中,通过指令中的寄存器地址去找到操作数。,(2)寄存器寻址方式(Register Addressing),在汇编指令中,寄存器地址直接用寄存器名表示,如用AX、BX、AL、BH、EAX、EBX、DS、ES等,这些寄存器可以是8位的、16位的或32位的。这种寻址方式如下图所示:,【例4-3】MOV BL,AL;将AL中的内容送到BL中 MOV DS,AX MOV ECX,EDX,【例4-2】指令“MOV AX,BX”的源和目的操作数都采用寄存器寻址方式,该指令完成将BX中的内容送到AX中。如指令执行前(AX)3064H,(BX)1234H;则指令执行后,(AX)1234H,(BX)保持不变。,2存储器寻址方式,操作数地址(物理地址)是根据段基值(或段选择器)和偏移地址通过一定的方法得到。段基址在实模式和保护模式下可从不同的途径取得。偏移地址是指存放操作数的存储单元与段起始地址(段基址)之间的字节距离。在80 x86里,把按寻址方式计算出来的操作数偏移地址称为有效地址EA(Effective Address)。,在汇编语言程序中,一个存储单元的地址采用逻辑地址来表示,其形式为:段基值(或选段择器):偏移地址,存储器操作数的寻址方式不同,则形成有效地址EA的方法就不同。有效地址EA可以由4个地址分量的某种组合求得,它们分别是:位移量 它是指令代码中的一个8位、16位或32位二进制数,但它不是立即数,而是一个地址量。在源程序中,位移量通常以符号地址(变量名或标号)的形式出现,也可以是常数,经汇编后,这些符号地址的偏移地址或常数就转换为指令代码中的位移量。基地址 即基址寄存器或基址指针的内容。变址量 即变址寄存器的内容。比例因子(Scale Factor)它是80386及其后继机型新增加的寻址方式中的一个术语,其值可为1,2,4或8。在含比例因子的寻址方式中,可用变址寄存器的内容乘以比例因子来取得变址值。,16/32位寻址时有效地址4种分量的组成,8086/80286只能使用16位寻址,而80386及其后继机型则既可用32位寻址,也可用16位寻址。在这两种情况下,对以上4个地址分量的组成有不同的规定,如下表所示:,对不同的存储器寻址方式,构成其有效地址EA的地址分量是不同的,但这些寻址方式的有效地址的计算都可以用下式表示:,EA=基地址+(变址量 比例因子)+位移量,下面具体讨论6种存储器寻址方式。,(1)直接寻址方式(Direct Addressing)直接寻址是指指令所需的操作数存放在存储单元中,操作数的有效地址EA直接由指令代码中的位移量提供,即EA只包含位移量这一种地址分量。此时,位移量的值就是操作数的有效地址,如下图所示:,上式中的每一个地址分量均可空缺,但比例因子只能与变址寄存器同时使用。,用数值地址表示EA 在采用直接寻址方式的汇编指令中,如用数值表示操作数的有效地址,则操作数所在段的段寄存器必须指明,不能省略。例如,传送指令源操作数的有效地址用数值地址表示:,MOV BX,DS:1000H,这条指令完成将当前数据段偏移1000H个字节的字单元内容1234H送入BX中,如上图所示,其中源操作数的有效地址EA是1000H。“MOD R/M”是指令代码中的寻址字段。,用符号地址表示EA 在源程序中,常用符号地址表示存放操作数的存储单元,因此在汇编指令中,可用符号地址表示的直接寻址方式来存取操作数。,操作数如果存放在数据段中,则指令中不必给出数据段寄存器名(即默认使用DS);如果操作数不是存放在数据段中,则必须给出段寄存器名。例如:,MOV BX,VAR;将VAR指向的字单元内容送到BX中 MOV DA_BYTE,0FH;将立即数0FH置入DA_BYTE指向的字节单元MOV CL,DA+3;把由DA地址偏移3个字节的字节单元内容送到CL中,上述3条指令分别等价于:,MOV BX,DS:VAR MOV DS:DA_BYTE,0FH MOV CL,DS:DA+3,(2)寄存器间接寻址方式(Register Indirect Addressing)寄存器间接寻址是指指令所需的操作数在存储单元中,操作数的有效地址EA直接从基址寄存器或变址寄存器中获得,即EA是包含基址寄存器内容(或变址寄存器内容)的一个地址分量。这种寻址方式如下图所示:,这种寻址方式实际上是将有效地址事先存放在一个寄存器中,因此这个寄存器就如同一个地址指针。,由于用寄存器作为地址指针,因此在程序中只要修改间址寄存器的内容,就可以用同一条指令访问不同的存储单元。这种寻址方式的使用格式如下:MOV CH,SI MOV DI,BX MOV AL,BX MOV CX,BP 上述指令分别等价于:MOV CH,DS:SI MOV DS:DI,BX MOV AL,DS:BX MOV CX,SS:BP,寄存器寻址方式在16位寻址时可用的寄存器是BX、BP、SI和DI;在32位寻址时可用EAX、EBX、ECX、EDX、ESP、EBP、ESI和EDI等8个通用寄存器。凡使用BP、ESP和EBP时,其默认段为SS段。其他寄存器的默认段为DS寄存器。,(3)寄存器相对寻址方式(Register Relative Addressing)(也称变址寻址方式或基址寻址方式)指令所需的操作数在存储单元中,操作数的有效地址EA是两个地址分量之和:基址寄存器(或变址寄存器)的内容与指令中指定的位移量之和。这种寻址方式如下图所示:,这种寻址方式若使用的是变址寄存器称为变址寻址方式;若使用的是基址寄存器称为基址寻址方式。它所允许使用的寄存器及与其对应的默认段情况与寄存器间接寻址方式中所说明的相同。,在汇编指令中,位移量部分可用数值表示,也可用符号地址表示(此时用符号地址的偏移地址作为位移量),其寻址方式的使用格式如下:MOV AX,10HSI;位移量为8位常数,EA=10H+(SI),默认段寄存器DSMOV TAB1BP,CL;位移量为符号地址TAB1的16位偏移地址,默认段寄存器是SS,寄存器相对寻址方式常用来访问顺序存放在主存中的一维数组、表、字符串等。其典型用法是将指令中不能修改的位移量作为基准地址,而将变址或基址寄存器内容作为修改量。例如数组的起始单元位置是固定的,因此由指令中的位移量给出;而被访问的数组元素相对其起始单元的距离由变址或基址寄存器提供,通过修改寄存器的内容就可以访问数组中不同的元素。,【例4-4】如右图所示,一维数组ARY存放在主存的数据段中,数组的每个元素长度相同且都占2个字节单元。从数组的首址起依次存放各数组元素ARY(0)、ARY(1)、ARY(2)、ARY(i)、。传送指令:MOV AX,ARYSI 可用来访问数组中的元素,指令中的符号地址ARY指向该数组的首址;变址寄存器SI的内容表示所访问元素与数组首址之间的字节距离,则所访问元素的有 效地址:EA=ARY的偏移地址+(SI)当SI内容为0时,将访问ARY(0)元素;SI内容为1*2时访问ARY(1)元素;SI内容为 i*2时访问ARY(i),即通过修改SI的内容可以访问数组中任何一个元素。右图给出了访问数组元素ARY(2)的寻址过程。,用寄存器相对寻址方式访问一维数组,(4)基址变址寻址方式(Based Indexed Addressing)指令所需的操作数在主存单元中,操作数的有效地址EA是三个地址分量之和:基址寄存器内容、变址寄存器内容与指令中的位移量(0位、8位、16位或32位)之和,称为基址变址寻址方式,如下图所示:,基址变址寻址方式的位移量可用数值或符号地址表示,其使用格式如下:MOV AX,200HBXSI;位移量为16位常数,EA=200H+(BX)+(SI),默认段寄存器为DS MOV AX,ARRAYBPSI;位移量为符号地址ARRAY的16位 偏移地址,默认段寄存器为SS MOV BPDI,DL;位移量为0,EA=(BP)+(DI),默认段寄存器为SS 由于基址变址寻址方式中有两个地址分量可以在程序执行过程中进行修改,因此常用来访问存放在主存中的二维数组。,【例4-8】如右图所示,ARRAY数组是10行、10列的二维数组,按行存放在主存堆栈段中。从数组的首址ARRAY起依次存放各数组元素:第0行元素为ARRAY(0,0)ARRAY(0,9)共10个,第1行元素为ARRAY(1,0)ARRAY(1,9),。每个元素占用一个字节单元。可以用指令:MOV AL,ARRAYBPSI,访问数组中的某个元素ARRAY(i,j),指令中的位移量ARRAY指向数组首址;BP存放被访问行的起始位置相对数组首址的距离,即i*10;SI存放被访问数组元素相对本行首址的距离,即j,则要访问元素的有效地址:,EA ARRAY的偏移地址+(BP)+(SI),段基值隐含由SS给出。,右上图给出了访问数组第1行第8列元素ARRAY(1,8)的寻址过程。,(5)比例变址寻址方式(Scaled Indexed Addressing)指令所需的操作数在主存单元中,操作数的有效地址EA是变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和,所以EA由3种成分组成。这种寻址方式如下图所示:,这种寻址方式与相对寄存器寻址相比,增加了比例因子,其优点在于:对于元素大小为2,4,8字节的数组,可以在变址寄存器中给出数组元素下标,而由寻址方式控制直接用比例因子把下标转换为变址值。,【例4-5】MOV EAX,COUNTESI*4;如要求把双字数组COUNT中的元素3送到EAX中,用这种寻址方式可直接在ESI中放入3,选择比例因子4(数组元素为4字节长)就可以方便地达到目的,如下图所示,而不必像在相对寄存器寻址方式中那样,要把变址值直接装入寄存器中。,(6)基址比例变址寻址方式(Based Scaled Indexed Addressing)指令所需的操作数在主存单元中,操作数的有效地址是变址寄存器的内容乘以比例因子,加上基址寄存器的内容,再加上位移量(0位、8位或32位)之和,所以有效地址EA由4种成分组成。这种寻址方式如下图所示。,这种寻址方式比基址变址方式增加了比例因子,便于对元素为2,4,8字节的二维数组进行处理。,【例4-10】MOV EAX,TABLEEBPEDI*4,3串操作寻址方式(String Addressing)80 x86提供专门的串操作指令,这些指令所用的操作数也在存储器中,但它们不能使用上述寻址方式,而是隐含使用变址寄存器SI、ESI、DI或EDI,如下图所示。串操作指令规定,隐含使用SI或ESI作为在数据段中的源串(即源操作数)的地址指针;隐含使用DI或EDI作为在附加段中的目的串的地址指针。在完成一次串操作后,指令自动修改SI或ESI、DI或EDI两个地址指针,使SI或ESI、DI或EDI指向下一个串元素的存储单元。,