第3章+实方式指令寻址与指令系统_第1页
第3章+实方式指令寻址与指令系统_第2页
第3章+实方式指令寻址与指令系统_第3页
第3章+实方式指令寻址与指令系统_第4页
第3章+实方式指令寻址与指令系统_第5页
已阅读5页,还剩185页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计授课教师:计算机学院张晓丽邮箱:osunmood@126.com第3章

实方式指令寻址与指令系统3.1.

指令的基本寻址方式3.2.

实方式32位指令寻址

3.3.

实方式指令系统3.4.

字符设备I/O功能调用第3章

实方式指令寻址与指令系统3.1.

指令的基本寻址方式3.2.

实方式32位指令寻址

3.3.

实方式指令系统3.4.

字符设备I/O功能调用3.1.指令的基本寻址方式

8086CPU的指令系统的基本指令包括:

数据传送类指令算术运算类指令位操作类指令串操作类指令控制转移类指令处理机控制类指令操作类型1.

数据传送源目的寄存器寄存器寄存器寄存器存储器存储器存储器存储器置“1”,清“0”2.算术逻辑操作加、减、乘、除、增1、减1、求补、浮点运算、十进制运算与、或、非、异或、位操作、位测试、位清除、位求反如8086MOVESTORELOADMOVEPUSHPOP例如MOVEMOVEADDSUBMULDIVINCDECCMPNEGAAAAASAAMAADANDORNOTXORTEST3.移位操作算术移位4.转移(1)无条件转移JMP(2)条件转移结果为零转(Z=1)

JZ结果溢出转(O=1)JO结果有进位转(C=1)JC跳过一条指令SKP循环移位(带进位和不带进位)如300…305306307SKPDZD=0则跳逻辑移位完成触发器INAX,nOUTDX,ALOUTn,AXOUTDX,AX(4)陷阱(Trap)与陷阱指令意外事故的中断

陷阱指令如8086INTTYPE软中断提供给用户使用的陷阱指令,完成系统调用5.输入输出

隐指令一般不提供给用户直接使用

在出现事故时,由CPU自动产生并执行INAL,DXINAX,DX入端口地址CPU的寄存器出CPU的寄存器端口地址如如INAL,nOUTn,ALOther:非数值处理指令特权指令向量指令多处理机指令操作数类型和操作种类一、操作数类型地址数字

字符逻辑数无符号整数定点数、浮点数、十进制数ASCII逻辑运算(布尔类型)二、数据在存储器中的存放方式字地址为低字节地址字地址为高字节地址37621540字地址04低字节04512673字地址04低字节寻址方式寻址方式

确定本条指令的操作数地址下一条

指令的指令地址指令寻址数据寻址

寻址方式寻址方式一、指令寻址顺序(PC)+1PC跳跃由转移指令指出LDA1000ADD1001DEC1200JMP7LDA2000SUB2001INCSTA2500LDA1100...0123456789PC+1指令地址寻址方式指令地址指令顺序寻址1顺序寻址2顺序寻址3跳跃寻址7顺序寻址8二、数据寻址形式地址A指令字中的地址有效地址EA操作数的真实地址约定

指令字长=存储字长=机器字长形式地址A操作码寻址特征3.1.1指令的基本格式

指令一般由操作码OP、寻址方式MOD和一个或多个操作数OD等字段组成操作码OP寻址方式MOD操作数OD指令的表示形式PC微机的多数指令有一个或两个操作数,当然也可以没有操作数常见的表示形式如下:OPOP操作数OP

目的操作数,源操作数

单操作数指令只需指定一个操作数

INCAX;AX+1->AX双操作数指令需要指定两个操作数

SUBBX,CX;BX-CX->BX没有操作数指令,即隐含操作数指令

在OD位置虽然未明确给出操作数,但在指令OP中隐含有事先安排的操作数

CLC;0->CF指令字长指令字长决定于操作码的长度指令字长=存储字长2.指令字长可变操作数地址的长度操作数地址的个数1.指令字长固定—控制简单—控制复杂指令字长为8的倍数常用指令设计单字长格式二、数据寻址操作数:

立即数寄存器数存储器数立即数寻址

寻址方式寄存器寻址存储器寻址3.1.2寻址方式立即寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址地址的计算EA=Disp+(SI/DI/None)+(BX/BP/None)以BP寻址PA,默认用SS以BX、SI、DI或变量寻址,默认DS越段:改变默认使用的段寄存器DS可被CS、SS或ES、FS、GS越段SS可被DS、CS或ES、FS、GS越段地址的计算例:

变量FIVE段地址4000H已在DS中,EA=0010H,则:

FIVEDB5MOVALFIVEPA=DS*24+10H=40010H地址的计算例:

变量FIVE段地址4000H已在ES中,EA=0010H,则可采用越段形式:MOVAL,ES:FIVEPA=ES*24+10H=40010H地址的计算不可越段的情况程序以指针IP寻址,系统规定用代码段寄存器CS与IP计算指令地址以堆栈指针SP寻址PA,用SS对于串操作,ES用来作为目的操作数的段寄存器SSDSDSDSSSDS可被CS、SS或ES、FS、GS越段SS可被DS、CS或ES、FS、GS越段寻址方式1.立即寻址

指令执行阶段不访存A的位数限制了立即数的范围OP#A立即寻址特征立即数可正可负补码形式地址A就是操作数立即寻址

