1、第3章 寻址方式和指令系统第3章 寻址方式和指令系统3.1 寻址方式寻址方式 3.2 指令系统指令系统第3章 寻址方式和指令系统3.1 3.1 寻寻 址址 方方 式式3.1.1 3.1.1 寻址方式和有效地址概念寻址方式和有效地址概念 操作数地址的表示有3种情况:(1)直接放在指令中。指令的操作数部分就是操作数本身。这种操作数叫做立即数,对应的指令寻址方式称为立即数寻址。(2)放在CPU的某个内部寄存器中。指令的操作数部分是CPU的一个寄存器。这种指令寻址方式称为寄存器寻址。(3)放在某个存储单元中,指令的操作数部分包含着该操作数所在的内存地址。这种指令寻址方式称为存储器寻址。第3章 寻址方式
2、和指令系统 每个存储单元在存储器中所具有的地址称为存储单元的物理地址,段基地址(简称段地址)是指每一段的起始地址,单元与段基地址的距离称为段内偏移地址,也叫偏移量。物理地址是由存储单元所在段的基地址和段内偏移地址这两个部分组成。以MOV指令为例,若有:MOV DSBUFFER,AL这里,DSBUFFER表示内存的某一单元地址,称为逻辑地址。DS对于实地址方式就是段基址,对于保护方式则可通过段管理部件形成段基址。BUFFER为段内偏移地址,段内偏移地址有16位和32位两种。段基址和段内偏移地址相加,形成线性地址,对实地址方式而言,该线性地址就是物理地址。对保护方式而言,线性地址经管理部件再变换成
3、32位物理地址。第3章 寻址方式和指令系统 段内偏移地址可以由基址寄存器内容、变址寄存器内容、比例因子和位移量这4个基本部分组合而成。由4个基本部分组合而成的偏移地址称为有效地址EA(Effective Address),比例因子可取1、2、4、8中的任一个,基址寄存器内容、变址寄存器内容和位移量可为正数也可为负数。有效地址EA的组合及计算方法是:有效地址EA基址(变址比例因子)位移量第3章 寻址方式和指令系统 可用作基址、变址的寄存器和比例因子、位移量的取值规定是:工作于实地址方式下的16位寻址:基址寄存器可以是BX或BP寄存器,变址寄存器可以是SI或DI寄存器,比例因子或者没有或者为1。位
4、移量可以是0、8位或16位。工作于保护方式下的32位寻址:基址寄存器可以是任何32位通用寄存器中的一个,变址寄存器可以是除ESP外的任何32位通用寄存器中的一个,比例因子可以是1、2或4或8,位移量可以是0、8位或32位。第3章 寻址方式和指令系统3.1.2 3.1.2 数据寻址方式数据寻址方式 1 1立即数寻址立即数寻址 直接出现在指令中的操作数称为立即数,它紧跟在操作码的后面,其本身就是代码的一部分,这种寻址方式叫做立即数寻址。立即数可以是8位、16位或32位。例3-1MOV AL,20MOV BX,2568HMOV ECX,25685678H这3条指令中的立即数依次是8位、16位和32位
5、,对应的寄存器也分别是8位的AL、16位的BX和32位的ECX。执行指令MOV BX,2568H的结果是(BX)=2568H,执行过程见图3-1。第3章 寻址方式和指令系统 说明:立即数只能作源操作数,不能作为目的操作数,一般用于给寄存器赋初值;立即数既可以是二进制数、十进制数,也可以是十六进制数;低位字节数存放在存储单元的低地址字节,高位字节数存放在存储单元的高地址字节,如:MOV AX,im中的立即数im,其低8位字节iml存储在低地址字节单元中,高8位字节imh存储在高地址字节单元中,指令的存储与执行过程如图3-2所示。第3章 寻址方式和指令系统图3-1 例3-1立即数寻址示意图第3章
6、寻址方式和指令系统 图3-2 立即数寻址及数据存储示意图第3章 寻址方式和指令系统 2 2寄存器寻址寄存器寻址 寄存器寻址又称寄存器直接寻址。操作数直接存放在寄存器中,由指令指定的寄存器进行寻址,即操作数包含在指令规定的8位、16位或32位寄存器中。如:INC DL MOV DS,AX MOV EBX,ECX三条指令表明操作数分别存于8位DL、16位的AX和32位的ECX中。第3章 寻址方式和指令系统 例例3-23-2 设(CX)=1234H,(AX)=5678H,执行指令MOV CX,AX 其结果是:(CX)=5678H,(AX)不变,仍为5678H,执行过程见图3-3。说明:虽然操作数可使
7、用CPU内部通用寄存器中的任意一个,且它们都能参与算术/逻辑运算和存放运算结果。由于AX和EAX是累加器,若结果是存放在AX或EAX中,通常指令执行的时间要短一些。第3章 寻址方式和指令系统图3-3 例3-2寄存器寻址执行情况第3章 寻址方式和指令系统 3 3直接寻址直接寻址 指令中的操作数部分直接给出的是操作数的有效地址EA的寻址方式称为存储器直接寻址,简称直接寻址。有效地址EA是和操作码一起放在存储器代码段中,它可以是16位或32位整数。但操作数一般在数据段DS中。设要访问的数据存放在DS所指向的数据段中,实地址模式下物理地址的计算方法是:物理地址=10H(DS)+有效地址第3章 寻址方式
8、和指令系统图3-4 例3-3直接寻址执行情况第3章 寻址方式和指令系统 例3-3 设操作数存放在DS所指向的数据段中,(DS)=2000H,(21000H)=34H,(21001H)=12H,(BX)=5678H,执行指令MOV BX,1000H后的结果为:(BX)=1234H,指令中的16位地址偏移量是低位字节在低地址存储单元中,高位字节在高地址存储单元中。执行过程如图3-4所示。例3-4 执行指令MOV AX,BEGIN的结果是:将内存中从BEGIN开始的连续两个单元内容送入AX中。第3章 寻址方式和指令系统 说明:直接寻址方式,是以数据段的地址为基础,可在多达64 KB的范围内寻找操作数
9、。缺省情况下,认为操作数有效地址的作用域是DS所指向的数据段,但允许使用段超越前缀指定为其他段,即对于寻找操作数来说,还允许操作数在以代码段、堆栈段或附加段为基准的区域中,即只要在指令中指明是段超越的,则16位地址偏移量可以与CS、SS、ES、FS或GS相加,作为操作数的地址,如MOV AX,ES2000H。第3章 寻址方式和指令系统 指令中操作数的有效地址既可以是一个数字,也可以是一个符号地址,如例3-4中的BEGIN就是一个符号地址。直接寻址主要用于单个操作数的相对寻址场合,如简单的标量操作数寻址和静态分配的数组的起始地址寻址等。第3章 寻址方式和指令系统 4 4寄存器间接寻址寄存器间接寻
10、址 操作数在存储器中,但操作数地址的偏移量包含在寄存器中,这种寻址方式称为寄存器间接寻址。寄存器间接寻址可以是16位寻址,也可以是32位寻址。若使用BX、SI、DI、BP 4个寄存器中的一个,则为16位寻址;若使用的是EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP中的一个,则为32位寻址。以BX、SI、DI、EAX、EBX、ECX、EDX、ESI、EDI间接寻址时,则默认操作数在DS段中;以BP、EBP、ESP间接寻址时,则默认操作数在SS段中。寄存器的使用规定对16位寻址和32位寻址是不一样的。第3章 寻址方式和指令系统图3-5 寄存器间接寻址示意图第3章 寻址方式和指令系统
11、 (1)16位寻址时,偏移地址放在SI、DI、BP或BX中,段默认有两种情况:若以SI、DI、BX间接寻址,通常操作数在现行数据段区域中,即数据段寄存器DS左移4位后加上SI、DI、BX中的16位偏移量作为操作数的地址。例如,MOV AX,SI,操作数在数据段寄存器DS中,16位偏移量在SI中。设(DS)2000H,(SI)=1000H,21000H单元的内容为34H,21001H单元的内容为12H,执行MOV AX,SI后,AX的内容为1234H。指令的执行过程如图3-5所示。第3章 寻址方式和指令系统 若是以寄存器BP间接寻址,则操作数在堆栈段区域中,即堆栈段寄存器SS左移4位后与BP相加
12、作为操作数的地址。例如,MOV AX,BP,操作数在数据段寄存器SS中,16位偏移量在BP中。设(SS)3000H,(BP)=2000H,32000H单元的内容为34H,32001H单元的内容为12H,执行MOV AX,BP后,AX的内容为1234H。指令的执行过程如图3-6所示。第3章 寻址方式和指令系统图3-6 BP寄存器间接寻址示意图第3章 寻址方式和指令系统 (2)32位寻址时,偏移地址放在以EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP寄存器中,段默认有两种情况:通用寄存器EAX、EBX、ECX、EDX、ESI、EDI默认段寄存器为DS。通用寄存器ESP、EBP默认段
13、寄存器为SS。第3章 寻址方式和指令系统例例3-53-5MOV EBX,EAX;默认DS为段基址,传送双字给EBXMOV DX,EBX;默认DS为段基址,传送字给DXMOV CH,EAX;默认DS为段基址,传送字节给CH第3章 寻址方式和指令系统说明:说明:如果操作数在默认段之外,指令中必须加段超越前缀。如 MOV AX,ESSI;操作数在数据段寄存器ES中,不在默认段DS中 MOV AX,DSBP;操作数在数据段寄存器DS中,不在默认段SS中所以,“ES”和“DS”分别是两指令的段超越前缀。若在指令中规定是段超越的,则BP也可以与其它的段寄存器相加,形成操作数地址,如MOV AX,DSBP,
14、BP不是与SS段寄存器形成操作数地址,而是与DS段寄存器形成操作数地址。寄存器间接寻址的应用场合与直接寻址的应用场合相似。源操作数与目的操作数的位数要匹配。第3章 寻址方式和指令系统 例3-6 设(DS)=2000H,(SI)=1200H,(21200H)=56H,执行指令MOV AH,SI的结果是:(AH)=56H,执行过程见图3-7。图3-7 例3-6寄存器间接寻址执行情况第3章 寻址方式和指令系统 例3-7 设(DS)=2000H,(DI)=2100H,(22100H)=68H,(22101H)=41H,执行指令MOV BX,DI的结果是:(BX)=4168H。第3章 寻址方式和指令系统
15、 5 5基址寻址基址寻址 由指定的基址寄存器内容,加上指令中给定的偏移量(要由一个段寄存器作为地址基准)作为操作数的地址的寻址方式称为基址寻址。在基址寻址方式下,EA基址寄存器+位移量,位移量是常数且紧跟在操作码之后,与操作码一起存放在代码段中。基址寄存器的使用规定对16位寻址和32位寻址是不一样的。第3章 寻址方式和指令系统 (1)16位寻址情况下,SX和BP作为基址寄存器。在缺省段超越前缀时,BX以DS作为默认段寄存器,BP以SS作为默认段寄存器。位移量可为8位或16位。(2)32位寻址情况下,8个32位通用寄存器均可作基址寄存器,其中ESP、EBP以SS为默认段寄存器,其余6个通用寄存器
16、均以DS为默认段寄存器。位移量为8位或32位。基址寻址适于对一维数组的数组元素进行检索操作。位移量表示数组起始地址偏移量,基址表示的是可以变化的数组元素下标。EA的书写形式可以是“基址寄存器+位移量”,也可以是“位移量基址寄存器”。基址寻址的执行过程示例如图3-8所示(以例3-8中的MOV DX,EAX1500为例,默认段基址是DS)。第3章 寻址方式和指令系统图3-8 基址寻址的执行过程示意图第3章 寻址方式和指令系统 例例3-83-8 MOV EAX,BX24;或 MOV EAX,24BX MOV ECX,EBP50;或 MOV ECX,50EBP MOV DX,EAX1500;或 MOV
17、 DX,1500EAX第3章 寻址方式和指令系统 例3-9 设(DS)=2000H,(SI)=1200H,(21206H)=56H,执行指令MOV AH,SI+6的结果是:(AH)=56H,执行过程见图3-9。图3-9 例3-9寄存器相对寻址执行情况第3章 寻址方式和指令系统 6 6变址寻址变址寻址 由指定的变址寄存器内容,加上指令中给定的偏移量(要由一个段寄存器作为地址基准)作为操作数的地址的寻址方式称为变址寻址。在变址寻址方式下,EA变址寄存器+位移量,位移量跟在操作码之后,与操作码一起存放在代码段中。变址寄存器的使用规定对16位寻址和32位寻址是不一样的。(1)16位寻址时,仅SI、DI
18、可作变址寄存器,默认DS作为段基址寄存器。如:MOV AX,COUNTSI第3章 寻址方式和指令系统 (2)32位寻址时,除ESP外的任何通用寄存器均可作变址寄存器,EBP默认SS作段基址寄存器,其余的以DS作段基址寄存器。如:MOV EAX,5EBP MOV ECX,DATAEAX EA的书写形式可以是“变址寄存器+位移量”,也可以是“位移量变址寄存器”,即位移量可以写在 里,也可以写在 外面;也可以是一个数字,或一个符号地址。以MOV AX,COUNTSI为例,默认段基址是DS,变址寻址的执行过程如图3-10所示。第3章 寻址方式和指令系统图3-10 变址寻址示意图第3章 寻址方式和指令系
19、统 变址寻址适用于对一维数组的数组元素进行检索操作。位移量表示数组起始地址偏移量,变址表示的是可以变化的数组元素下标。例例3-103-10 执行指令MOV CX,LISTDI的结果是将内存中从DSDI+LIST处开始的连续两个单元内容送入CX中,其中LIST是用符号表示的位移量,变址寄存器使用的是DI,所以默认段为DS。第3章 寻址方式和指令系统 7 7基址加变址寻址基址加变址寻址 由指令中的基址寄存器内容和变址寄存器内容相加得到操作数的有效地址EA的寻址方式称为基址加变址寻址,即EA基址寄存器变址寄存器如:MOV AX,BXSI;或 MOV AX,BXSI MOV EAX,EDXEBP;或
20、MOV EAX,EDXEBP第3章 寻址方式和指令系统 基址加变址寻址有16位和32位寻址两种情况,每种情况下基址、变址寄存器的使用规定和段寄存器的默认规定与基址寻址、变址寻址相同。但当一种寻址方式中既有基址寄存器又有变址寄存器,而两个寄存器默认的段寄存器又不相同时,一般规定由基址寄存器来决定默认哪一个段寄存器作段基址指针。缺省时操作数所在段由指令中的基址寄存器决定,若使用BP、ESP或EBP,则默认操作数在SS段中;若使用其他基址或变址寄存器,则默认操作数在DS段中。如:MOV AX,BXSI;基址寄存器是BX,默认DS为段基址寄存器MOV EAX,EBPECX;基址寄存器是EBP,默认SS
21、为段基址寄存器基址加变址寻址可用于二维数组操作(如检索数组元素)和二重循环等。第3章 寻址方式和指令系统 例例3-113-11 设(DS)=2000H,(SI)=200H,(BX)=1000H,(21200H)=21H,执行指令MOV AL,SI+BX的结果是:(AL)=21H,执行过程如图3-11所示。图3-11 例3-11基址加变址寻址示意图第3章 寻址方式和指令系统 例例3-123-12 执行MOV BX,EDI+EAX的结果是将内存中DSEDI+EAX处开始的连续两个单元内容送BX中。第3章 寻址方式和指令系统 8 8比例变址寻址比例变址寻址 变址寄存器的内容乘以比例因子再加上位移量得
22、到操作数有效地址EA的寻址方式称为比例变址寻址,即EA变址寄存器比例因子位移量比例变址寻址只有32位寻址一种情况。如:MOV EAX,TABLEESI*4 ;TABLE是位移量,4是比例因子其中,乘比例因子的操作是在CPU内部由硬件完成的。第3章 寻址方式和指令系统 例例3-133-13 指令MOV EAX,50ESI*4的位移量是50,比例因子是4,执行该指令时,默认DS为段基址,执行过程如图3-12所示。图3-12 比例变址寻址过程示意图第3章 寻址方式和指令系统 例3-14 执行指令MOV AX,LIST2*ESI的结果是将内存中从DS:2*ESI+IST处开始的连续两个单元内容送AX中
23、;执行指令MOV CL,ESI+4*EAX的结果是将内存中DS:ESI+4*EAX处的单元内容送CL中;执行指令MOV DX,EBP+4*ECX+9的结果是将内存中从DS:EBP+4*ECX+9处开始的连续两个单元内容送入DX中。第3章 寻址方式和指令系统 9 9基址加比例变址寻址基址加比例变址寻址 由变址寄存器的内容乘以比例因子再加上基址寄存器的内容而得到操作数有效地址EA的寻址方式称为基址加比例变址寻址方式,即EA变址寄存器比例因子基址寄存器基址加比例变址寻址只有32位寻址一种情况。如:MOV ECX,EDX*8EAX ;或MOV ECX,EDX*8+EAX MOV AX,EBX*4ESI
24、 ;或MOV AX,EBX*4ESI 基址加比例变址寻址方式主要用于数组元素大小为2、4、8字节时的二维数组检索操作等场合。第3章 寻址方式和指令系统 例例3-153-15 设(DS)=2000H,(DI)=200H,(AX)=1000H,(21204H)=32H,执行指令MOV AL,DI+AX+4的结果是:(AL)=32H,执行过程见图3-13。图3-13 例3-15基址加比例变址寻址执行过程示意图第3章 寻址方式和指令系统 例例3-163-16 执行指令MOV BX,LISTESI+EAX的结果是将内存中从DS:ESI+EAX+LIST处开始的连续两个单元内容送入BX中。第3章 寻址方式
25、和指令系统 10 10带位移的基址加变址寻址带位移的基址加变址寻址 由变址寄存器、基址寄存器内容和位移量一同相加而得到操作数有效地址的寻址方式称为带位移的基址加变址寻址,即EA变址寄存器基址寄存器位移量 带位移的基址加变址寻址分为16位寻址和32位寻址两种情况。变址、基址寄存器的使用约定和对段寄存器的默认约定与前面所述相同。如:MOV AX,BX+DI+MASK ;或MOV AX,MASK BXDIADD EDX,ESIEBP0FFFF000H;或ADD EDX,0FFFF000HESIEBP以执行指令MOV AX,MASK BXDI为例,默认DS为段基址,图3-14是带位移的基址加变址寻址过
26、程示意图。第3章 寻址方式和指令系统图3-14 带位移的基址加变址寻址过程示意图第3章 寻址方式和指令系统 1111带位移的基址加比例变址寻址带位移的基址加比例变址寻址 由变址寄存器内容乘以比例因子、基址寄存器内容和位移量一同相加而得到操作数有效地址的寻址方式称为带位移的基址加比例变址寻址,即EA变址寄存器比例因子基址寄存器位移量 带位移的基址加比例变址寻址只有32位寻址一种情况,这与比例变址寻址、基址加比例变址寻址方式一样,各种约定和默认情况同前所述。寻址过程中,变址寄存器内容乘比例因子的操作是在CPU内部由硬件完成的,其他操作与图3-14所示相同。第3章 寻址方式和指令系统 例3-17 I
27、NC EDI*8ECX40 ;或INCEDI*8ECX40 当二维数组的数组元素大小为2、4、8字节,且数组起始地址不为0时,适于用带位移的基址加比例变址寻址方式进行数组检索操作。第3章 寻址方式和指令系统3.1.3 3.1.3 程序存储器寻址方式程序存储器寻址方式 1 1段内相对寻址段内相对寻址 在此寻址方式下,转移后的指令与转移指令本身在同一代码段中,指令中的地址是一个相对于当前IP内容的位移量,它是一个带符号数,而转移后指令的有效地址为有效地址=(IP)+位移量 其中位移量是一个字节称为短转移,转移的范围是-128+127,可用SHORT表示;位移量是两个字节称为近转移,转移范围是32
28、KB,可用NEAR表示。第3章 寻址方式和指令系统 例例3-183-18 指令JMP SHORT AIM1是短转移,SHORT表示为短转移,AIM1为目的地址;指令JMP NEAR PTR AIM2是近转移,NEAR表示为近转移,AIM2为目的地址。转移后的目的地址,汇编语言在汇编时,能自动计算目的地址相对于当前IP的内容的位移量,然后替换目的地址。此寻址方式不影响代码段寄存器CS的值,只影响指令指针IP的值。第3章 寻址方式和指令系统 2 2段间直接寻址段间直接寻址 在段间直接寻址方式下,转移后的指令与转移指令本身不在同一代码段中,汇编语言在汇编时,自动将指令中的目的地址的段基址和偏移量替换
29、掉CS和IP原先的内容。段间直接寻址方式也称为远转移,可用FAR表示。例例3-193-19 指令JMP FAR PTR AIM是远转移,FAR表示为远转移,AIM为目的地址。第3章 寻址方式和指令系统 3 3存储器间接寻址存储器间接寻址 在存储器间接寻址下,目的地址不直接出现在指令中,而是存储在一个寄存器或者一个内存单元中,因此,要先使用除立即数寻址以外的任意一种数据寻址方式获取目的地址,然后判断转移到该目的地址是段内转移还是段间转移,根据判断结果按照段内相对寻址和段间直接寻址两种寻址方式的规则替换CS、IP 的内容。例例3-203-20 指令JMP BX中的BX为目的地址,它将替代IP的内容
30、,为段内转移;指令JMP WORD PTR LISTSI+DI是用DS:SI+DI+LIST处开始的连续两个单元内容作目的地址,并用它替代IP的内容,为段内转移;指令JMP EAX中的EAX为目的地址,高16位送CS,低16位送IP,为段间转移。第3章 寻址方式和指令系统3.2 3.2 指指 令令 系系 统统80 x86的指令系统可以分为以下13个功能组。(1)数据传送指令;(2)算术运算指令;(3)逻辑运算与移位指令;(4)串操作指令;(5)位操作指令;(6)控制转移指令;(7)标志操作指令;(8)按条件设置字节指令;(9)操作系统型指令;(10)处理器控制指令;(11)高级语言指令;(12
31、)Cache管理指令;(13)数字处理指令。第3章 寻址方式和指令系统 标志操作指令、栈操作的相关指令已在第2章作过介绍。本节要介绍的指令包括:数据传送指令、算术运算指令、逻辑运算与移位指令、位操作指令、按条件设置字节指令SET、操作系统型指令、处理器控制指令、高级语言指令、Cache管理指令和数字处理指令,串操作指令、控制转移指令和高级语言指令将在第5章中介绍,CALL/RET指令将在第6章中介绍,输入/输出指令将在第10章中介绍。需要说明的是,汇编语言对于指令的大小写是不敏感的。第3章 寻址方式和指令系统3.2.1 3.2.1 数据传送指令数据传送指令 数据传送指令可分为通用传送指令、地址
32、传送指令、输入/输出指令、查表转换指令XLAT和扩展传送指令MOVSX和MOVZX 1 1通用传送指令通用传送指令 这类指令可分为一般传送指令MOV、入出栈指令和交换指令XCHG。入出栈指令包括:压栈/弹栈指令PUSH/POP、全部通用寄存器内容压栈和弹栈指令PUSHA/PUSHAD及POPA/POPAD。第3章 寻址方式和指令系统 1)传送指令MOV 格式:MOV OPRD1,OPRD2 功能:将OPRD2的内容传送到OPRD1中,并替换OPRD1中原来的内容。说明:MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。源操作数可以是累加器、寄存器、存储器以及立即操作数,而目的操
33、作数可以是累加器、寄存器和存储器。数据传送方向的示意图如图3-15所示。第3章 寻址方式和指令系统图3-15 MOV指令数据传送方向的示意图第3章 寻址方式和指令系统 (1)除了代码段寄存器CS和指令指针IP以外,可在CPU内部寄存器之间任意传送数据。例3-21MOV AL,BLMOV DL,CHMOV AX,DXMOV CX,BXMOV DS,BXMOV DX,ESMOV BX,DIMOV SI,BP第3章 寻址方式和指令系统 (2)立即数传送至CPU内部的通用寄存器组,给这些寄存器赋初值。例3-22MOV CL,4MOV AX,03FFHMOV SI,057BH第3章 寻址方式和指令系统
34、(3)除了CS和IP以外,可实现CPU内部寄存器与存储器(所有寻址方式)之间的数据传送,传送的数据可以是一个字节、一个字或者一个双字。例3-23MOV AL,BUFFERMOV AX,SIMOV EAX,EBXMOV DI,CXMOV SI,BLOCKBPMOV DS,DATASI+BXMOV DESTBP+DI,ES第3章 寻址方式和指令系统 但是,MOV指令不能实现存储单元之间的数据传送。若需要把地址即段内的地址偏移量为AREA1的存储单元的内容,传送至同一段内的地址为AREA2的存储单元中去,MOV指令不能直接完成这样的传送。若要实现两个存储单元之间的数据传送,必须借助CPU的内部寄存器
35、来实现。例3-24给出了传送方法。第3章 寻址方式和指令系统 例例3-243-24MOV AL,AREA1MOV AREA2,AL (以累加器AL为例)例例3-253-25 若传送的数据不是个字节,而是一个数据块,如100个数据,给出所描述的程序段。分析分析 解决的方法有两个:方法1:采用与例3-24类似的200条指令来完成100个数据的传送,这些指令的操作是重复的,每条指令的地址又是变化的。第3章 寻址方式和指令系统 方法2:为简化程序的编制,利用循环程序,方法是:每次循环都要修改源地址和目的地址,这就需要把源、目的地址分别放在两个寄存器中,用寄存器间接寻址来寻找操作数,修改了寄存器的内容,
36、就可以实现对地址的修改。再把循环次数的控制部分考虑进去,就可得如下程序:第3章 寻址方式和指令系统 MOV SI,OFFSET AREA1 ;目的地址存于SI寄存器中 MOV DI,OFFSET AREA2 ;源地址存于DI寄存器中 MOV CX,100 ;计数器存于CX中AGAIN:MOV AL,DI MOV SI,AL INC SI ;修改目的地址 INC DI ;修改源地址 DEC CX ;修改计数器的值 JNZ AGAIN第3章 寻址方式和指令系统 说明:程序段中的AREA1和AREA2是立即数还是存储单元地址,汇编程序是根据对符号的定义来加以区别的;指令INC和DEC分别是增量、减量
37、指令,JNZ为转移指令,将在第5章中作介绍。OFFSET AREA1是指地址单元AREA1在段内的地址偏移量。如前所述,在80 x86中要寻找内存操作数时,必须以段地址(在某个段寄存器中)加上此单元的段内地址偏移量,才能确定某一内存单元的物理地址。上述关于MOV指令的使用说明,是判断MOV指令使用正确与否的依据。例3-26均为正确使用MOV指令的例子,而例3-27均为使用MOV指令不正确的例子。第3章 寻址方式和指令系统例例3-263-26 下列的指令均为正确的指令。MOV AX,BX MOV DS,DX MOV AH,CX MOV BX,WORD PTR DX MOV AL,21H MOV
38、1000H,BX MOV 2000H,54H第3章 寻址方式和指令系统 例例3-273-27 下列的指令均为错误的指令。MOV 47H,AX ;目的地址不可为立即数 MOV CS,BX ;为CS赋值的方法不对 MOV IP,DX ;为IP赋值的方法不对 MOV CX,1000H ;两个存储单元的数据不可直接传送 MOV DS,SS第3章 寻址方式和指令系统 2)地址传送指令 地址传送指令主要用于传送操作数的地址,包括:装入有效地址指令LEA、装入DS、ES、FS、GS、SS指令LDS、LES、LFS、LGS、LSS。(1)装入有效地址指令LEA。格式:LEA reg,mem 功能:将有效地址(
39、偏移地址)mem而不是mem的内容装入到一指定寄存器reg中。第3章 寻址方式和指令系统 说明:源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。该指令通常用来建立串操作指令所必须的寄存器指针。第3章 寻址方式和指令系统 例例3-283-28 LEA BX,LIST 将变量LIST的地址偏移量部分送到BX。例3-29 若BX寄存器的内容是0400H,SI寄存器的内容是003CH,执行指令LEA BX,BX+SI+0F62H后,BX的内容是什么?执行这条指令是将BX、SI的内容与0F62H相加的结果送BX,即将0400H+003CH+0F62H=139EH送BX,所以,执行完
40、该条指令后(BX)139EH。它与MOV BX,BX+SI+0F62H的区别是执行这条MOV指令,是将139EH表示的单元的内容送BX。第3章 寻址方式和指令系统 例例3-303-30 设EDX30H,ESI32H,DOLLAR=7580H,执行LEA ECX,EDX4*ESIDOLLAR的结果是将有效地址7678H(30H432H7580H)传送给ECX。需指出的是,在很多场合下,LEA指令可以用相应的源操作数为立即数的MOV指令代替。例如,指令MOV BX,OFFSET VARWORD与指令LEA BX,VARWORD的执行效果是完全一样的。区别在于前者是用伪指令运算符OFFSET(将在第
41、4章中作介绍)取得源操作数,在程序执行前,由汇编程序汇编时赋值;而后者是在执行指令时赋值;LEA的源操作数可以用各种寻址方式,OFFSET运算符的操作数只能是一个直接的存储器符号。例如,指令LEA DX,TABLESI等效于下列两条指令:MOV DX,OFFSET TABLE ADD DX,SI第3章 寻址方式和指令系统 (2)加载DS/ES/FS/GS/SS指令LDS/LES/LFS/LGS/LSS。格式:OPRD1,OPRD2 LDS reg,mem LES reg,mem LFS reg,mem LGS reg,mem LSS reg,mem 这里的mem是32位或48位远指针,reg是
42、16位或32位任意通用寄存器。第3章 寻址方式和指令系统 功能:这5条指令的作用是将一个32位或48位的全地址指针(包括一个16位段选择符和一个16位或32位偏移值)装入一个段寄存器和一个通用寄存器。段寄存器由指令操作码LDS、LES、LFS、LGS、LSS分别指定为DS、ES、FS、GS、SS,通用寄存器由目的操作数OPRD1指定。第3章 寻址方式和指令系统 说明:对实地址方式和虚拟8086方式,这类指令取的是双16位全地址指针。例3-31 EXDWORD DD 12345678H LDS SI,EXDWORD执行LDS指令后,将高16位1234H送DS,低16位5678H送SI。对16位和
43、32位保护方式,是将选择符送操作码指定的段寄存器,有效地址送指令指定的通用寄存器。第3章 寻址方式和指令系统 例例3-323-32 EXDWORDDD 12345678H ;定义偏移值 DW 0010H ;定义选择符 LDS ESI,EXDWORD执行LDS指令后,将低32位偏移值12345678H送令中指定的通用寄存器ESI,将高16位选择符0010H送DS。LFS/LGS/LSS只能在80386以上的CPU中使用,主要用于处理不在当前数据段中的数据。例例3-333-33 执行LSS SP,LISTDI的结果是把DS:DI+LIST所指向单元内容前两个字节送到SP中,接下来的两个字节送SS中
44、,此时即可访问栈单元。第3章 寻址方式和指令系统 3)交换指令XCHG与字节交换指令BSWAP (1)交换指令XCHG。格式:XCHG OPRD1,OPRD2 功能:将源操作数OPRD2与目的操作数OPRD1相交换。说明:交换可在通用寄存器与累加器之间,通用寄存器之间,通用寄存器与存储器之间进行,但段寄存器不能作为一个操作数。两个操作数可以是两个寄存器操作数,或一个寄存器与一个存储器操作数,相当于三条指令:XCHG reg,reg、XCHG mem,reg和XCHG reg,mem。这里,reg是寄存器操作数,mem是存储器操作数。OPRD1和OPRD2可以是字节、字或者双字,但长度应相等。第
45、3章 寻址方式和指令系统例例3-343-34 XCHG AL,CL XCHG AX,DI XCHG BX,SI XCHG AX,BUFFER ;设BUFFER为字单元 XCHG BX,DATASI XCHG AX,WORD PTR SI XCHG BL,1000H第3章 寻址方式和指令系统 (2)字节交换指令BSWAP。格式:BSWAP reg32 功能:将32位通用寄存器中的双字以字节为单位进行高、低字节交换。即对指定寄存器的32位操作数,将位3124与位70、位2316与位158进行交换,也就是将第一个字节与第四个字节交换,第二个字节与第三个字节交换。说明:这是一条80486扩展的指令。第
46、3章 寻址方式和指令系统 可用于在两种不同结构的微处理器之间进行数据的交换。多字节结构的数据有两种存储方式:一种是Intel系列CPU采用的低位结尾的内存字节排序方法,在这种方法中,多字节结构数据的高位字节存放在内存的高地址单元中;另一种是Motorola系列CPU采用高位结尾的内存字节排序方法,数据存放顺序正好与第一种相反。例例3-353-35 设(EAX)=12345678H,执行指令BSWAP EAX的结果是:(EAX)=78563412H。第3章 寻址方式和指令系统 4)查表转换指令XLAT 格式:XLAT 功能:完成一个字节的查表转换。在DSEBX处建立了一个256字节的表,用寄存器
47、EBX作为基址,寄存器AL作为表的无符号下标(即表指针),将AL指向的那个字节的内容送回AL,即(EBX)(AL)AL。第3章 寻址方式和指令系统 说明:在使用该指令之前,存储器内需有一个代码转换表,表首地址要送到EBX中,相对于表首的位移量送到AL中,则转换后数据的有效地址为 有效地址=表首地址+位移量即以EBX寄存器内容作为表首、AL寄存器内容作为位移量所对应的表中数据送入寄存器AL中,并替换掉AL原先的内容。第3章 寻址方式和指令系统 该指令无显式操作数,操作数是隐含的。指令默认段是数据段DS,而偏移量总是从寄存器EBX中得到。指令执行前AL是下标,执行后AL是查表的结果。若要在其他段中
48、查表,可加段前缀。XLAT指令用于一些无规律的代码转换。第3章 寻址方式和指令系统图3-16 例3-36查表转换指令执行过程第3章 寻址方式和指令系统 例例3-363-36 通过查表转换指令,求09中任意一个数的平方。程序段描述如下:TAB DB 1,4,9,16,25,36,49,64,81 MOV AX,SEG TAB MOV DS,AX MOV BX,OFFSET TAB MOV AL,5 XLAT执行该程序段后,(AL)=25,执行过程见图3-16。第3章 寻址方式和指令系统 5)扩展传送指令MOVSX和MOVZX 格式:MOVSX OPRD1,OPRD2 MOVZX OPRD1,OP
49、RD2 功能:MOVSX为带符号扩展传送指令,将寄存器或存储器中的8位符号数带符号扩展成16位或32位,16位符号数带符号扩展成32位,然后传送给16位或32位寄存器。MOVZX为零扩展传送指令,将寄存器或存储器中的8位无符号数通过在高位加0扩展成16位或32位,16位无符号数通过加0扩展成32位,然后传送给16位或32位寄存器。第3章 寻址方式和指令系统 说明:对带符号数补码,经MOVSX扩展后的结果与扩展前真值是相等的,只是补码位数不同而已;经MOVZX扩展后,无符号数的真值不变。这两条指令常被用于作除法时对被除数位数的扩展。例如,MOVSX ECX,AL是将AL内容带符号扩展为32位送入
50、ECX;MOVZX EAX,CX是将CX中16位数高位加0扩展为32位送EAX。扩展规则:对MOVSX而言,若OPRD2内容是正数,则扩展后的高8位或16位全填0;若OPRD2内容是负数,则扩展后的高8位或16位全填1;对MOVZX而言,扩展后的高8位或16位全填0。第3章 寻址方式和指令系统 在MOVSX OPRD1,OPRD2和MOVZX OPRD1,OPRD2中,OPRD1可以是16位或32位的寄存器,而OPRD2可以是16位的寄存器或是8位的存储单元,OPRD1的长度必须是OPRD2的长度的一倍。该指令仅限于80386以上的CPU。例3-37 设(AL)=42H,(CX)=9687H,