《暨南大学行政管理专业研究生社会研究方法讲座之一社会研究方法导论》由会员分享,可在线阅读,更多相关《暨南大学行政管理专业研究生社会研究方法讲座之一社会研究方法导论(25页珍藏版)》请在金锄头文库上搜索。
1、计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计(第(第2版)版)徐徐 洁洁 俸远桢俸远桢 主编主编第第 4 章章(3)14.3 80x86 CPU的指令系统的指令系统 80x86 CPU的指令集是在的指令集是在8086/8088 CPU的指令系统上发展的指令系统上发展起来的。起来的。8086/8088 指令系统是基本指令集,指令系统是基本指令集,80286、80386、80486和和Pentium指令系统是在基本指令集上进行了扩充。扩充指令系统是在基本指令集上进行了扩充。扩充指令的一部分是增强的指令的一部分是增强的8086/8088基本指令和一些专用指令;另基本指令和一些专用
2、指令;另一部分是系统控制指令,即特权指令,它们对一部分是系统控制指令,即特权指令,它们对80286、80386、80486和和Pentium保护模式的多任务、存储器管理和保护机制提保护模式的多任务、存储器管理和保护机制提供了控制能力。供了控制能力。 80x86 CPU采用了变字长的机器指令格式,由采用了变字长的机器指令格式,由115个字节个字节组成一条指令。一般格式如下图所示组成一条指令。一般格式如下图所示: 本节先介绍本节先介绍80x86的寻址方式,然后着重介绍用于运行应用程的寻址方式,然后着重介绍用于运行应用程序的序的80x86指令。指令。 24.3.1 80x86寻址方式寻址方式 指令中
3、的寻址方式是用来确定操作数地址以找到指令所需指令中的寻址方式是用来确定操作数地址以找到指令所需的操作数。的操作数。 在在80x86 CPU中,中,8086和和80286的字长是的字长是16位,一般情况下位,一般情况下只处理只处理8位和位和16位操作数,只是在乘、除指令中才会有位操作数,只是在乘、除指令中才会有32位操位操作数;作数;80386及其后继机型的字长为及其后继机型的字长为32位,因此它除可处理位,因此它除可处理8位位和和16位操作数外,还可处理位操作数外,还可处理32位操作数,在乘、除法情况下可位操作数,在乘、除法情况下可产生产生64位操作数。本节下面所述例子中,如处理的是位操作数。
4、本节下面所述例子中,如处理的是32位操作位操作3数,则适用于数,则适用于80386及其后继机型。及其后继机型。 31立即寻址方式和寄存器寻址方式立即寻址方式和寄存器寻址方式 (1)立即寻址方式()立即寻址方式(Immediate Addressing) 立即数寻址是指指令所需的操作数直接在指令代码中,立即数寻址是指指令所需的操作数直接在指令代码中,随着取指令一起取到随着取指令一起取到CPU中。这种操作数称为立即数。中。这种操作数称为立即数。立立即数可以是即数可以是8位或位或16位的。对于位的。对于80386及其后继机型则可以及其后继机型则可以是是8位或位或32位的。位的。 这种寻址方式如下图所
5、示这种寻址方式如下图所示:4【例例4-1】 下述汇编指令的源操作数都采用立即寻址方式。下述汇编指令的源操作数都采用立即寻址方式。 MOV AL,5 ;将;将8位立即数位立即数05H送入送入AL中中 MOV AX,0B064H MOV BX, AB MOV EAX,12345678H 立即数用来表示常数,它经常用于给寄存器赋初值,并且只立即数用来表示常数,它经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段,且源操作数能用于源操作数字段,不能用于目的操作数字段,且源操作数长度应与目的操作数长度一致。在汇编指令中,立即数若是数长度应与目的操作数长度一致。在汇编指令中,立即数若
6、是数值常数可直接书写,若是字符常数则应加上引号。值常数可直接书写,若是字符常数则应加上引号。 在汇编指令中,立即数若是以在汇编指令中,立即数若是以AF开始的十六进制数,则开始的十六进制数,则必须在数前面加上必须在数前面加上0,如上述第二条指令,否则汇编程序会将立,如上述第二条指令,否则汇编程序会将立即数当作符号处理。即数当作符号处理。5 寄存器寻址是指指令所需的操作数存放在寄存器寻址是指指令所需的操作数存放在CPU的寄存器的寄存器(通用寄存器或段寄存器)中,通过指令中的寄存器地址去找(通用寄存器或段寄存器)中,通过指令中的寄存器地址去找到操作数。到操作数。 (2)寄存器)寄存器寻址方式(址方式
7、(Register Addressing) 在汇编指令中,寄存器地址直接用寄存器名表示,如用在汇编指令中,寄存器地址直接用寄存器名表示,如用AX、BX、AL、BH、EAX、EBX、DS、ES等,这些寄存器可以是等,这些寄存器可以是8位的、位的、16位的或位的或32位的。这种寻址方式如下图所示:位的。这种寻址方式如下图所示:6 【例例4-3】 MOV BL,AL;将将AL中的内容送到中的内容送到BL中中 MOV DS,AX MOV ECX,EDX【例例4-2】 指令指令“MOV AX,BX”的源和目的操作数都采用的源和目的操作数都采用寄存器寻址方式,该指寄存器寻址方式,该指令完成将令完成将BX中
8、的内容送到中的内容送到AX中。如中。如指令执行前(指令执行前(AX) 3064H,(,(BX) 1234H;则指令;则指令执行后,(执行后,(AX) 1234H,(,(BX)保持不变。)保持不变。72 2存储器寻址方式存储器寻址方式 操作数地址(物理地址)是根据操作数地址(物理地址)是根据段基值段基值(或段选择器)和(或段选择器)和偏移地址偏移地址通过一定的方法得到。通过一定的方法得到。段基址段基址在实模式和保护模式下在实模式和保护模式下可从不同的途径取得。偏移地址是指存放操作数的存储单元与可从不同的途径取得。偏移地址是指存放操作数的存储单元与段起始地址(段基址)之间的字节距离。段起始地址(段
9、基址)之间的字节距离。在在80x86里,把按寻里,把按寻址方式计算出来的操作数偏移地址称为有效地址址方式计算出来的操作数偏移地址称为有效地址EA(Effective Address)。)。 在汇编语言程序中,一个存储单元的地址采用逻辑地址来在汇编语言程序中,一个存储单元的地址采用逻辑地址来表示,其形式为表示,其形式为: 段基值(或选段择器):偏移地址段基值(或选段择器):偏移地址8 存储器操作数的寻址方式不同,则形成有效地址存储器操作数的寻址方式不同,则形成有效地址EA的的方法就不同。方法就不同。有效地址有效地址EA可以由可以由4个地址分量的某种组合个地址分量的某种组合求得求得,它们分别是:,
10、它们分别是: 位移量位移量 它是指令代码中的一个它是指令代码中的一个8位、位、16位或位或32位二进位二进制数,但它不是立即数,而是一个地址量。在源程序中,制数,但它不是立即数,而是一个地址量。在源程序中,位移量通常以符号地址(变量名或标号)的形式出现,也位移量通常以符号地址(变量名或标号)的形式出现,也可以是常数,经汇编后,这些符号地址的偏移地址或常数可以是常数,经汇编后,这些符号地址的偏移地址或常数就转换为指令代码中的位移量。就转换为指令代码中的位移量。 基地址基地址 即基址寄存器或基址指针的内容。即基址寄存器或基址指针的内容。 变址量变址量 即变址寄存器的内容。即变址寄存器的内容。 比例
11、因子(比例因子(Scale Factor) 它是它是80386及其后继机型及其后继机型新增加的寻址方式中的一个术语,其值可为新增加的寻址方式中的一个术语,其值可为1,2,4或或8。在含比例因子的寻址方式中,可用变址寄存器的内容乘以在含比例因子的寻址方式中,可用变址寄存器的内容乘以比例因子来取得变址值。比例因子来取得变址值。 9地址分量地址分量16位寻址位寻址32位寻址位寻址位移量位移量0,8,16位位0,8,32位位基址寄存器基址寄存器BX,BP任何任何32位通用寄存器(包括位通用寄存器(包括ESP)变址寄存器变址寄存器SI,DI除除ESP以外的以外的32位通用寄存器位通用寄存器比例因子比例因
12、子无无1,2,4,816/32位寻址时有效地址位寻址时有效地址4种分量的组成种分量的组成 8086/80286只能使用只能使用16位寻址,而位寻址,而80386及其后继机型则既可用及其后继机型则既可用32位寻址,也可用位寻址,也可用16位寻址。在这两种情况下,对以上位寻址。在这两种情况下,对以上4个地址分个地址分量的组成有不同的规定,如下表所示:量的组成有不同的规定,如下表所示:10 对不同的存储器寻址方式,构成其有效地址对不同的存储器寻址方式,构成其有效地址EA的地址分量的地址分量是不同的,但这些寻址方式的有效地址的计算都可以用下式表示:是不同的,但这些寻址方式的有效地址的计算都可以用下式表
13、示:EA= 基地址基地址 +(变址量(变址量 比例因子)比例因子)+位移量位移量下面具体讨论下面具体讨论6种存储器寻址方式。种存储器寻址方式。 (1)直接寻址方式()直接寻址方式(Direct Addressing) 直接寻址是指指令所需的操作数存放在存储单元中,操作数直接寻址是指指令所需的操作数存放在存储单元中,操作数的有效地址的有效地址EA直接由指令代码中的位移量提供,即直接由指令代码中的位移量提供,即EA只包含位移只包含位移量这一种地址分量。量这一种地址分量。此时,位移量的值就是操作数的有效地址,此时,位移量的值就是操作数的有效地址,如下图所示:如下图所示: 上式中的每一个地址分量均可空
14、缺,但比例因子只能与变址寄存上式中的每一个地址分量均可空缺,但比例因子只能与变址寄存器同时使用。器同时使用。11 用数值地址表示用数值地址表示EA 在采用直接寻址方式在采用直接寻址方式的汇编指令中,如用数值的汇编指令中,如用数值表示操作数的有效地址,表示操作数的有效地址,则操作数所在段的段寄存则操作数所在段的段寄存器必须指明,不能省略。器必须指明,不能省略。 例如,传送指令源操例如,传送指令源操作数的有效地址用数值地作数的有效地址用数值地址表示:址表示:MOV BXMOV BX,DSDS: 1000H 1000H 这条指令完成将当前数据段偏移这条指令完成将当前数据段偏移1000H个字节的字单元
15、内容个字节的字单元内容1234H送入送入BX中,如上图所示,其中源操作数的有效地址中,如上图所示,其中源操作数的有效地址EA是是1000H。“MOD R/M”是指令代码中的寻址字段。是指令代码中的寻址字段。12 用符号地址表示用符号地址表示EA 在源程序中,常用符号地址表示存放在源程序中,常用符号地址表示存放操作数的存储单元,因此在汇编指令中,可用符号地址表示操作数的存储单元,因此在汇编指令中,可用符号地址表示的直接寻址方式来存取操作数。的直接寻址方式来存取操作数。 操作数如果存放在数据段中,则指令中不必给出数据段寄存操作数如果存放在数据段中,则指令中不必给出数据段寄存器名(即默认使用器名(即
16、默认使用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 13(2)寄存器
17、间接寻址方式()寄存器间接寻址方式(Register Indirect Addressing) 寄存器间接寻址是指指令所需的操作数在存储单元中,操寄存器间接寻址是指指令所需的操作数在存储单元中,操作数的有效地址作数的有效地址EA直接从基址寄存器或变址寄存器中获得,即直接从基址寄存器或变址寄存器中获得,即EA是包含基址寄存器内容(或变址寄存器内容)的一个地址分是包含基址寄存器内容(或变址寄存器内容)的一个地址分量。量。这种寻址方式如下图所示这种寻址方式如下图所示: 这种寻址方式实际上是将有效地址事先存放在一个寄存器这种寻址方式实际上是将有效地址事先存放在一个寄存器中,因此这个寄存器就如同一个地址
18、指针。中,因此这个寄存器就如同一个地址指针。 14 由于用寄存器作为地址指针,因此在程序中只要修改间址由于用寄存器作为地址指针,因此在程序中只要修改间址寄存器的内容,就可以用同一条指令访问不同的存储单元。这寄存器的内容,就可以用同一条指令访问不同的存储单元。这种寻址方式的使用格式如下:种寻址方式的使用格式如下: 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位寻址时可用的寄存器是位
19、寻址时可用的寄存器是BX、BP、SI和和DI;在;在32位寻址时可用位寻址时可用EAX、EBX、ECX、EDX、ESP、EBP、ESI和和EDI等等8个通用寄存器。凡使用个通用寄存器。凡使用BP、ESP和和EBP时,其默认时,其默认段为段为SS段。其他寄存器的默认段为段。其他寄存器的默认段为DS寄存器。寄存器。 15(3)寄存器相对寻址方式(寄存器相对寻址方式(Register Relative Addressing)(也称变址寻址方式或基址寻址方式)(也称变址寻址方式或基址寻址方式) 指令所需的操作数在存储单元中,操作数的有效地址指令所需的操作数在存储单元中,操作数的有效地址EA是两个地址分
20、量之和:基址寄存器(或变址寄存器)的内容是两个地址分量之和:基址寄存器(或变址寄存器)的内容与指令中指定的位移量之和。与指令中指定的位移量之和。这种寻址方式如下图所示这种寻址方式如下图所示 : 这种寻址方式若使用的是变址寄存器称为变址寻址方式;若使这种寻址方式若使用的是变址寄存器称为变址寻址方式;若使用的是基址寄存器称为基址寻址方式。它所允许使用的寄存器及用的是基址寄存器称为基址寻址方式。它所允许使用的寄存器及与其对应的默认段情况与寄存器间接寻址方式中所说明的相同。与其对应的默认段情况与寄存器间接寻址方式中所说明的相同。 16 在汇编指令中,位移量部分可用数值表示,也可用符号地址在汇编指令中,
21、位移量部分可用数值表示,也可用符号地址表示(此时用符号地址的偏移地址作为位移量),其寻址方式的表示(此时用符号地址的偏移地址作为位移量),其寻址方式的使用格式如下:使用格式如下:MOV AX,10HSI;位移量为位移量为8位常数,位常数,EA=10H+(SI),默认段寄存器),默认段寄存器DSMOV TAB1BP,CL;位移量为符号地址位移量为符号地址TAB1的的16位偏移地址,位偏移地址, 默认段寄存器是默认段寄存器是SS 寄存器相对寻址方式常用来访问顺序存放在主存中的一维数寄存器相对寻址方式常用来访问顺序存放在主存中的一维数组、表、字符串等。其典型用法是将指令中不能修改的位移量作组、表、字
22、符串等。其典型用法是将指令中不能修改的位移量作为基准地址,而将变址或基址寄存器内容作为修改量。例如数组为基准地址,而将变址或基址寄存器内容作为修改量。例如数组的起始单元位置是固定的,因此由指令中的位移量给出;而被访的起始单元位置是固定的,因此由指令中的位移量给出;而被访问的数组元素相对其起始单元的距离由变址或基址寄存器提供,问的数组元素相对其起始单元的距离由变址或基址寄存器提供,通过修改寄存器的内容就可以访问数组中不同的元素。通过修改寄存器的内容就可以访问数组中不同的元素。 17【例例4-4】 如右图所示,一维数组如右图所示,一维数组ARY存存放在主存的数据段中,数组的每个元素放在主存的数据段
23、中,数组的每个元素长度相同且都占长度相同且都占2个字节单元。从数组个字节单元。从数组的首址起依次存放各数组元素的首址起依次存放各数组元素ARY(0)、ARY(1)、ARY(2)、ARY(i)、。传。传送指令:送指令: MOV AX,ARYSI 可用来访问数组中的元素,指令中的符可用来访问数组中的元素,指令中的符号地址号地址ARY指向该数组的首址;变址寄指向该数组的首址;变址寄存器存器SI的内容表示所访问元素与数组首的内容表示所访问元素与数组首址之间的字节距离,则所访问元素的有址之间的字节距离,则所访问元素的有 效地址:效地址: EA= ARY的偏移地址的偏移地址+( SI) 当当SI内容为内容
24、为0时,将访问时,将访问ARY(0)元素;)元素;SI内容为内容为1*2时访问时访问ARY(1)元素;)元素;SI内容为内容为 i*2时访问时访问ARY(i),即通过修),即通过修改改SI的内容可以访问数组中任何一个元的内容可以访问数组中任何一个元素。素。 右图给出了访问数组元素右图给出了访问数组元素ARY(2)的寻址过程。的寻址过程。用寄存器相对寻址方式访问一维数组用寄存器相对寻址方式访问一维数组 18(4)基址变址寻址方式(基址变址寻址方式(Based Indexed Addressing) 指令所需的操作数在主存单元中,操作数的有效地址指令所需的操作数在主存单元中,操作数的有效地址EA是
25、三是三个地址分量之和:基址寄存器内容、变址寄存器内容与指令中的个地址分量之和:基址寄存器内容、变址寄存器内容与指令中的位移量(位移量(0位、位、8位、位、16位或位或32位)之和,称为基址变址寻址方式,位)之和,称为基址变址寻址方式,如下图所示:如下图所示: 19 基址变址寻址方式的位移量可用数值或符号地址表示,其使基址变址寻址方式的位移量可用数值或符号地址表示,其使用格式如下:用格式如下: MOV AX,200HBXSI;位移量为位移量为16位常数,位常数, EA=200H+(BX)+(SI),默认段寄存器为,默认段寄存器为DS MOV AX,ARRAYBPSI;位移量为符号地址位移量为符号
26、地址ARRAY的的16位位 偏移地址,默认段寄存器为偏移地址,默认段寄存器为SS MOV BPDI,DL;位移量为位移量为0,EA=(BP)+(DI),), 默认段寄存器为默认段寄存器为SS 由于基址变址寻址方式中有两个地址分量可以在程序执行过由于基址变址寻址方式中有两个地址分量可以在程序执行过程中进行修改,因此常用来访问存放在主存中的二维数组。程中进行修改,因此常用来访问存放在主存中的二维数组。 20【例例4-8】 如右图所示,如右图所示,ARRAY数组是数组是10行、行、10列的二维数列的二维数组,按行存放在主存堆栈段中。从组,按行存放在主存堆栈段中。从数组的首址数组的首址ARRAY起依次
27、存放各数起依次存放各数组元素:第组元素:第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存放被访问数组元素相对本行首址的存放被访问数组元素相对本行首址
28、的距离,即距离,即j,则要访问元素的有效地,则要访问元素的有效地址:址:EA ARRAY的偏移地址的偏移地址 +( BP)+( SI),段基值隐含由),段基值隐含由SS给出。给出。右上图给出了访问数组第右上图给出了访问数组第1行第行第8列元素列元素ARRAY(1,8)的寻址过程)的寻址过程 。21 (5)比例变址寻址方式(比例变址寻址方式(Scaled Indexed Addressing) 指令所需的操作数在主存单元中,操作数的有效地址指令所需的操作数在主存单元中,操作数的有效地址EA是变是变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和,址寄存器的内容乘以指令中指定的比例因子再加上
29、位移量之和,所以所以EA由由3种成分组成。种成分组成。这种寻址方式如下图所示:这种寻址方式如下图所示: 这种寻址方式与相对寄存器寻址相比,增加了比例因子,其优这种寻址方式与相对寄存器寻址相比,增加了比例因子,其优点在于:对于元素大小为点在于:对于元素大小为2,4,8字节的数组,可以在变址寄存器字节的数组,可以在变址寄存器中给出数组元素下标,而由寻址方式控制直接用比例因子把下标转中给出数组元素下标,而由寻址方式控制直接用比例因子把下标转换为变址值。换为变址值。 22 【例例4-5】 MOV EAX,COUNTESI * 4;如要求把双字数组;如要求把双字数组COUNT中的元素中的元素3送到送到E
30、AX中,用这种寻址方式可直接在中,用这种寻址方式可直接在ESI中中放入放入3,选择比例因子,选择比例因子4(数组元素为(数组元素为4字节长)就可以方便地达字节长)就可以方便地达到目的,如下图所示,而不必像在相对寄存器寻址方式中那样,到目的,如下图所示,而不必像在相对寄存器寻址方式中那样,要把变址值直接装入寄存器中。要把变址值直接装入寄存器中。23 (6)基址比例变址寻址方式(基址比例变址寻址方式(Based Scaled Indexed Addressing) 指令所需的操作数在主存单元中,操作数的有效地址是变址指令所需的操作数在主存单元中,操作数的有效地址是变址寄存器的内容乘以比例因子,加上
31、基址寄存器的内容,再加上位寄存器的内容乘以比例因子,加上基址寄存器的内容,再加上位移量(移量(0位、位、8位或位或32位)之和,所以有效地址位)之和,所以有效地址EA由由4种成分组成。种成分组成。这种寻址方式如下图所示。这种寻址方式如下图所示。 这种寻址方式比基址变址方式增加了比例因子,便于对元素为这种寻址方式比基址变址方式增加了比例因子,便于对元素为2,4,8字节的二维数组进行处理。字节的二维数组进行处理。【例例4-10】 MOV EAX,TABLEEBPEDI*424 3串操作寻址方式(串操作寻址方式(String Addressing) 80x86提供专门的串操作指令,这些指令所用的操作
32、数也在提供专门的串操作指令,这些指令所用的操作数也在存储器中,但它们不能使用上述寻址方式,而是隐含使用变址寄存储器中,但它们不能使用上述寻址方式,而是隐含使用变址寄存器存器SI、ESI、DI或或EDI,如下图所示。串操作指令规定,隐含,如下图所示。串操作指令规定,隐含使用使用SI或或ESI作为在数据段中的源串(即源操作数)的地址指针;作为在数据段中的源串(即源操作数)的地址指针;隐含使用隐含使用DI或或EDI作为在附加段中的目的串的地址指针。在完成作为在附加段中的目的串的地址指针。在完成一次串操作后,指令自动修改一次串操作后,指令自动修改SI或或ESI、DI或或EDI两个地址指针,两个地址指针,使使SI或或ESI、DI或或EDI指向下一个串元素的存储单元。指向下一个串元素的存储单元。 25