版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 80X86指令系统和汇编语言(1)教学提示:本章描述了80X86微处理器指令的多种寻址方式,描述了80X86指令系统中各指令的书写格式、指令含义及编程应用;描述了汇编语言伪指令的书写格式和含义、汇编语言中语句的书写格式。另外通过大量的实例描述了汇编语言程序设计的基本方法,详细介绍了循环、分支、子程序的设计方法和DOS功能调用。教学目标:要求熟练掌握8086微处理器指令系统的指令寻址方式、指令书写格式和含义、指令在编程中的使用;要求掌握汇编语言语句的书写格式;要求掌握伪指令的含义及在程序中的应用;能够编写完整的汇编语言源程序;要求掌握循环、分支、子程序设计的概念和方法;掌握常用的DOS功
2、能调用。这一章的重点是:与8086微处理器相关的寻址方式、指令系统和汇编语言程序设计,对于80286型号以上的微处理器的相关知识,要求有基本的了解。3.1 寻址方式计算机是通过执行程序解决问题的,程序是由指令组成的。指令一般由操作码字段和操作数字段组成,8086/8088带有操作数字段的指令一般格式为:操作码 操作数操作码 目的操作数,源操作数 操作码字段,指示计算机所要执行的操作。操作数字段,指出指令执行操作过程使用的操作数或产生的结果。操作数字段可以是操作数本身,也可以是操作数地址,或是地址的一部分;还可以是指向操作数地址的指针或其它信息。 根据操作数字段的个数,一般分为:一地址指令、二地
3、址指令。单操作数指令是一地址指令,如INC BX。 加法指令,除需要指出进行加法操作外,还要提供加数和被加数,结果一般保存在目的操作数中,如ADD AX,BX指令表示BX的内容加AX的内容,和保存在AX中。 操作数可以保存在寄存器、存储器或者I/O接口中。与数据有关的寻址方式用来说明指令中操作数如何存放以及寻找操作数的方法。另外有的指令不对数据操作,而是控制程序的执行顺序,如转移指令、调用子程序指令等。执行这些指令要改变程序的执行顺序。如何找到新的执行地址,称为与转移地址有关的寻址方式。8086/8088微处理器的寻址方式完全相同,80386及后续型号的微处理器寻址方式基本相同,分别介绍如下。
4、3.1.1 8086寻址方式在与数据有关的寻址方式中,操作数一般可以存放在寄存器、存储器或者I/O接口中。寄存器或I/O接口寻址方式比较简单,存储器寻址方式比较多;与转移地址有关的寻址方式也涉及到存储器,寻址方式与存储器相关的内容介绍如下。1. 8086存储器地址空间及存储器编址8086微处理器只有20条地址线,因此可寻址内存空间为1MB, 地址由00000-FFFFFH编码,也就是说,内存划分为1M个单元,每个单元分配一个地址,每个单元中可以存放一字节的信息。指令对一个单元读出或者写入信息,必须给出这个单元的地址才能够进行。若存取的信息是1字节,则指令中给出这个单元的地址就可以了。 若指令中
5、一次存储的信息是一个字(16位二进制数),则将字的低字节存放在存储器的低地址,高字节存放在存储器的高地址,但是在指令中只要给出低地址就可以了,不必给出2个地址,但是需要在指令中含有标识存储的是字还是字节的信息。内存地址空间存放数据的起始地址可以在任意位置,但是字数据存放在偶数地址开始的存储器单元,读或者写时8086CPU只用1个总线周期;字数据存放在奇数地址开始的存储器单元,读或者写时8086CPU用2个总线周期,花费时间比较长。 上述前一种情况称为对准的字,对应地址是2的倍数;后一种情况称为未对准的字,对应地址不是2的倍数。例如字数据55FFH如果存放在地址为02102的存储单元中,指的是字
6、的低8位0FFH存放在地址为02102的存储单元中,字的高8位55H存放在地址为02103的存储单元中,是对准的字。1MB内存空间分通用和专用两个区域,00000003FFH为专用区,存放中断向量表。FFFF0FFFFFH也是专用区,机器启动以后从FFFF0H开始执行指令。 其他区域为通用区。 8086有逻辑地址和物理地址的区分,逻辑地址由段基址和偏移地址两部分组成。 程序员编写程序时只能使用逻辑地址,段基址也称段地址或段址,是由段寄存器CS、DS、ES和SS给出的段起始地址;偏移地址为存储单元在段内相对于段起始地址的偏移距离,也称为偏移量地址、偏移地址、偏址或偏移量。 段基址和偏移量都为16
7、位。偏移量通常来自指令指针寄存器、基址寄存器、指针寄存器和变址寄存器,指令中间可以指定偏移量,也可以由其中几个寄存器的内容组合而成。 例如,CS:IP表示逻辑地址,表示程序执行的地址由代码段CS的内容和指令指针IP的内容(也就是偏移量)组成; 另外DS:SI或者ES:DI或者1000:2000H这样的写法都表示逻辑地址。 在逻辑地址中冒号前面表示的是段基址,冒号后面表示的是偏移地址。 物理地址是CPU与存储器进行数据交换时实际寻址所使用的地址。 8086物理地址为20位。 每个内存单元的物理地址都是唯一的,同一个物理地址可以由不同的逻辑地址来构成。 由逻辑地址计算物理地址的方法,是将逻辑地址中
8、的段基址左移4位(相当于乘16),加偏移地址。 例如, 假设段寄存器内容为1000H,偏移量为2000H,那么物理地址为12000H。如果段寄存器内容为1100H,偏移量为1000H,那么物理地址也是12000H。 一个程序可以有代码段、数据段、附加段和堆栈段,它们的段基址分别存放在CS、DS、ES和SS中。 段寄存器为16位,其内容在计算物理地址时要乘16,比如DS的内容为1000H,对应物理地址为10000H,相当于在二进制数尾部补了4个0,相当于乘了16。 另外,段的起始地址只能从物理地址能够整除16的(二进制数尾部为4个0)那些地址开始。 例如,下面第一列的物理地址可以作为段地址,存入
9、段寄存器时只存前16位二进制数;其他列不可以作为段地址。00000H 00001H 00002H 00003H 0000FH00010H 00011H 00012H 00013H 0001FH00020H 00021H 00022H 00023H 0002FH00030H 00031H 00032H 00033H 0003FH FFFF0H FFFF1H FFFF2H FFFF3H FFFFFH 8086指令中一般不写出段寄存器,要根据表3.1(p60)的偏移地址确定默认的段寄存器。 例如MOV AX,BX指令中BX内容为偏移地址,默认的段寄存器是DS。 另外,在指令中也可以明确写出数据在哪一
10、个段寄存器,例如MOV AX,ES:BX指令中BX内容为偏移地址,使用的段寄存器是ES,这种明确写出段寄存器的方法称为段跨越前缀。 表3.1中,IP用来确定代码段中下一条要执行的指令的偏移地址,IP由控制程序分支的条件转移、无条件转移、过程调用的指令和中断及异常等控制,用户程序不能直接控制IP。 用户程序也不能直接控制CS,CS由操作系统修改。 表3.1中,SP是堆栈指针,8086堆栈是按照“先进后出”原则在内存中实现的一块存储区域,堆栈的容量最大为64KB。 堆栈由段寄存器SS和堆栈指针SP来寻址,SS给出堆栈段的段起始地址,SP指向当前栈顶,即段起始地址到栈顶的偏移量。 堆栈操作以字为单位
11、。数据进栈,堆栈指针SP-2,数据高字节存入大地址单元,低字节存入相邻的小地址单元。 数据出栈,数据低字节从堆栈出到目的操作数的低位,高字节从堆栈出到目的操作数的高位,堆栈指针SP+2。 BP为指针寄存器,用于访问堆栈段中的数据, BP用于存放堆栈段中某个数据的偏移地址。 表3.1中,SI称为源变址寄存器,存放源操作数的偏移地址;DI称为目的变址寄存器,存放目的操作数的偏移地址。 另外,8086允许使用16条地址线作为I/O端口的地址,可寻址空间为64K个8位的I/O端口,地址为0000-FFFFH,与存储器空间相互独立。2. 与数据有关的寻址方式 在二地址指令中,如: 操作码 目的操作数,源
12、操作数 如果不说明对哪一个操作数寻址,下文一般指的是对源操作数寻址。 1) 立即寻址方式 该方式用常数给寄存器或存储器单元赋初值,且只能用于源操作数字段。操作数作为指令的一部分,保存在指令中。 例如: MOV BL,25H ;25H送BL MOV AX,1245H ;1245H送AX 2) 寄存器寻址方式 操作数在寄存器中,指令中指定寄存器号。 16位操作数的寄存器是:AX、BX、CX、DX、SI、DI、SP、BP等。8位的是AL、AH、 BL、 BH、CL、CH、DL、DH。 例如: MOV CX,AX 如果原来(CX)=00FFH,(AX)=3456H,指令执行后(CX)=3456H,AX
13、内容不变。 3) 直接寻址方式 操作数的有效地址EA在指令中给出,存放在代码段中的指令操作码之后,但操作数一般放在数据段中,因此必须先求出操作数的物理地址,再访问存储器才能取得操作数。 物理地址16d(DS) + EA;d表示十进制数 若在其他段,必须给出段跨越前缀。 例如: MOV BX,1000H 如果(DS)= 3000H,物理地址(31000H)=11H,(31001H)=22H,则指令执行后(BX)= 2211H。 直接寻址方式中如果有效地址EA用偏移地址的数值给出,则必须用方括号括住,如1000H;如果有效地址EA用符号地址给出,可以加方括号也可以不加方括号,如MOV CX,TAB
14、LE,或 MOV AX,TABLE,TABLE是符号地址,有关符号地址的内容详见3.5.1。 8086规定直接寻址方式中,双操作数指令不能两个操作数都在内存单元,必须有一个操作数使用寄存器。如指令MOV 2000H,CX是合法的,目的操作数是直接寻址方式;指令MOV 1000H,2000H是非法的,两个操作数都在内存单元。 指令MOV BX,ES:1000H是段跨越前缀的形式,物理地址16d(ES)+1000H。 4) 寄存器间按寻址方式 操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数在内存中。若EA在BX、SI或DI,则操作数在数据段中,用DS的内容作段地址。 操作
15、数物理地址16d(DS)+ (BX)或(SI)或(DI) 若EA在BP中,则操作数在堆栈段中,用SS的内容作段地址。 操作数物理地址16d(SS)+(BP)。 例如: MOV CX,SI 如果(DS) = 1000H,(SI) = 2000H, 则物理地址PA = 10000H+2000=12000H,(12000H) =33H,(12001H)=44H, 指令执行后CX内容为4433H。 如下的指令都是合法的: MOV AL,ES:BX ;PA=16d(ES)+(BX),段跨越前缀,使用ES MOV DI,CX ;目的操作数是寄存器间接寻址方式 MOV BX,BP ;PA=16d(SS)+(
16、BP),使用SS 5) 寄存器相对寻址方式 操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中指定的8位或16位位移量之和。 BX、 SI、 DI一般用DS作段寄存器,BP用SS作段寄存器。 可使用段跨越前缀。 物理地址16d(DS)+(BX)或(SI)或(DI)+8 (或16) 位位移量; 当使用BP时,物理地址16d(SS)+(BP)+8(或16)位位移量。 例如: COUNT EQU 4000H;定义COUNT等于4000H MOV BX,COUNTDI 也可以写作 MOV BX,COUNT+DI,其中COUNT为16位位移量。 如果(DS) = 40
17、00H,(DI) = 3000H,COUNT =4000H,(47000H)=56H,(47001H)=78H, 则PA=40000H+3000H+4000H=47000H, 指令执行后BX的内容为7856H。 如下的指令都是合法的: MOV AX,ES:BX+2 ;PA=16d(ES)+(BX)+2,段跨越前缀,使用ES MOV SI+COUNT,CX ;目的操作数是寄存器相对寻址方式 MOV BL,BP+20H ;PA=16d(SS)+(BP)+20H,使用SS 寄存器相对寻址方式经常用于查表,使表格的首址等于COUNT,通过修改基址或者变址寄存器的内容,可以读表格中的数值。 6) 基址变
18、址寻址方式 有效地址EA 是一个基址寄存器和一个变址寄存器的 内容之和,两寄存器均由指令指定,如基址寄存器为BX时,段使 用DS;基址寄存器为BP时,段使用SS。 PA16d(DS)+(BX)+(SI)或(DI); 当使用BP时PA = 16d(SS)+(BP)+(SI)或(DI)。 例如: MOV DX,BXSI 也可以写为 MOV DX, BX+SI 如果(DS) =2000H,(BX) = 0100H,(SI) = 3000H,(23100H)=0A1H,(23101H)=00H,则PA=20000H+EA=20000H+0100H+3000H=23100H,指令执行后DX内容为00A1
19、H。 如下的指令都是合法的: MOV CX,ES:BX+DI ;PA=16d(ES)+(BX)+(DI),段跨越前缀,使用ES MOV SI+BX,AX ;目的操作数是基址变址寻址方式 MOV AL,BP+SI ;PA=16d(SS)+(BP)+(SI),使用SS 此种方式常用于数组或表格处理,数组或表格的首地址可以存放在基址寄存器,变址寄存器存放访问的数组或表格中每个变量的长度值,通过修改变址寄存器的值可以存取不同位置的变量。 7) 相对基址、变址寻址方式 有效地址EA = (基址寄存器) + (变址寄存器) +(8位或16位)位移量。 当基址寄存器为BX时,使用DS段寄存器;当基址寄存器为
20、BP时,使用SS段寄存器。变址寄存器为SI或DI。 例如: MASK EQU 0040H;定义MASK等于0040H MOV AL,MASKBXDI 也可以写为 MOV AL, MASK BX+DI, 或 MOV AL, MASK+BX+DI, MASK为位移量。 若(DS)=1000H, (BX)=0200H, (DI)=3000H, MASK=0040H,物理地址(13240H)=35H, 则PA=16d(DS)+(BX)+(DI)+MASK=13240H, 指令执行后AL的内容为35H。 如下的指令都是合法的: MOV DX,ES:BX+SI+4;PA=16d(ES)+(BX)+(SI)
21、+4,段跨越前缀,使用ES MOV SI+BX+MASK,DL ;目的操作数是相对基址、变址寻址方式 MOV AL,BP+SI+10H;PA=16d(SS)+(BP)+(SI)+10H,使用SS3. 与转移地址有关的寻址方式用于确定转移指令及CALL指令的转向地址。1) 段内直接寻址在同一个代码段内,转向的偏移地址是当前IP寄存器的内容和指令机器码中指定的8(或16)位位移量之和,也就是说,IP的内容加8(或16)位位移量之和再送回IP中。这是一种相对寻址方式。这种寻址方式适用于条件转移及无条件转移指令。条件转移时,位移量为8位。无条件转移时,位移量可以为16位,称为近转移(NEAR);也可以
22、为8位,称为短跳转(SHORT)。例如:JMP NEAR PTR PROGAJMP SHORT QUEST汇编语言程序中只要写出转向的符号地址就可以了,如PROGA、QUEST。如果位移量为16位,则符号地址前加操作符NEAR PTR;如果位移量为8位,则符号地址前加操作符SHORT。机器将汇编语言程序翻译成机器码时,自动翻译成对应的8(或16)位位移量。 如果符号地址前缺省操作符,默认为近转移,例如,JMP PROGA为近转移。 2) 段内间接寻址 (不适用于条件转移指令)在同一个代码段内,转向的偏移地址是一个寄存器或一个存储单元的内容,该寄存器或存储单元的内容可以用数据寻址方式中除立即数以
23、外的任何一种寻址方式取得,所得到的转向的偏移地址用来取代IP的内容。例如:JMP BX ;BX内容送IPJMP WORD PTR BP+TABLE ;PA=16d(SS)+(BP)+TABLE,从该物理地址取一个字送IP指令中WORD PTR表示取一个字长度的内容。偏移地址算方法如下:如果(DS)=1000H,(BX)=1020H,(SI) = 2000H, (13020H)=20H, (13021H)=50H, 指令JMP WORD PTRBXSI执行后,(IP) = (16d(DS) + (BX)+(SI)= (10000H+1020H+2000H)= (13020H) =5020H。而指
24、令JMP BX执行后,(IP)=1020H。3) 段间直接寻址 (不适用于条件转移指令)指令中提供了转向的段地址和偏移地址,所以只要用指令中指定的偏移地址送IP,指令中指定的段地址送CS就可以了。例如:JMP FAR PTR QUEST指令中FAR PTR是段间转移的操作符,QUEST是转向的符号地址。4) 段间间接寻址 (不适用于条件转移指令)用存储器的两个相邻字的内容来取代IP和CS寄存器中的原内容。存储单元的地址由指令指定的除立即数方式和寄存器方式以外的任何数据寻址方式取得。例如:JMP DWORD PTR INTERS+BX将物理地址为16d(DS) +INTERS+(BX)字单元的内
25、容送IP;将物理地址为16d(DS) +INTERS+(BX)+2字单元的内容送CS。DWORD PTR为双字操作符,说明转向地址取双字,为段间转移。3.1.2 80386及后续微处理器与数据有关的寻址方式80386及后续微处理器80486和Pentium寻址方式基本相同,为简单起见,以下称为80386寻址方式。80386微处理器支持2种主要的工作模式:实地址模式、保护模式。实地址模式相当于高性能的8086微处理器,但进行了功能扩充,能够使用8086所没有的寻址方式和32位通用寄存器,不具有保护功能,不能使用部分特权指令。 实地址模式下存储空间只能使用1MB。保护模式充分发挥了80386的存储
26、管理功能和硬件支持的保护机制,为多任务操作系统提供了支持。保护模式下每个任务的物理存储空间为4GB。虚拟8086模式是保护模式的一种子模式,可以在保护模式的多任务环境中以类似实地址模式的方式运行16位的8086程序。实地址模式下可以访问的寄存器包括:段寄存器、指令指针寄存器、标志寄存器、通用寄存器、控制寄存器CR0。实地址模式下,80386的1MB内存空间被分成段,每段有64KB的连续存储区,与8086段的使用方法相同。实地址模式下最多可以同时使用6个段,一个代码段、一个堆栈段、4个数据段。内存中哪些段处于活动状态由6个段寄存器确定,每个段寄存器保存16位段基址。 80386比8086微处理器
27、增加的两个段寄存器是FS(数据段F)和GS(数据段G),FS和GS通过段跨越前缀方式使用。80386偏移地址和段寄存器之间配合使用默认的组合见表3.1和3.2(p66)。在进行算术运算和逻辑运算时,任何一个通用数据寄存器都可以作为源操作数或目的操作数寄存器。它们可以存放32位双字数据,或者低16位存放字数据,也可以用低16位的两个8位存放字节数据。由于实地址模式下存放地址值的长度只能是16位,因此BX可以作为基址指针使用,而EBX不可以作为基址指针使用。指针与变址寄存器用于存放偏移量地址,偏移量地址表示某一存储单元相对于段寄存器所指定的基址的位移量。实地址模式下存放偏移量地址值的长度只能是16
28、位,因此指针与变址寄存器只能使用SP、BP、SI、DI。32位寄存器ESP、EBP、ESI、EDI可以作为通用数据寄存器使用。寄存器SP和BP为指针寄存器,用于访问堆栈段中的数据。实地址模式下80386微处理器20条地址线有效,因此实地址模式下内存空间为1MB,地址从00000FFFFFH编码。在内存中存放字节、字的方法同8086,若存放的信息是双字,则将双字的低位字存放在低地址,高位字存放在高地址。如果双字数据存放在能被4整除的地址单元,使用的存储时间比较短,称为对准的双字。堆栈使用方法同8086。80386微处理器的I/O地址空间同8086。80386微处理器与数据有关的寻址方式介绍如下。
29、1. 立即寻址方式操作数包含在指令中,作为指令的一部分,存放在代码段中。操作数(又称立即数)存放形式为:数据高位存放在大地址存储单元,数据低位存放在小地址存储单元。例如:MOV AX,1234HMOV EAX,87654321H2. 寄存器寻址方式操作数存放在寄存器中,寄存器可以是8位、16位或32位的通用寄存器。例如:MOV AX,BX ; 将BX中的内容复制到AX中MOV EDX,ECX; 将ECX中的内容复制到EDX3. 存储器寻址方式1) 16位指令模式下的存储器寻址方式16位指令模式寻址结构由4部分组成:段基址10H + 基址 + 变址 + 位移量 基址寄存器BX和BP存放基址地址,
30、变址寄存器SI和DI存放变址地址,位移量为8位或16位补码表示的带符号数。操作数的有效地址为16位,段内寻址范围为64KB,物理地址为20位,使用存储器的第一个1MB空间。(1) 直接寻址。操作数在存储器中,指令中直接包含操作数的有效地址。例如:MOV AX,2000H(2) 寄存器间接寻址。操作数在存储器中,地址寄存器BX、BP、SI、DI存放操作数的有效地址。例如:MOV BX,SI其中源操作数在数据段DS中,操作数的有效地址在SI中。(3) 寄存器相对寻址。操作数的有效地址为基址或变址值加上位移量。例如:MOV AX,BX+TABLE (4) 基址变址寻址。操作数在存储器中,操作数的有效
31、地址为基址和变址之和 。基址寄存器为BX时,默认段寄存器为DS;基址寄存器为BP时,默认段寄存器为SS。也可以使用段跨越前缀,指定段寄存器。例如:MOV AX,ES:BX+SI或MOV AX,DS:BP+DI (5)相对基址变址寻址。操作数在存储器中,操作数的有效地址为基址、变址和位移量之和。例如:MOV AX,BX+SI+1122H或MOV AX,1122HBX+SI 2) 32位指令模式下的存储器寻址方式 32位指令模式的设置,见第2章图2.20中的D/B 位对应的描述。 在保护模式下,当段描述符号中的D位为“0”时 设定为16位指令模式;D位为“1”时设定为32位 指令模式。32位指令模
32、式寻址结构由5部分组成: 段址 + 基址 + 变址 比例因子 + 偏移量 其中基址寄存器或变址寄存器可以是除ESP以外 的任何32位通用寄存器。 当基址寄存器为EAX、EBX、ECX、EDX、ESI、EDI时,默认段寄存器DS存放段选择符。当基址寄存器为EBP时,默认段寄存器SS存放段选择符。 如果使用段跨越前缀,段址可由CS、DS、ES、SS、FS、GS中指定的段描述符确定。 比例因子为1、2、4、8。 偏移量为0位 、8位、32 位。当偏移量为32位时,段内可寻址范围为2GB地址空间,如图3.1(p68)所示。 (1) 直接寻址:指令中包含操作数的32位有效地址为:EA = 32位有效地址
33、。 例如: INC WORD PTR300H;字的有效地址为300H (2) 寄存器间接寻址: 例如: MOV EAX,EBX;EAX给出有效地址 (3) 相对基址、相对变址寻址: 例如: MOV EBX,ECX+20H ;ECX内容加20H形成有效地址 (4) 相对比例变址寻址: 例如: IMUL EAX,EDI*2,7;EDI的内容乘以2再加7,形成有效地址 (5) 相对比例基址变址寻址: 例如: MOV EAX,EBXECX*4+30H ;有效地址由EBX内容加上ECX内容乘以4再加30H的值。 另外还有以下寻址方式: 基址变址寻址方式,如MOV EAX,ESIEBX; 比例基址变址寻址
34、方式, 如MOV ECX,EDI*8EAX; 基址加相对变址寻址方式, 如SUB EDX,EBXESI+200H; 比例基址加相对变址寻址方式, 如MOV EBX,ESI*8EBP+20H。3.1.3 80386及后续微处理器与转移地址有关的寻址方式 表示指令转移地址所在的方式称为与转移地址有关的寻址方式。用于转移类指令、过程调用类指令的与转移地址有关的寻址方式有3种: 直接寻址 寄存器寻址 存储器寻址1. 直接寻址 指令中直接给出转移地址,通常给出的是符号地址标号,例如指令: JMP START 中的标号START即转移地址的符号表示。2. 寄存器寻址 指令中给出寄存器名,该寄存器的内容即转
35、移的目的地址,仅用于段内转移。 例如:指令JMP BX执行时(BX)IP,由于是段内转移,CS值不变。 作为目标地址的寄存器可以是16位寄存器的AX、 BX、CX、DX、SP、BP、SI、DI; 扩展寄存器也可以用作转移指令的转移地址,如指令JMP EAX,转移到当前代码段中某一指令处,该指令所在存储单元的偏移地址为EAX的内容。3. 存储器寻址 转移地址的存储器寻址方法与3.1.2中数据寻址方法相同。3.1.4 保护模式下的寻址方式1. 80386的三种工作模式1) 实地址模式系统启动后,80386自动进入实地址模式。在此模式下,采用类似于8086的体系结构,其特点如下:(1) 寻址方式、存
36、储器管理、中断处理与8086一样。(2) 操作数默认长度为16位,但允许访问32位寄存器(在指令前加前缀)。(3) 不用虚拟地址,最大地址范围仍限于1MB,只采用分段方式,每段大小固定为64KB。(4) 存储器中保留两个固定的区域,一个是初始化程序区FFFF0HFFFFFH,另一个为中断向量表00000H003FFH。(5) 80386的特权级在实地址模式下,程序在最高级0级上执行,80386指令集除少数指令外,绝大多数指令在实地址模式下都有效。2) 保护模式保护模式是80386最常用的模式,系统启动后先进入实地址模式,完成系统初始化后立即转到保护模式。这种模式提供了多任务环境下的各种复杂功能
37、以及对复杂存储器组织的管理机制。只有在保护模式下,80386才能发挥其强大的功能。在保护模式下,80386具有如下特点:(1) 存储器采用虚拟地址空间、线性地址空间和物理地址空间三种方式来描述。在保护模式下,80386寻址机构不同于8086,与80286类似,通过描述符表的数据结构来实现对内存单元的访问。(2) 强大的寻址空间。在保护模式下,80386可以寻址的空间达到64TB。这个空间就是所谓的虚拟地址空间。(3) 80386的保护功能,可实现程序与程序、用户与用户、用户与操作系统之间的隔离和保护,为多任务操作系统提供了优化和支持。(4) 在保护模式下,80386既可以进行16位数据的运算,
38、又可以进行32位数据的运算。无论是16位,还是32位的运算,只要在保护模式下,就能使用其分页单元支持虚拟存储。3) 虚拟8086模式所谓虚拟8086模式是指一个多任务的环境,模拟多个8086的工作方式。在这个模式下,80386被模拟成多个8086CPU并行工作,有时称为V86模式。虚拟8086模式允许80386将内存平分成若干部分,每一个部分由操作系统分配给不同的应用程序,而应用程序、数据以及内存管理程序等部分则存放在所分配的内存中。因此操作系统可根据时间上的平均分配或优先权,分配每个应用程序的执行时间。虚拟8086模式的主要特点如下:(1) 可执行原来为8086编写的应用程序。(2) 段寄存
39、器的用法与实地址模式一样,即段寄存器内容乘以16后加上有效地址可以得到20位的线性地址。(3) 可以使用分页方式,将1MB分为256个页面,分页内存是将内存以4KB为单位进行划分,每一个4KB称为一“页”,因此比段寻址方式划分要细,从而可处理较小的应用程序与数据段。尽管在V86模式下得到的线性地址是20位,即1MB的空间,但由于线性地址可以通过页表映射到任何32位物理地址空间,所以应用程序可在80386现有实际内存的任何地方执行。如果没有分页内存管理能力,则小片段的程序或数据在段寻址模式下,仍需要占有64KB的空间,且数据读写缓慢。(4) 在虚拟8086模式中,应用程序在最低特权级3级上运行,
40、因此80386指令系统中的特权指令不能使用。2. 保护模式下的存储器寻址方式 在保护模式下,80386对存储器的组织管理采用两级管理的策略,即所谓的分段管理和分页管理,分别由80386中的分段部件SU和分页部件PU完成。分段部件功能是完成逻辑地址到线性地址的转换,分页部件的功能是完成线性地址到物理地址的转换。 由于80386有32条地址线,因此可直接寻址232=4GB的物理地址空间,80386仍然采用分段方式,每一个段地址最大空间为4GB。由于段选择符参与选择描述符的有13位,且对应两个描述符表(GDT和LDT),因此80386的虚拟地址空间为213 2232=246=64TB。 80386物
41、理地址的形成分成两步计算,即先将逻辑地址变换成线性地址,再将线性地址转换为物理地址。3.2 8086微处理器指令系统3.2.1 数据传送指令1. 通用数据传送指令 1) 最基本的传送指令MOV 格式:MOV DST,SRC 功能:MOV指令执行字节或字的传送操作,将 一个源操作数(字节或字)传送到目的操作数单 元中。MOV指令中可能出现的操作见表3.3(p76)。在表3.3中,操作数字段指明了哪些是可以作为源操作数,哪些可作为目的操作数。另外,在使用这些指令时,应注意以下几点:(1) CS和IP两个寄存器不能作为目的操作数,也就是CS、IP不能用MOV指令来修改。(2) 当采用BX、DI、SI
42、来间接寻址时,默认的段寄存器为DS;当用BP来寻址时默认的段寄存器为SS。(3) 8086规定,凡是遇到给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等到本条指令和下条指令被执行后,才恢复对SS和SP寄存器赋值前的中断开放情况。 这样做是为了允许程序连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程中出现中断。 故应用时应注意在修改SS和SP指令之间不要插入其他指令。(4) 所有MOV指令都不影响标志位。(5) 不能用上述指令来实现存储单元之间、立即数至段寄存器及段寄存器之间的传送。2) 堆栈操作指令中断处理及过程调用要用到堆栈指令,这两种情况要分别将断点地址及返回地
43、址保存到堆栈。在进入中断处理及过程调用后,还要保留寄存器的值; 当从中断返回及从过程调用返回时,要恢复寄存器的值, 这些操作都要用堆栈指令来实现。格式:PUSH SRC POP DST功能:压入堆栈指令PUSH是将16位的源操作数压入堆栈;弹出堆栈指令POP是从栈顶单元弹出16位的源操作数到目的地址。8086的堆栈操作是按字操作的。 每执行一条PUSH指令,先将堆栈指针SP自动减2,然后将16位(字)操作数压入栈顶单元。其中低8位数据保存在低字节地址单元,高8位数据保存在高字节地址单元。 执行POP指令时,操作正好相反,先弹出一个字数据至目的地址,然后SP自动加2。 若子程序开始有如下保护现场
44、指令:PUSH AX PUSH DS则子程序返回前,根据“后进先出”原则应按如下顺序恢复现场:POP DSPOP AX如下指令表明压栈的源操作数可以在寄存器或内存单元,出栈的目的操作数可以在寄存器或内存单元。PUSH BX+DI ;PUSH MEM,源操作数在内存单元PUSH AX ;PUSH REG,源操作数在寄存器PUSH DS ;PUSH SEG,源操作数在段寄存器POP SI ;POP MEM,目的操作数在内存单元POP AX ;POP REG,目的操作数在寄存器POP ES ;POP SEG,目的操作数在段寄存器3) 交换指令格式:XCHG DST,SRC功能:交换指令XCHG用来将
45、源操作数与目的操作数相互交换。指令执行后,目的地址存源操作数,而源地址存目的操作数。源操作数和目的操作数都不能为立即数,也不允许两个操作数都是存储单元操作数。交换指令的操作数可以是8位也可以是16位。 例如:XCHG BX,BP+SIXCHG REG,MEMXCHG DX,AX2. 累加器专用传送指令1) 输入/输出指令功能: 输入指令IN是将数据(字节/字)从一个输入端口传送到累加器(AL/AX)中。 输出OUT指令是将数据从累加器(AL/AX)传送到一个输出端口中。 输入/输出指令可以分为两大类: 一类是直接端口寻址的输入/输出指令;另一类是通过DX寄存器间接寻址的输入/输出指令。在直接寻
46、址的指令中只能寻址0255个端口,而间接寻址的指令中可寻址整个64K个字节端口。 (1) 直接寻址的输入/输出指令格式:IN AL,PORT 或 IN AX,PORTOUT PORT,AL 或 OUT PORT,AX例如:IN AX,40H 或 IN AL,40HOUT 40,AX 或 OUT 40H,AL(2) 间接寻址的输入/输出指令格式:IN AL,DX 或 IN AX,DX OUT DX,AL 或 OUT DX,AX2) 字节转换指令格式:XLAT功能:用来将一种字节代码转换成另一种字节代码。它将BX的内容(代码表格首地址)和AL的内容(表格偏移量)相加作为有效地址,并从中取出此地址单
47、元中的内容送到AL中。XLAT指令可用来将一个代码值转换成相应的另一种代码值。应用时,首先应列出两种代码的表格。3. 地址传送指令1) 取有效地址指令格式:LEA REG,SRC功能:将源操作数中的16位偏移地址送到一个16位的通用寄存器中。该指令常用来使一个寄存器作为地址指针。例如:LEA AX,DI+10若(DI)=0500H,该指令执行后,AX的内容(AX)=050AH。2) 地址指针装入寄存器和DS指令 格式:LDS REG,SRC功能:把源操作数有效地址指出的双字长的内存单元中的高字内容送入DS,低字内容送入指令所指定的寄存器中。例如,指令执行前DS内容为1000H,内存12130H
48、单元内容为A0H,12131H单元内容为B0H,12132H单元内容为10H,12133H单元内容为20H:LDS DI,2130H;执行此指令后,将12130H和12131H中的内容(偏移量)送到DI中,DI=0B0A0H,而将12132H和12133H中的内容送到DS中,DS=2010H。3) 地址指针装入寄存器和ES指令 格式:LES REG,SRC功能:把源操作数有效地址指出的双字长的内存单元中高字内容(一般为16位段地址)送入ES,低字内容(一般为偏移地址)送入指令所指定的寄存器中。LES与LDS的指令格式及使用方法是相似的。例如:LES DI,2130H执行此指令后,将DS段偏移地
49、址2130H和2131H中的内容(偏移量)送到DI中,而将DS段偏移地址2132H和2133H中内容(段值)送到ES中。地址传送指令执行结果不影响标志位。4. 标志传送指令CPU中有一个标志寄存器FLAG,其中的9位标志着CPU运行的某种状态,许多指令的执行结果会影响标志寄存器的某些标志位。同时,有些指令也受标志寄存器中某些位的控制。标志传送指令共有4条,这些指令都是单字节指令,指令的操作数以隐含方式规定,是无操作数指令。1) 标志装入AH指令格式:LAHF功能:将标志寄存器中的低字节传送到AH中。2) 设置标志指令格式:SAHF功能:将AH寄存器的内容传送至标志寄存器FLAG中的低8位,而F
50、LAG寄存器中其他位不受影响,此指令刚好与LAHF指令功能相反。3) 标志压入堆栈(PUSHF)和标志弹出堆栈(POPF)指令格式:PUSHF POPF功能:PUSHF指令首先将SP值减2,然后将标志寄存器的内容(16位)压入堆栈顶部。执行后不影响原标志值。POPF指令的功能正好相反,其功能是从堆栈中弹出一个字送到标志寄存器中,堆栈指针SP的值自动加2。3.2.2 算术运算指令1. 加法指令格式:ADD DST,SRCADC DST,SRC功能: ADD是将SRC与DST相加,结果传送到DST。ADC是将SRC与DST以及CF值相加,结果传送到DST。其中SRC可以是通用寄存器、存储器操作数或
51、立即数。DST可以是通用寄存器或存储器操作数。ADD,ADC指令影响的标志位有OF、SF、ZF、AF、PF、CF,例如:MOV AX,9876HADD AH,AL;AX=0E76H CF=1 SF=0 OF=0;ZF=0 AF=0 PF=0ADC AH,AL;AX=8576H CF=0 SF=1 OF=1 ;ZF=0 AF=1 PF=02. 减法指令 格式:SUB DST,SRCSBB DST,SRC功能: SUB将目的操作数减源操作数的结果送DST。SBB将DST-SRC-CF(进位/借位)的值送DST。其中,SRC可以是通用寄存器、存储器操作数或立即数。DST可以是以寄存器或存储器操作数。
52、SUB,SBB指令影响的标志位有OF、SF、ZF、AF、PF、CF。例如:MOV AX,9966H;AX=9966HSUB AL,80H;AL=E6H CF=1 SF=1 OF=1;ZF=0 AF=0 PF=0SBB AH,80H;AH=18H CF=0 SF=0 OF=0 ;ZF=0 AF=0 PF=13. 加1、减1指令格式:INC DSTDEC DST功能:INC指令将目的操作数加1,结果送DST。DEC指令将目的操作数减1,结果送DST。其中DST为通用寄存器或存储器操作数。INC、DEC影响的标志位有OF、SF、ZF、AF、PF,CF不受影响。例如:INC BL ;BL(BL)+1I
53、NC AX ;AX(AX)+1DEC BYTE PTRSI ;存储器字节操作数减1DEC CX ;CX(CX)-14. 比较指令格式:CMP DST,SRC功能:DST-SRC,结果不回送。SRC为寄存器、存储器操作数或立即数。DST为寄存器、存储器操作数。CMP指令影响的标志位有OF、SF、ZF、AF、PF、CF。例如:CMP CX,3CMP WORD PTRSI,AXCMP AX,BLOCK执行比较指令后,两个操作数的比较如果出现小于、等于、大于3种比较简单的情况,对标志位的影响见表3.5,其他情况见表3.6。 5. 求补指令格式:NEG DST功能:对目的操作数求补,方法是用零减去目的操
54、作数,结果送目的操作数单元。其中目的操作数为通用寄存器、存储器操作数。NEG指令影响的标志位有OF、SF、ZF、AF、PF、CF。例如:(AL)=00010011B,则执行指令 NEG AL 的结果是(AL)=11101101B。6. 乘法指令格式:MUL SRCIMUL SRC功能:MUL为无符号数乘法指令,IMUL为带符号数乘法指令。其中SRC为通用寄存器或存储器操作数。目的操作数缺省存放在AL或AX中,乘积存放在AX(字节乘)或在DX、AX中(字乘)。字节乘:AL*SRCAX字乘:AX*SRCDX:AX例如:MUL BL ;字节乘MUL WORD PTRSI ;字乘IMUL BYTE P
55、RTDI ;字节乘如果使用IMUL指令,积采用补码形式表示。7. 除法指令和符号扩展指令格式:DIV SRC IDIV SRC CBW CWD功能:DIV为无符号数除法,IDIV为带符号数除法。其中SRC为除数,为通用寄存器或存储器操作数。被除数缺省在目的操作数AX、DX及AX中。 字节除法:AX/SRC 商AL,余数AH 字除法:DX:AX/SRC 商AX,余数DX字节扩展为字:CBW指令将AL中带符号数的符号位扩展到AH中字扩展为双字:CWD指令将AX中带符号数的符号位扩展到DX中由于被除数必须是除数的双倍字长,带符号数除法可以先使用符号扩展指令进行符号扩展。当进行无符号数除法时,被除数高
56、位按0扩展为双倍除数长度。当进行带符号数除法时,被除数以补码表示。可使用扩展指令CBW、CWD进行符号扩展。例如:MOV AX,8000HCWD ;被除数符号扩展,DX为0FFFFH,AX为8000HMOV BX,1000HIDIV BX对于带符号数除法,其商和余数均采用补码形式表示,余数与被除数同符号。当除数为零或商超过了规定数据类型所能表示的范围时,将会出现溢出现象,产生一个中断类型码为0的中断。8. BCD算术运算调整指令十进制数可以采用BCD码表示,以压缩格式存放,即一个字节存储2位BCD码。BCD码加减法是在二进制数加减运算的基础上,对其二进制结果进行调整,将结果调整成BCD码格式。
57、1) DAA格式:DAA功能:将存放在AL中的二进制和数,调整为压缩格式的BCD码。 调整方法:若AL中的低4位9或标志AF=1, 则AL+6AL,1AF。若AL中高4位9或标志CF=1,则AL+60HAL,1CF。 DAA指令一般紧跟在ADD或ADC指令之后,影响的标志位有SF、ZF、AF、PF、CF,OF无定义。 例如: ADD AL,BL ;AL、BL中是压缩BCD码, ;ADD指令按二进制数进行加法操作 DAA ;DAA指令将AL中的二进制数, ;调整为压缩BCD码格式 2) DAS 格式:DAS 功能:将存放在AL中的二进制差数,调整为压缩的BCD码。 调整方法:若AL中低4位9或标
58、志AF=1,则AL-6AL,1AF。若AL中高4位9或标志CF=1,则AL-60HAL,1CF 例如: SUB AL,BL ;AL、BL中是压缩BCD码, ;SUB指令按二进制数进行减法操作 DAS ;DAS指令将AL中的二进制数, ;调整为压缩BCD码格式9. ASCII算术运算调整指令数字字符09的ASCII码为30H39H,采用一字节存放1个ASCII码,对于ASCII码的算术运算是在二进制数运算基础上进行调整。有加、减、乘、除四种调整指令。1) AAA格式:AAA功能:将存放在AL中的二进制和数,调整为非压缩的BCD码(一个字节存放一位BCD码)。调整方法:若AL中低4位小于或等于9,
59、且AF=0,则将AL中高4位清0,AFCF。若AL中低4位大于9或AF=1,则AL+6 AL,AH+1 AH,1AF,AFCF,AL中高4位清0。AAA指令是跟在ADD或ADC指令之后使用,影响的标志位有AF、CF,其他标志位无定义。例如:MOV AX,0036H ;AH内容为0,AL内容为字符6的ASCII码ADD AL,35H ;AL加字符5的ASCII码AAA ;AX=0101H11,结果为BCD码112) AAS格式:AAS 功能:将存放在AL中的二进制差数,调整为非压缩的BCD码。调整方法:若AL中低四位小于或等于9,且AF=0,则AL高4位清0,AFCF。若AL中低4位大于9或AF
60、=1,则AL-6AL。AH-1AH,1AF,AFCF,AL中高4位清0。AAS一般跟在SUB、SBB指令之后使用,影响的标志位有AF、CF,其他标志位无定义。例如:MOV AX,0132HSUB AL,35HAAS ;AX=0007H3) AAM格式:AAM功能:将存放在AL中的二进制积数,调整为非压缩的BCD码。调整方法:AL/10 商AH,余数AL。AAM指令一般跟在MUL指令之后使用,影响的标志位有SF、ZF、PF,其他标志位无定义。例如:MOV AL,07HMOV BL,09HMUL BL ;AX=003FHAAM ;AX=0603H4) AAD格式:AAD功能:将AX中两位非压缩的B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青海省安全员《A证》考试题库及答案
- 《养心止痛汤加减治疗不稳定型心绞痛(心气不足证)的回顾性分析》
- 消防安装施工安全技术交底范文
- 矿业搪瓷釜吊装施工方案
- 吉林工程职业学院《管理学原理》2023-2024学年第一学期期末试卷
- 商业展厅视觉营销施工方案
- 吉林电子信息职业技术学院《弱信号检测》2023-2024学年第一学期期末试卷
- 吉林大学《环境工程制图与含实训专业理论教学》2023-2024学年第一学期期末试卷
- 海堤防渗墙施工方案
- 隧道施工安全文明施工方案
- 中药分析概论
- 地质灾害危险性评估报告
- 2023年英语竞赛人教新版小学六年级英语竞赛试题
- 2022-2023学年广东省广州市黄埔区八区联考高一年级上册学期期末数学试题【含答案】
- 义务教育语文课程标准(2022)测试题带答案(20套)
- GB/T 23794-2023企业信用评价指标
- 电缆桥架施工方案
- 吊车吊装专项施工方案
- 小学生大队委竞选笔试题库
- 烤烟种植心得体会
- YY/T 0471.6-2004接触性创面敷料试验方法 第6部分:气味控制
评论
0/150
提交评论