(ImmediateAddressing)寻址特点指令操作码和操作数都在存储器代码段中汇编格式

n(n为立即操作数,是用8位或16位二进制补码表示的有符号数)图形表示立即寻址

(ImmediateAddressing)如果立即数为16位或32位,将按“高高低低”的原则进行存储指令“MOVAX,4576H”的存储形式和执行情况立即寻址示例MOVAX,10。执行后(AX)=?解:源操作数为立即寻址方式,立即数为10,存放在指令的下一单元。执行:10→AX执行后:(AX)=000AH图形表示:2.直接寻址EA=A操作数主存寻址特征LDAAAACC

执行阶段访问一次存储器A的位数决定了该指令操作数的寻址范围

操作数的地址不易修改(必须修改A)有效地址由形式地址直接给出直接寻址

(DirectAddressing)特点指令操作码OP后直接给出操作数的16位偏移地址EA

OP与直接地址在代码段,操作数据一般在数据段功能:指令下一字单元的内容是操作数的偏移地址EA

PA=DS*16+NN图形表示直接寻址示例寄存器和存储器内容为:(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=4545H。执行指令:MOVAX,BUF执行后:(AX)=?

直接寻址示例解:执行:(32000H)→AX执行后:(AX)=4545H图形表示:

MOVBX,[1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?直接寻址示例直接寻址示例3.隐含寻址操作数地址隐含在操作码中ADDA操作数主存寻址特征AACC暂存ALU另一个操作数隐含在ACC中如8086MUL指令被乘数隐含在AX(16位)或AL(8位)中MOVS指令源操作数的地址隐含在SI中目的操作数的地址隐含在DI中

指令字中少了一个地址字段,可缩短指令字长4.间接寻址EA=(A)有效地址由形式地址间接提供OPA寻址特征AEA主存EAA1EAA1主存EA10

执行指令阶段2次访存

可扩大寻址范围

便于编制程序OPA寻址特征A一次间址多次间址操作数操作数多次访存5.寄存器寻址EA=Ri

执行阶段不访存,只访问寄存器,执行速度快OPRi寻址特征

寄存器个数有限,可缩短指令字长操作数…………R0RiRn寄存器有效地址即为寄存器编号寄存器寻址

(RegisterAddressing)特点

操作数在指令指明的寄存器中功能操作数直接存放在寄存器中图形表示寄存器寻址示例下列程序执行后,(AX)=?(BX)=?

MOVAX,1234H

MOVBX,5678H

ADDAX,BX执行:

1234H→AX5678H→BX

(AX)+(BX)→AX执行后:(AX)=68ACH,(BX)=5678H图形表示:解:

6.寄存器间接寻址

有效地址在寄存器中,操作数在存储器中,执行阶段访存操作数主存OPRi寻址特征

便于编制循环程序地址…………R0RiRn寄存器EA=(Ri

)有效地址在寄存器中寄存器间接寻址

(RegisterIndirectAddressing)寄存器间接寻址方式中,寄存器R的内容为操作数的偏移地址EA,操作数在存储器中,即:

EA

=

BX\/BP\/DI\/SI

PA=DS*16+BX/SI/DI

PA=SS*16+BP地址的计算不可越段的情况程序以指针IP寻址,系统规定用代码段寄存器CS与IP计算指令地址以堆栈指针SP寻址PA,用SS对于串操作,ES用来作为目的操作数的段寄存器寄存器和存储器内容分别为:(AX)=0,(BP)=0030H,(SS)=2000H,(20030H)=1234H执行指令:MOVAX,[BP]执行后:(AX)=?,(BP)=?,(SS)=?,(20030H)=?寄存器间接寻址示例解:图形表示:

寄存器间接寻址示例假设有指令:MOVBX,[DI],(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?寄存器间接寻址示例假设有指令:MOVBX,[SI],(DS)=1000H,(DI)=2345H,(SS)=2000H,(SI)=2348H存储单元12345H的内容是4354H12348H4356H。问执行指令后,BX的值是什么?寄存器间接寻址示例解:

该操作数的物理地址应由DS和DI的值形成,即:PA=(DS)*16+(DI)=1000H*16+2345H=12345H

寄存器间接寻址示例寄存器相对寻址

(RegisterRelativeAddressing)寻址特点操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中汇编格式

X[R](X表示位移量,是8位或16位二进制补码表示的有符号数)寄存器相对寻址

(RegisterRelativeAddressing)功能操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA

PA=DS*16+BX/SI/DI+XPA=SS*16+BP+X寄存器相对寻址图示:寄存器相对寻址示例:

设执行前:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H执行指令:ADD6[BX],AX执行后:(AX)=?,(BX)=?,(DS)=?,(20036H)=?

执行:(20036H)+(AX)→20036H执行后:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0090H解:假设指令:MOVBX,[SI+100H],

(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?寄存器相对寻址示例:

解:根据寄存器相对寻址方式的规则,在本指令中的源操作数的有效地址EA为:EA=(SI)+100H=2345H+100H=2445H该操作数的物理地址应由DS和EA的值形成,即:PA=(DS)*16+EA=1000H*16+2445H=12445H。该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。7.基址寻址(1)采用专用寄存器作基址寄存器EA=(BR)+ABR为基址寄存器OPA操作数主存寻址特征ALUBR

可扩大寻址范围

便于程序搬家

BR内容由操作系统或管理程序确定

在程序的执行过程中BR内容不变,形式地址A可变为程序/数据分配存储空间(2)

采用通用寄存器作基址寄存器操作数主存寻址特征ALUOPR0AR0

作基址寄存器由用户指定哪个通用寄存器作为基址寄存器通用寄存器R0Rn-1R1…基址寄存器的内容由操作系统确定在程序的执行过程中R0内容不变,形式地址A可变8.变址寻址OPA操作数主存寻址特征ALUIX可扩大寻址范围可与其他基址寻址合用EA=A+(IX)+(BR)

IX的内容由用户给定在程序的执行过程中

IX内容可变,形式地址A不变通用寄存器也可以作为变址寄存器EA=(IX)+AIX为变址寄存器(专用)处理数组问题例

设数据块首地址为D,求N

个数的平均值直接寻址变址寻址LDADADDD+1ADDD+2……ADDD+(N-1)DIV#NSTAANSLDA#0LDX#0INXCPX#NBNEMDIV#NSTAANS共N+2

条指令共8条指令ADDX,DMX为变址寄存器D为形式地址(X)和#N

比较(X)+1X结果不为零则转基址变址寻址

(BasedIndexedAddressing)特点操作数的偏移地址EA是指令中基址寄存器内容加上变址寄存器内容之和操作数在存储器中格式:

[BR]+[IR]

PA=DS*16+BX+/SI/DIPA=SS*16+BP+SI/DI基址变址寻址图示:假设指令:MOVBX,[BX+SI],

(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问指令执行后,BX的值是什么?基址变址寻址示例解:根据基址加变址寻址方式的规则,在本指令的源操作数的有效地址EA为:EA=(BX)+(SI)=2100H+0011H=2111H该操作数的物理地址应由DS和EA的值形成,即:PA=(DS)*16+EA=1000H*16+2111H=12111H该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。基址变址寻址示例9.相对寻址EA=(PC)+AA是相对于当前指令的位移量(可正可负,补码)A的位数决定操作数的寻址范围

广泛用于转移指令操作数寻址特征ALUOPA相对距离A1000PC

…主存1000AOP(1)相对寻址举例–3*LDA#0LDX#0ADDX,DINXCPX#NBNE

MDIV#NSTAANSMM+1M+2M+3相对寻址特征*

M

随程序所在存储空间的位置不同而不同指令BNE

*-3与指令ADDX,D

相对位移量不变指令BNE*-3操作数的有效地址为

EA=(M+3)–3=M(2)按字节寻址的相对寻址举例OP位移量2000H2008H8JMP*+8OP06H2000H2008H8设当前指令地址PC=2000H转移后的目的地址为

2008H因为取出JMP

*+8后PC=2002H二字节指令故JMP

*+8指令的第二字节为2008H-2002H=06H

相对基址变址寻址

(RelativeBasedIndexedAddressing)特点操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量X三项和操作数在存储器中

汇编格式:X[BR+IR]

PA=DS*16+BX+SI/DI+XPA=SS*16+BP+SI/DI+X假设指令:MOVAX,[BX+SI+200H],(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问指令执行后,AX的值是什么?

相对基址变址寻址示例解:根据相对基址加变址寻址方式的规则,本指令中源操作数的有效地址EA为:EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H该操作数的物理地址应由DS和EA的值形成,即:PA=(DS)*16+EA=1000H*16+2310H=12310H该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。

相对基址变址寻址示例相对基址变址寻址图示:

相对基址变址寻址相对基址加变址寻址方式有多种等价的书写方式,书写格式:

[BX+SI+1000H]

1000H[BX+SI]

1000H[BX][SI]

1000H[SI][BX]等格式都是正确的,并且其寻址含义也一致,但格式:BX[1000H+SI]、SI[1000H+BX]

等是错误的,即所用寄存器不能在”[

]”之外该限制对寄存器相对寻址方式的书写同样起作用。相对基址加变址寻址方式与其它寻址方式之间的变形关系源操作数指令的变形源操作数的寻址方式只有一个偏移量MOVAX,[100H]直接寻址方式只有一个寄存器MOVAX,[BX]或MOVAX,[SI]寄存器间接寻址方式有一个寄存器和偏移量MOVAX,[BX+100H]或MOVAX,[SI+100H]寄存器相对寻址方式有二个寄存器MOVAX,[BX+SI]基址加变址寻址方式有二个寄存器和常数项MOVAX,[BX+SI+100H]相对基址加变址寻址方式

相对基址变址寻址10.堆栈寻址堆栈硬堆栈软堆栈多个寄存器指定的存储空间

先进后出(一个入出口)栈顶地址由SP

指出–11FFFH+12000H

进栈(SP)–1SP

出栈(SP)+1SP栈顶栈底2000HSP2000H……1FFFHSP1FFFH栈顶栈底进栈出栈1FFFH栈顶2000H栈顶(2)堆栈寻址举例15200HACCSPX栈顶200H栈底主存151FFHACCSP15栈顶200H栈底主存X1FFH

PUSHA前

PUSHA后

POPA前

POPA后Y1FFHACCSPX栈顶200H栈底主存151FFH15200HACCSP栈顶200H栈底主存X15(3)SP的修改与主存编址方法有关①按字编址进栈出栈(SP)–1SP(SP)+1SP②按字节编址存储字长16位进栈出栈(SP)–2SP(SP)+2SP存储字长32位进栈出栈(SP)–4SP(SP)+4SP寻址方式若BX=0158H,DI=10A5H,位移量DISP=1B57H,数据段寄存器DS=2100H,则按照直接寻址、寄存器寻址、寄存器间接寻址(假定用BX)、寄存器相对寻址(假定用BX)、基址变址寻址(假定用BX、DI)、相对基址变址寻址(假定用BX、DI)得到的偏移地址和物理地址是多少?寻址方式直接寻址EA=DISP=1B57H,PA=DS*24+EA=21000H+1B57H=22B57H寄存器寻址:无EA寄存器间接寻址

EA=BX=0158H

PA=DS*24+EA=21000H+0158H=21158H寻址方式寄存器相对寻址EA=BX+DISP=0158H+1B57H=1CAFHPA=21000H+1CAFH=22CAFH基址变址寻址

EA=0158H+10A5H=11FDHPA=21000H+11FDH=221FDH相对基址变址寻址EA=0158H+10A5H+1B57H=2D54HPA=21000H+2D54H=23D54H32位地址的寻址方式用16位寄存器来访问存储单元时,只能使用基地址和变址寄存器来作为地址偏移量的一部分但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。

32位地址的寻址方式当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器一个可乘1、2、4或8的32位变址寄存器一个8位/32位的偏移常量并且这三部分还可进行任意组合,省去其中之一或之二。

32位地址的寻址方式基址寄存器

EAX、EBX、ECX、EDX

ESI、EDI、EBP和ESP

变址寄存器

EAX、EBX、ECX、EDX

ESI、EDI和EBP

(除ESP之外)32位地址的寻址方式用32位地址偏移量进行寻址的有效地址计算公式归纳如下:32位地址的寻址方式MOVAX,[123456H] MOVEAX,[EBX]MOVEBX,[ECX*2] MOVEBX,[EAX+100H]MOVEDX,[EAX*4+200H] MOVEBX,[EAX+EDX*2]MOVEBX,[EAX+EDX*2+300H] MOVAX,[ESP]由于32位寻址方式能使用所有的通用寄存器,和该有效地址相组合的段寄存器也就有新的规定。1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;2、默认段寄存器的选用取决于基址寄存器;3、基址寄存器是EBP或ESP时,默认段寄存器是SS,否则,默认段寄存器是DS;4、在指令中,如果使用段前缀的方式,则显式段寄存器优先。32位地址的寻址方式列举几个32位地址寻址指令及其内存操作数的段寄存器。MOV AX,[123456H] ;默认段寄存器DSMOV EAX,[EBX+EBP] ;默认段寄存器DSMOV EBX,[EBP+EBX] ;默认段寄存器SSMOV EBX,[EAX+100H] ;默认段寄存器DSMOV EDX,ES:[EAX*4+200H] ;显式段寄存器ESMOV [ESP+EDX*2],AX ;默认段寄存器SSMOV EBX,GS:[EAX+EDX*2+300H] ;显式段寄存器GSMOV AX,[ESP] ;默认段寄存器SS32位地址的寻址方式3.1.3数据寻址与数据结构的关系多种寻址方式能方便、灵活的存取操作数,支持高级语言的某些数据结构

1.简单变量寻址2.数组或表格数据的寻址3.记录型数组的寻址

1.简单变量寻址

存取简单变量有时使用直接寻址方式,如果变量有基本地址,就将基本地址->BX\/SI\/DI,则存取某个变量EA=BX\/SI\/DI2.数组或表格数据的寻址

表格数据的存取也可当作是数组的存取,均可用寄存器、寄存器相对、基址变址喝相对基址变址等寻址方式。(1)存取基本数组:数组的基本地址->BX,某个元素到数组基本地址的距离->SI\/DI,则:

EA=BX+{SI\/DI}

或者位移量DISP=数组开始地址,BX\/SI\/DI=数组元素到数组开始地址的距离,则:

EA=BX+{BX\/SI\/DI}+DISP2.数组或表格数据的寻址(2)对于赋值语句A(i)=B(j)应指出两个变址寄存器。如对应元素ai可使用DI;对应元素bj用SI,则两组元素的地址分别为:

EA=SI+DISP

EA=DI+DISP(3)存取二维数组A(i,j):数组起始地址->BX,BX兼行元素相对数组起始地址变址,而列元素又相对行元素的变址量->SI\/DI,则存取某个元素应有:

EA={BX+SI}\/{BX+DI}若DISP=数组元素的起始地址,BX=行元素变址量,SI或DI=列元素相对行元素的变址,则存取某个元素应有:

EA=BX+{SI\/DI}+DISP3.记录型数组的寻址数组和记录结合使用。设雇员的记录有四个数据项(雇员、保险号、雇龄和工资),由多个雇员的记录组成一个数组,则任一雇员记录项地址的形式描述为F=f(M,I,J)

其中,F为数组记录项的地址,M为数组的基本地址,I为数组的元素(记录),J为元素的数据项,f则表示记录型数组。对此,存取任一记录中的数据项(如雇龄项)的操作数寻址对应描述为:偏移地址=f(基址,变址,位移)3.记录型数组的寻址(续)假定基址指针再BX,与数组元素相一致的变址值在SI,记录中项的位置用DISP表示,则

EA=BX+SI+DISP。4.堆栈数据结构寻址堆栈采用以BP为基址指针的寻址,方便数据结构相同而参数不同的数据存取。当存取堆栈中的简单变量时

EA=BP+DISP

若存取堆栈中的数据和记录,则

EA=BP+{SI\/DI}+DISP3.1.4程序转移寻址寻址方式对多数指令而言,是要计算出操作数的地址,但是也由少数指令是为了形成程序转移的地址(如无条件转移指令JMP、调用指令CALL等)。程序正常顺序执行时,每取出一条指令执行IP+n->IP,其中n为取出指令的字节数;然后形成下一条指令的地址:PA=CS*24+IP但是如果程序发生转移时,需要计算出转移偏移地址EA并修改IP,有时还需要修改CS的值。这种情况操作的对象是一个地址,地址的内容是要取出的指令,而不是上述讲到的操作数,因此称之为程序转移寻址。程序转移方式:段内转移是指程序在同一段代码内,仅改变IP的值而不改变CS的值所发生的转移。而段间转移是程序要从一个代码段转移到另一个代码段,则不仅改变IP的值,同时也要改变CS的值。无论是段内还是段间发生的转移都有直接和间接的形式,因此程序转移有四种寻址。段内转移图示段内直接转移和间接转移寻址如下图:1.段内直接寻址(IntrasegmentDirectAddressing)

转移偏移地址EA是指令中8位或16位位移量(DISP8,16)与指令指针IP当前内容之和。即:

EA=IP+DISP8,16->IP2.段内间接寻址(IntrasegmentIndirectAddressing)

转移偏移地址EA如果指定的是16位的寄存器,则将寄存器的内容->IP。如果指定的是存储器中的一个字,则将该存储单元的内容->IP。

(EA)->IP段内转移过程段间转移图示程序段间的直接或间接转移如下图:段间转移过程1.段间直接寻址(IntersegmentDirectAddressing)

转移偏移地址EA->IP

转移段地址->CS2.段间间接寻址(IntersegmentIndirectAddressing)(EA)->IP(EA+2)->CS3.2实方式32位指令地址

实地址方式32位指令寻址,指在32位的PC机上使用16位的存储机制,执行32位的非保护方式及非虚拟方式的指令,达到直接存取32位寄存器和32位存储器操作数的目的。3.2.1数据与地址类型 几个概念位域:一个相邻的位系列,在该序列中每一个作为一个独立的单位处理,一个位域可以从任何字节的任何位置开始。位串:相邻位的序列,可以从任何字节的任何位置开始。串:字节、字、双字的序列。实方式的近程指针:16位的段内偏移值。3.2.232位的指令寻址方式偏移地址EA

EA={基址}+{变址}×{比例因子}+{位移量}基址寄存器可以是任意一个32位通用寄存器。变址寄存器是指除了堆栈指针ESP以外的7个通用寄存器。比例因子是1、2、4、8可以分别用于字节、字、双字、四字的变址。常数位移量可以指8位或32位。32位的寻址方式图示如果使用ESPEBP为基址寄存器,则SS是默认的段寄存器,也可用CS、DS、ES、FS、GS来替换SS;使用EAX、EBX、ECX、EDX、ESI、EDI为基址寄存器,则DS是默认的段寄存器,同样也能用CS、SS、ES、FS、GS来越段替换DS32位的指令寻址方式示例: MOVAX,DS:[BP]MOVFS:[EBP],ECX;DS、FS分别替换了缺省段SS32位的指令寻址方式示例(续)为了取得指令代码,只能用CS;PUSH、POP等指令与堆栈有关,也只能用SS。此外,在指令代码32位的程序堆栈操作时,要确保ESP/SP的内容(地址)总是为4的倍数。例如:PUSH12345678H;ESP/SP-4->ESP/SP,12345678->[ESP/SP]POPEAX;([ESP/SP])->EAX,ESP/SP+4->ESP/SP3.2.3实地址32位指令寻址32位的指令寻址包括数据寻址和程序转移寻址。一般寻址的基本概念与16位汇编寻址概念相似,特殊的寻址方式如上叙述。现介绍如下:1、非存储器的数据寻址方式示例(1)立即寻址

MOVEAX,19461201H;19461201H->EAX

与16位寻址相似。(2)寄存器寻址MOVEAX,ECX;ECX->EAX

与16位寻址相似2、 存储器的数据寻址方式示例(1)直接寻址MOVEAX,[4612H];EA=4612,(EA)->EAX

与16位寻址相似。(2)寄存器间接寻址MOV[ECX],EDX;[ECX]间接指示存放操作数EA在EAX中,EA=ECX,EDX->EA,与16位寻址相似。存储器的数据寻址方式示例(续)(3)寄存器相对寻址MOVECX,[EAX+24];EA=EAX,(EA)->ECX(4)基址变址寻址MOVEAX,[EBX][ESI];EA=EBX+ESI,(EA)->EAX(5)相对基址变址寻址SUBEAX,[EBX+ESI+0FF0H];EA=EBX+ESI+0FF0H,EAX-(EA)->EAX存储器的数据寻址方式示例(续)(6)带比例因子的变址MOVECX,[ESI*4];EA=ESI×4,(EA)->ECX(7)基址与带比例因子的变址寻址MOVECX,[EAX][EDX*8];EA=EAX+EDX×8,(EA)->ECX(8)基址与带位移量及比例因子的变址寻址MOVEAX,LTAB[EDI*4][EBP+80];EA=LTAB+EDI×4+EBP+80,(EA)->EAX3.程序转移寻址方式 有相对EIP的段内直接寻址,段内间接寻址、段间直接寻址和段间间接寻址。4.前缀代码67H或66H32位机汇编指令或有32位操作数的情形识别涉及指令机器码格式的有关前缀表示。这些在相应的汇编列表文件(*.LST)或DEBUG过程中可以看到,如前缀代码67H或66H。(1)机器指令操作数长度属性前缀码66H66|83E00FANDEAX,0FH;EAX^0FH->EAX66|8BCBMOVECX,EAX(2)机器指令寻址长度续性前缀67|8B147500000026MOVDX,26H[ESI*2]67|66|8B04B0MOVEAX,[EAX+ESI*4]3.3实方式指令系统指令系统是一台机器所有指令的集合。

Pentium系列机指令系统庞大、类型多样,约有300多条指令,其中包括基本指令100多条。具有支持多进程、多任务、虚拟存储器和多媒体等功能的32位指令。3.3.1常用指令类型集1.数据传送类指令2.算术运算类指令3.逻辑和移位操作类指令4.串操作与重复前缀类指令5.控制转移类指令6.处理机控制类指令7.其它指令本讲义约定:OPD表示目的操作数;OPS表示源操作数;(OPS)表示OPS的内容;(OPD)表示OPD的内容;->表示传送;R表示通用寄存器;Sr表示段寄存器;M表示主存储器;XXXX:XXXX表示组合号,“:”表示其前后组成一个数;L表示操作数的长度;d表示立即数;B/W/D表示字节或字或双字。3.3.2数据传送类指令通用数据传送指令堆栈操作指令标志寄存器传送指令地址传送指令输入输出指令通用数据传送指令1.传送指令MOV2.数据交换指令XCHG3.查表转换指令XLAT语句格式:MOVOPD,OPS功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。下图描述了MOV指令在传送数据时允许传送的路径及类型。1.传送指令MOV注意:(1)OPD,OPS的类型(8/16/32位)必须一致.(2)OPD不能使用立即数。(3)双操作数不能同时为内存中的数据。(4)段寄存器不能直接送立即数.(5)指令执行后不影响FLAGS的标志位的状态.(6)不能任意改变CS示例:存储器与寄存器间数据传送。MOVAX,BUF;BUF是变量,源操作数为直接寻址MOVBH,[DI];源操作数为寄存器间接寻址MOVDI,ES:3[SI];源操作数为变址寻址,使用跨段前缀MOVBP,3[BX+SI];源操作数为基址加变址寻址MOVBUFA,DL;BUFA是一字节变量MOV[BP],AX;使用SS段寄存器MOVDS:[BP],DL;使用跨段前缀MOVBUF,DS ;BUF是个字变量MOVES,BUF2.数据交换指令XCHG语句格式:XCHGOPD,OPS功能:将源地址与目的地址中的内容互换。即(OPD)→OPS,(OPS)→OPD。寄存器与存储器之间数据交换。MOV AX,5678H ;(AX)=5678HMOV BX,0FFFFH ;(BX)=0FFFFHXCHG AX,BX ;(AX)=0FFFH,(BX)=5678HMOVSX和MOVZX指令格式:MOVSXOPD,OPS

MOVZXOPD,OPS它们将OPS的内容->OPD,但是对于OPD左边空缺的位,MOVSX全部用OPS的符号填充(作符号延伸),可以对有符号的数进行符号扩展;而MOVZX是全部以零(0)填充,可对无符号数进行0扩展.

注意:OPD的位数比OPS的位数长示例:MOVCL,88HMOVZXAX,CL;AX=0088HMOVSXBX,CL;BX=FF88H另外也可如下书写指令:MOVSXCX,BLMOVSXEAX,BUFMOVZXAX,CLMOVSXEBX,ALMOVZXESI,BUFMOVZXEDX,DI3.查表转换指令XLA语句格式:XLATOPS或XLAT功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。堆栈操作指令1.进栈指令PUSH2.出栈指令POP3.PUSHA/PUSHAD指令4.POPA/POPAD指令1.进栈指令PUSH语句格式:

PUSHOPS;W/D,R/Sr/M/d功能:将寄存器、段寄存器、立即数或存储器中的一个字数据压入堆栈顶部,指令视操作数长度为字(2字节)或双字(4字节)和地址为16位/32位,先将SP/ESP-2/4->SP/ESP,后将OPS->[SP]/[ESP]。2.出栈指令POP语句格式:POPOPD;W/D,R/Sr/M/d功能:视OPD长度为字或双字,先将当前SP/ESP指向的内容->OPD,后将SP/ESP+2/4->SP/ESP。从POP指令功能可看出,该指令为PUSH指令的逆过程,一般成对使用。3.PUSHA/PUSHAD指令格式:

PUSHA;压入8个字通用寄存器.

PUSHAD;压入8个双字通用寄存器.4.POPA/POPAD指令格式:

POPA;弹出到8个16位通用寄存器

POPAD;弹出到8个32位通用寄存器标志寄存器传送指令1.标志送AH指令LAHF2.AH送标志指令SAHF3.标志寄存器进栈指令PUSHF4.标志寄存器出栈指令POPF1.标志送AH指令LAHF语句格式:LAHF功能:将标志寄存器的低8位送入AH寄存器。即(FLAGS)7-0→AH。该指令的执行对标志位无影响。【例】标志寄存器传送。执行前:(FLAGS)=0485H,(AX)=0FFFFH执行指令:LAHF执行后:AH=85H2.AH送标志指令SAHF语句格式:SAHF功能:将AH的内容送入标志寄存器的低8位,高8位不变。即(AH)→FLAGS7-0。从该指令功能可看出,SAHF为LAHF的逆过程。3.标志寄存器进出栈指令PUSHF/POPF语句格式:PUSHF

功能:将标志寄存器的内容压入堆栈。即(FLAGS)->堆栈。POPF功能:将堆栈顶端的内容送到标志寄存器。即堆栈->(FLAGS)。

地址传送指令1.传送偏移地址指令LEA2.传送偏移地址及数据段首址指令LDS3.传送偏移地址及附加数据段指令LES1.传送偏移地址指令LEA语句格式:LEAOPD,OPS;OPS的EA->OPD

;OPD是16/32位的R,OPS是M功能:主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。【例】主存偏移地址的获取。MOVBX,0100H ;(BX)=0100HMOVSI,0210H ;(SI)=0210HLEABX,1234[BX+SI] ;(BX)=1544H2.LDS/LES/LFS/LGS/LSS指令语句格式:LDS/LES/LFS/LGS/LSSOPD,OPS;EA=OPS功能:地址传送LDS等指令中,OPD为R(16位),OPS为M(32位).操作对FLAGS无影响,执行后结果为:(EA)->R;全程指针的偏移地址(EA+2)->LDS/LES/LFS/LGS/LSS;全程指针的段地址输入输出指令1.输入指令IN2.输出指令OUT1.输入指令IN输入指令用来从指定的外设寄存器取信息送入累加器。它有四种形式:(1)语句格式:IN AL,PORT

功能:(PORT) →AL(2)语句格式:IN AX,PORT

功能:(PORT) →AX(3)语句格式:IN AL,DX

功能:([DX]) →AL(4)语句格式:IN AX,DX

功能:([DX]) →AX2.输出指令OUT输出指令用来把累加器的内容送往指定的外设存储器,它有四种形式:(1)语句格式:OUT PORT,AL

功能:(AL) →PORT(2)语句格式:OUT PORT,AX

功能:(AX) →PORT(3)语句格式:OUT DX,AL

功能:(AL) →[DX](4)语句格式:OUT DX,AX

功能:(AX) →[DX]3.3.3位操作类指令逻辑运算指令1.求反指令NOT2.逻辑乘指令AND3.测试指令TEST4.逻辑加指令OR5.按位加指令XOR语句格式:NOTOPD功能:将目的地址中的内容逐位取反后送入目的地址。即(OPD)求反→OPD【例】逻辑非运算。MOV AX,878AH;(AX)=878AHNOT AX ;(AX)=7875H1.求反指令NOT语句格式:ANDOPD,OPS 功能:将目的操作数和源操作数进行逻辑乘运算,结果存目的地址。即(OPD)∧(OPS)→OPD。该指令用于清除目的操作数中与源操作数置0的对应位。说明:逻辑乘的运算法则为:1∧1=1,1∧0=0,0∧1=0,0∧0=0【例】将AL中第3位和第7位清零。MOV AL,0FFHAND AL,77H2.逻辑乘指令AND语句格式:TESTOPD,OPS功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址。即(OPD)∧(OPS)。【例】测试AX中的第12位是否为0,不为0则转L。TEST AX,1000HJNE L

3.测试指令TEST语句格式:OROPD,OPS功能:将目的操作数和源操作数进行逻辑加运算,结果存目的地址。即(OPD)∨(OPS)→OPD。说明:逻辑加的运算法则为:1∨1=1,1∨0=1,0∨1=1,0∨0=0。【例】将AL寄存器中第3位和第7位置1。MOV AL,0OR AL,88H4.逻辑加指令OR语句格式:XOROPD,OPS功能:目的操作数与源操作数做按位加运算,结果送入目的地址。即(OPD)⊕(OPS)→OPD。说明:按位加的运算法则为;1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。【例】按位加运算。MOV AL,45H ;(AL)=45HXOR AL,31H ;(AL)=74H5.按位加指令XOR移位指令

移位指令包括算术移位指令、逻辑移位指令和循环移位指令,分别进行左移和右移操作。这些指令均有统一的语句格式:SAL/SHLOPD,OPS;左移SAROPD,OPS;算术右移SHROPD,OPS;逻辑右移其中,OPD是8/16/32位的R/M;OPS是计数值(即移位次数),有三种情形:OPS即可是8位的立即数或CL的内容(移位前次数->CL)。其功能为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0~255)移动,结果送入目的地址。目的操作数是8位(或16位)的寄存器数据或存储器数据。语句格式:SALOPD,1或SHLOPD,1

SALOPD,CL或SHLOPD,CL功能:将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。1.算术左移和逻辑左移指令SAL(SHL)语句格式:SAROPD,1或SAROPD,CLCF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。2.算术右移指令SARMOV BH,0F4H ;(BH)=0F4HMOV CL,2 ;(CL)=2SAR BH,CL ;(BH)=0FDH,(CF)=0该例语句“SAR

BH,CL”实际上完成了(BH)/4→BH的运算,所以,用SAR指令可以实现对有符号数除2n的运算(n为移位次数)。【例】算术右移运算语句格式:SHROPD,1或SHROPD,CL功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。3.逻辑右移指令SHR语句格式:ROLOPD,1或ROLLPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。4.循环左移指令ROL语句格式:ROROPD,1或ROROPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。

07CF5.循环右移指令ROR语句格式:RCLOPD,1或RCLOPD,CL功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。6.带进位的循环左移指令RCL语句格式:RCROPD,1或RCROD,CL功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。7.带进位的循环右移指令RCR3.4字符设备I/O功能调用

本节主要介绍DOS子程序调用方式、键盘输入、屏幕显示和打印机输出的DOS系统功能调用。DOS子程序调用方式调用之前:设置子程序的入口参数。调用请求:执行“INT21H”软中断指令调用。调用之后:可能有出口参数,也可能无出口参数。如果有出口参数,可根据程序需要,判断本次调用是否成功或者分析执行情况。1从键盘输入一个字符AH=01H

从键盘读入一个字符,送到显示器输出,并将该字符的ASCII码值->AL(出口参数);如果检测到读入的字符是Ctrl+Break,则中止程序执行。例:MOVAH,H键盘输入子程序,功能1->AHINT21HDOS子程序调用,等待键入一个字符调用后,输入字符的ASCII码值->AL2、显示输出一个字符AH=02H将DL寄存器重的字符(ASCII码值)送到标准输出设备上输出。若检测到Ctrl+Break间,则执行中断“INT23H”中止程序的执行。例:MOVDL,AL;AL内容是字符的ASCII码->DL

MOVAH,2;功能号2->AH

INT21H;调用显示一个字符3.打印机输出一个字符AH=05H将要打印的字符->DL,然后调用就可以打印输出。如果有标准打印设备不输出,可在执行时用DOS命令键Ctrl+Break进行帮助。例:MOVDL,AL;AL的字符ASCII码->DL

MOVAH,5;功能号5->AH

INT21H;调用打印一个字符4、直接控制台输入AH=07H输入时不回显,例如,从键盘输入一个字符,在屏幕上不显示,出口参数AL=键入的字符。可用来设置保密口令。例:

PASSWORDDB10DUP(0)...MOVCX,6MOVSI,0AGAIN:MOVAH,7INT21HMOVPASSWORD[SI],ALMOVDL,’*’MOVAH,2INT21HINCSILOOPAGAIN5、显示输出字符串AH=09H例:执行下语句后屏幕显示输出“WELCOME!”STRINGDB‘WELCOME!’,13,10,’$’

…MOVAX,SEGSTRINGMOVDS,AXLEADX,STRINGMOVAH,9INT21H6、缓冲区键盘输入AH=0AH如果需要键入最大的字符数位N,则由“DS:DX”指向的缓冲区可分为3个字段。第一个字段:定义缓冲区可存放的字符数N+1,使机器自动控制检查,若键入实际的字符数个数超过N,则响铃报警。第二个字段:定义缓冲区,当键盘输入调用退出后,系统自动计数并存放实际输入的字符。第三个字段:定义可存放字符的缓冲区,调用退出后,存放实际输入的字符,最后一个字节总是回车符。0AH调用示例例:编写在实地址方式(.586与USE16)下,定义一个能最多可输入20个字符到BUF缓冲区的程序。.586STACKSEGMENTUSE16;定义16位段

DB256DUP(0)STACKENDSDATASSEGMENTUSE16NEQU20BUFDBN+1;定义第一个字段,BUF位21COUNTDB0;定义第二个字段CHARDBN+1DUP(0);定义第三个字段PROMPTDB‘Pleaseinput:’,13,10,‘$’DATASENDS0AH调用示例(续)CODESSEGMENTUSE16ASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXLEADX,prompt;取prompt的偏移地址->dx

MOVAH,9

INT21H

LEADX,BUF;取BUF的偏移地址->dx

MOVAH,0AH

INT21H

MOVAH,4CH

INT21HCODESENDS

ENDSTART7、返回DOS调用AH=4CH功能:返回DOS入口参数:AH=4CH,AL=返回码出口参数:第3章操作数的寻址方式微机系统有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式等。其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实现对数组元素的访问。另外,在32位微机系统中,为了扩大对存储单元的寻址能力,增加了一种新的寻址方式——32位地址的寻址方式。第3章操作数的寻址方式3.1立即寻址方式操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。立即数可以是8位、16位或32位数,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如:MOVAH,80HADDAX,1234HMOVECX,123456HMOVB1,12HMOVW1,3456HADDD1,32123456H其中:B1、W1和D1分别是字节、字和双字单元。立即数寻址方式通常用于对通用寄存器或内存单元赋初值。第3章操作数的寻址方式下图是指令“MOVAX,4576H”的存储形式和执行情况示意图。第3章操作数的寻址方式3.2寄存器寻址方式指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。指令中可以引用的寄存器及其符号名称如下:8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。

寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数。通常情况下,我们提倡应尽可能地使用寄存器寻址方式,但也不要绝对化。第3章操作数的寻址方式3.3直接寻址方式指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。第3章操作数的寻址方式例3.1假设有指令:MOVBX,[1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?解:根据直接寻址方式的寻址规则,把该指令的具体执行过程如下图所示。第3章操作数的寻址方式3.4寄存

温馨提示

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

评论

0/150

提交评论