汇编语言程序设计第3章.ppt_第1页
汇编语言程序设计第3章.ppt_第2页
汇编语言程序设计第3章.ppt_第3页
汇编语言程序设计第3章.ppt_第4页
汇编语言程序设计第3章.ppt_第5页
已阅读5页,还剩241页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论