嵌入式接口技术课件2_第1页
嵌入式接口技术课件2_第2页
嵌入式接口技术课件2_第3页
嵌入式接口技术课件2_第4页
嵌入式接口技术课件2_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式接口技术第2章

微处理器指令系统

北京农学院计算机与信息工程学院王玉洁知识点:ARM处理器指令结构、寻址方式、指令集、80X86微处理器指令系统重点:处理器寻址方式、微处理器指令集虽然嵌入式程序都可以用汇编语言、C语言或C++语言等高级语言以及汇编语言与C语言混合编程设计,但是汇编语言是编程效率最高、最直接的编程方法,而且嵌入式程序是更接近底层硬件的,汇编语言更为直接有效。即便大部分程序用高级语言设计,但系统的引导、启动代码必须使用汇编语言设计。指令系统是汇编语言程序设计的基础,而汇编语言编程是在指令集的基础上进行设计的。ARM处理器指令集是基于RISC的指令、是32位指令。ARM指令集的指令编码长度是以32位定长二进制给出的。2.1ARM处理器指令结构及寻址方式编码格式ARM指令集的指令编码格式是三操作数指令格式:包括条件编码、与指令类型有关的代码、操作码、目标寄存器编码、第一个操作数寄存器编码、条件标志位及第二个操作数等部分。ADDEQR0,R2,R5EQ为条件码,无S位2.1.1语法格式<Opcode>{<Cond>}{S}<Rd>,<Rn>,<Operand2>其中:

Opcode

指令助记符

Cond

指令执行的条件

S 决定指令的操作是否影响CPSR的值

Rd 表示目标寄存器

Rn

包含第1个操作数的寄存器

Operand2 表示第2个操作数2.1.2操作符助记符,表3-1(P53)分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令、异常产生指令、饱和指令和伪指令2.1.3条件域表3-3(P56)15种条件几乎所有的指令均根据程序状态寄存器CPSR中条件码C、Z、N、V的状态和指令的条件域有条件的执行。2.1.4条件码不等于(Notequal)

无符号的大于或等于无符号的小于负数(Minus)等于(Equal)溢出(Overflow)没溢出无符号的大于无符号的小于等于正数或零带符号小于(LessThan)带符号大于(GreaterThan)带符号小于等于总是执行(Always)带符号大于等于EQNECS/HSCC/LOPLVSHILSGELTGTLEALMIVCSuffix描述Z=0C=1C=0Z=1测试的标志位N=1N=0V=1V=0C=1&Z=0C=0orZ=1N=VN!=VZ=0&N=VZ=1orN=!V2.1.5指令集的寻址方式寻址方式:寻找指令或操作数的物理地址的方式。有指令寻址、操作数寻址2种。主要讨论操作数寻址。寻址方式是根据指令编码中所给出的地址码字段来寻找真实操作数的方式,指令格式是寻址方式的具体表现。操作数可能在:指令中直接给出:立即数寄存器内存单元立即寻址寄存器寻址寄存器移位寻址寄存器间接寻址基址变址寻址多寄存器寻址相对寻址堆栈寻址2.2

ARM指令集2.2.1跳转指令有两种方法可以实现程序流程的跳转:1.

使用专门的跳转指令直接跳转。2.直接向程序计数器PC写入跳转地址值调转指令包括以下指令:B 跳转指令BL 带返回的跳转指令BX 带状态切换的跳转指令BLX带状态切换的返回的跳转指令ARM指令集编码313029282726252423222120191817161514131211109876543210说明Cond001OpcodeSRnRdOperand2数据处理/PSR状态转换Cond000000ASRdRnRs1D01Rm乘法Cond00001UASRdHiRdLoRn1D01Rm长乘法Cond00010B00RnRd00001D01Rm数据交换Cond000100101111111111110001Rm分支与交换Cond000PU0WLRnRd00001SH1Rm半字存取寄存器偏移量Cond000PU1WLRnRdOffset1SH1Rm半字存取立即数偏移量Cond011PUBWLRnRdOffset单数据存取Cond00010R001111Rd000000000000状态寄存器传输指令Cond0111未定义Cond100PUSWLRnREGISTERLIST数据块存取Cond101Offset分支Cond110PUNWLRnCRdCP#OFFSET协处理器数据存取Cond111OpcodeCRnCRdCP#CP0GRm协处理器数据操作Cond111OpcodeLCRnRdCP#CP1GRm协处理寄存器传送Cond111IgnoredbyProcessor软中断3130292827262524232221201918171615141312111098765432102.2.2数据处理指令数据传送指令MOV、MVN算术逻辑运算指令ADD、ADC、SUB、SBC、RSB、RSCAND、ORR、EOR、BIC比较指令CMP、CMN、TST、TEQ不保存计算结果2.2.3存储器访问指令加载/存储指令LDR、LDRB、LDRHLDRSB、LDRSHSTR、STRB、STRH批量加载/存储指令LDM、STM数据交换指令SWP、SWPB2.2.4乘法指令不能使用立即数或移位MULMLASMULLSMLALUMULLUMLAL2.2.5状态字访问指令MRS和MSR允许传送CPSR/SPSR中的内容到/从一个通用寄存器中。也允许送一个立即数到CPSR/SPSR2731NZCVQ2867IFTmode1623

815

54024fsxc

UndefinedJDestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift(无符号数)乘2除2,并保留符号位2.2.6移位操作移位操作DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight(无符号数)除2位轮换DestinationRRX:RotateRightExtended位轮换,从CF到MSB都参与操作CF2.2.7伪指令ADRADRLLDRNOP2.2.8

Thumb指令及应用子集代码量少适合于访问窄内存内核状态切换3.380X86指令系统寻址方式汇编语言指令直接运用CPU的寄存器和计算机内存储器,例如从内存储器某字节中取数据存入CPU的AL寄存器中。所以内存储器的构成也是汇编语言关心的部分内容。3.3.1实模式存储器寻址8086微处理器(CPU)有20位地址总线,可以传输20位地址,也就是最小的地址编号为20位全为0,最大的地址编号为20位全是1,用十六进制表示为00000H~FFFFFH(由于二进制与十六进制有4位二进制对应1位十六进制这样简单的对应关系,大部分教材、汇编语言程序设计编程二进制都采用十六进制表示),达到1MB寻址能力。80X86微处理器(CPU)采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址,将段地址与偏移地址称为逻辑地址;存储器的实际地址也称为物理地址,需由逻辑地址相加而形成,是由一个称为地址加法器的部件完成的。80X86微处理器(CPU)汇编语言程序通常把数据和程序分别存放。数据存放在数据段中,段地址存入数据段段寄存器(DS寄存器)中。程序存放在代码段中,段地址存入代码段段寄存器(CS)中。在执行程序的时候,80X86从代码段中读取指令。指令的逻辑地址由代码段(CS代码段寄存器)和指令指针(IP指令指针寄存器)两部分按照CS:IP的格式组成。CS包含的是段地址,IP包含的是偏移地址。经由地址加法器得到的20位地址就是物理地址。附加段(ES)是被用作为额外数据段的寄存器。附加段在串处理指令中具有专门的用途。附加段中的逻辑地址和物理地址的计算与数据段中的逻辑地址和物理地址的计算方法一样,只需将数据段(DS)用附加段(ES)替换。堆栈的逻辑地址由堆栈段(SS)寄存器和堆栈指针(SP)的值,SS中是段地址,SP中是偏移地址。SS左移4位(二进制)加上堆栈指针SP就得到堆栈的物理地址。IBMPC的存储映射8086微处理器(CPU)总共1MB的存储空间分配情况为:从00000H到9FFFFH的640KB都用作主存储器地址空间RAM;从A0000H到BFFFFH的128KB用作显示地址空间RAM;余下的从C0000H到FFFFFH的256KB则用只读存储ROM。3.3.280X86的寻址方式80X86总共提供如下几种不同的寻址方式:(1) 立即寻址方式(2) 寄存器寻址方式(3) 直接寻址方式(4) 寄存器基址寻址方式(5) 寄存器变址寻址方式(6)寄存器相对寻址方式(7) 相对基址变址寻址方式1.立即寻址方式在立即寻址方式中,源操作数是一个常量,即操作数在指令中直接给出。因此,这种寻址方式执行起来很快,然而在编程方面这种方式的应用是有限的。立即寻址方式可以用于把信息载入除了段寄存器和标志位寄存器以外的任何寄存器中。例如:MOVAX,1234HMOVCH,222.寄存器寻址方式操作数在寄存器中,指令中给出寄存器的名称。执行这种寻址方式无需访问存储器,因此这种方式指令执行速度很快。例如:MOVES,AXMOVAL,DL3.直接寻址在直接寻址方式中,数据位于存储器中,这些数据在存储器中的地址直接出现在指令中。该地址是偏移地址。例如:MOVDL,[2400H]MOVAX,[2400H]如果(DS)=3000H,执行第一条指令是将物理地址为32400H(30000H+2400H)内存单元中存储的数据36H存入DL寄存器。执行第二条指令是将物理地址为32400H和32401H的内容存入AX寄存器,AX内容为1836H。4.寄存器基址寻址方式在寄存器基址寻址方式中,操作数在存储器中,其地址保存在寄存器中,指令中给出存放地址的寄存器名称。用于寄存器基址寻址的寄存器有BX、BP。BX和BP是基址寄存器。如果BX寄存器被用来保存存储位置的偏移量,那么它的内容必须与DS结合才能产生20位的物理地址。例如:MOVAX,[BX]如果(DS)=1000H,(BX)=2000H,执行这条指令是将物理地址为12000H(10000H+2000H)内存单元相继两个字节的内容存入AX寄存器。5.寄存器相对寻址方式在寄存器相对寻址方式中,由基址寄存器(BX,BP)或变址寄存器(SI,DI)与指令中给出的位移值共同构成有效地址即偏移地址。同寄存器间接寻址方式相同,SI、DI和BX用于计算物理地址的默认段为DS。BP用于计算物理地址的默认段为SS。例如:MOVCX,[SI]+10如(DS)=2000H,(SI)=1000H。执行这条指令是将物理地址为2100AH(2000H+1000H+10)内存单元中存储的内容移入CL中,与它相继的2100BH中存储的内容移入CH中。6.寄存器变址寻址方式寄存器变址寻址方式就是用一个变址寄存器(SI或DI)产生存储单元的偏移地址,例如:MOVAX,[SI]值得注意的是,变址寻址必须是一个变址寄存器形成存储单元的偏移地址。7.相对基址变址寻址方式操作数的有效地址是一个基址寄存器(BX或BP)与一个变址寄存器(SI或DI)的内容和指令中给定的位移值之和,所以有效地址由三种成分组成。与基址变址寻址方式相比较增加了位移值部分,其它规则与基址变址寻址是相同的。例如:MOVAX,MASK[BX][SI]也可以写成:MOVAX,MASK[BX+SI]或MOVAX,[MASK+BX+SI]如(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H。物理地址为33250H(30000H+2000H+1000H+0250H)段的自主控制下表总结了80X86中与四个段寄存器分别对应的偏移寄存器,这是CPU默认的情况。80X86CPU允许程序来自主控制使用段寄存器而不采用默认的寄存器。实行自主控制时,只需在代码段中指定需要的段寄存器即可。例如:MOVAL,ES:[BX]MOVAX,SS:[SI]在通常情况下BX、SI寄存器间接寻址默认的段寄存器为DS,而指令中明确指出用ES附加段作为段寄存器或SS堆栈段作为段寄存器。段寄存器CSDSESSS偏移寄存器IPSI,DI,BXSI,DI,BXSP,BP表

段寄存器与偏移寄存器对应关系3.480X86的指令系统80X86汇编指令系统中的指令按照功能可以划分为:数据传送指令控制转移指令算数运算指令处理机控制指令逻辑与移位指令输入输出指令字符串处理指令3.4.1数据传送指令1.数据传送指令MOV格式为:MOVDST,SRC执行操作:(DST)←(SRC)其中DST表示目的操作数,SRC表示源操作数。这条指令是把源操作数移动到目的操作数,源操作数内容不变。例如:MOVAL,55H ;AL寄存器的内容为55HMOVCL,AL ;(CL)=(AL)=55H运用MOV传输指令在寄存器之间传输数据要求源寄存器和目的寄存器的位数相同。立即数不可以直接装入段寄存器(DS,ES,SS)。要想把一个立即数装入一个段寄存器,首先应当把该值装入一个非段寄存器,然后再移动到段寄存器中。代码段寄存器(CS)不可以被指令赋值,例如:MOVCS,AX指令是错误的。MOV指令的目的操作数不允许为立即寻址方式,而且除源操作数为立即数的情况外,两操作数必须有一个为寄存器。不允许用MOV指令在两个存储单元之间直接传输数据。2.堆栈指令PUSH/POP由于CPU寄存器数量有限,在内存(RAM)中开辟一块存储空间来存放临时需要保存的数据。主要用来访问堆栈的寄存器是SS(堆栈段)寄存器和SP(栈指针)寄存器。在任何指令使用堆栈之前,都必须对这两个寄存器赋值。PUSH压栈指令格式:PUSHSRC执行操作:(SP)←(SP)-2((SP)+1,(SP))←(SRC)POP出栈指令格式:POPDST执行操作:(DST)←((SP)+1,(SP))(SP)←(SP)+23.XCHG交换指令指令格式:XCHGOPR1,OPR2执行操作:(OPR1)←→(OPR2)其中OPR表示操作数。两个操作数中必须有一个为寄存器,因此它可以在寄存器之间或者在寄存器与存储器之间交换信息,但不允许使用段寄存器。指令允许字或字节操作。例如:XCHGBX,VALE[SI]3.4.2算术指令1.加法指令(1) ADD加法指令格式:ADDDST,SRC执行的操作:(DST)←(SRC)+(DST)(2)ADC带进位加法指令格式:ADCDST,SRC执行的操作:(DST)←(SRC)+(DST)+CF该指令可能影响标志位寄存器中的ZF(零标志位)、SF(符号标志位)、AF(辅助进位标志位)、CF(进位标志位)、OF(溢出标志位)和PF(奇偶标志位)。在执行加法指令操作时,是源操作数与目的操作数相加结果保存在目的操作数中。其中操作数为8位或为16位操作数,对于无符号数8位操作数的取值范围是0~255(0~0FFH),16位操作数取值范围是0~65535(0~0FFFFH)。运算结果超出这个范围CPU把进位标志位(CF)置1来表明这种情况。对于带符号数,8位操作数的取值范围是-128~127(80H~7FH),16位操作数取值范围是-32768~32767(8000H~07FFFH)。运算结果超出了这个范围,CPU通过把溢出标志位(OF)置1来表明这种情况。(3)INC加1指令格式:INCOPR执行的操作:(OPR)←(OPR)+1此指令不影响标志位。2.减法指令(1) SUB减法指令格式:SUBDST,SRC执行的操作:(DST)←(DST)-(SRC)例如:SUBBX,0136H假设指令执行前:(BX)=4336H指令执行后:(BX)=4200H,CF=0,OF=0,SF=0,ZF=0。(2) SBB带借位减法指令格式:SBBDST,SRC执行的操作:(DST)←(DST)-(SRC)-CF目的操作数减去源操作数再减去进位标志位。该指令用于多字节(字)数字的减法运算,其中需要考虑低位字节的借位。如果进位标志位是0,SBB的作用与SUB相同;但是如果进位标志位是1,那么SBB就会从结果中减去1。用80X86指令序列实现32位W←X+Y+240-ZMOVAX,X ;AX存放X的低位字MOVDX,X+2 ;DX存放X的高位字ADDAX,Y ;X+Y低位ADCDX,Y+2 ;X+Y+低位的进位ADDAX,240 ;X+Y结果低位加240ADCDX,0 ;高位加CF进位位SUBAX,Z ;低位相减SBBDX,Z+2 ;高位相减并且减低位的借位MOVW,AX ;结果保存MOVW+2,DX(3) DEC减1指令格式:DECOPR执行的操作:(OPR)←(OPR)-1减1指令不影响标志位。(4) NEG求补指令格式:NEGOPR执行的操作:(OPR)←0FFFFH-(OPR)+1把操作数按位求反后末位加1。(5) CMP比较指令格式:CMPOPR1,OPR2执行的操作:(OPR1)-(OPR2)该指令与SUB指令一样执行减法操作,但它不保存结果,只是根据结果设置标志位。CMP指令后往往跟着条件转移指令,根据比较的结果产生不同的程序分支。3.乘法指令(1) MUL无符号数乘法指令格式:MULSRC字节操作数:(AX)←(AL)*(SRC)

字操作数:(DX,AX)←(AX)*(SRC)当字节与字节相乘时,其中一个操作数必须位于寄存器AL中,而另一个操作数可以位于寄存器或存储器中(前面介绍的任意一种存储器寻址方式)。乘法执行完后,结果位于AX寄存器中。当字与字相乘时,其中一个操作数必须位于寄存器AX中,而另一个操作数可以位于寄存器或存储器中。乘法执行完后,结果位于DX和AX寄存器中。由于字与字相乘的结果可能会多达32位,所以AX将保存结果的低16位,DX保存结果的高16位。(2) IMUL带符号数乘法指令格式:IMULSRC执行的操作:与MUL指令相同。MUL指令和IMUL指令的区别,前者是无符号数的乘法指令,后者是带符号的乘法指令。程序中运用哪个指令取决于所要相乘数是否带符号数的运算。4.除法指令(1) DIV无符号数除法指令格式:DIVSRC执行的操作:字节操作:(AL)←(AX)/(SRC)的商(AH)←(AX)/(SRC)的余数字操作:(AX)←(DX,AX)/(SRC)的商(DX)←(DX,AX)/(SRC)的余数无符号除法分为两类:①字除以字节。②双字除以字。(2) IDIV带符号数除法指令格式:IDIVSRC执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也都是带符号数,且余数的符号和被除数的符号相同。5.十进制调整指令十进制调整指令用于BCD码算术运算中。BCD分为两类:非组合型BCD和组合型BCD。非组合型BCD:用一个字节(8位)存储一位十进制数,数字的低四位代表BCD数字,高四位为0。例如:“00000011”是数字“3”,“00001000”是数字“8”。组合型BCD:一个字节中可以存放两个BCD,一个放在高四位,一个放在低四位。例如:“10000011”是“83”组合性BCD。由于一个字节中可以存放两个BCD,存储效率高。3.4.3逻辑与移位指令1.逻辑运算指令(1) AND逻辑与指令格式:ANDDST,SRC执行的操作:(DST)←(DST)∧(SRC)该指令的作用是对操作数执行逻辑与(AND)运算并把结果保存到目地操作数中。目标操作数既可以位于寄存器中,也可以位于存储器中。源操作数既可以位于寄存器或存储器中,也可以是立即数。(2) OR逻辑或指令格式:ORDST,SRC执行的操作:(DST)←(DST)∨(SRC)该指令的作用是对操作数执行逻辑或(OR)运算并把结果保存到目的操作数中。目标操作数、源操作数既可以位于寄存器或存储器中。源操作数可以是立即数。标志位的设置情况与指令AND相同。OR指令可以把端口或内存单元中某些位置1。例如:要求把AL寄存器中D5位置1.ORAL,20H由于任何位同0做OR操作保持原来的值不变,同1做OR操作该位被置1。(3) NOT逻辑非指令格式:NOTOPR执行的操作:(OPR)←(OPR)(4) XOR异或指令格式:XORDST,SRC执行的操作:(DST)←(DST)(SRC)该指令的作用是对操作数执行逻辑异或(XOR)运算并把结果保存到目的操作数中。目标操作数既可以位于寄存器中,也可以位于存储器中。源操作数既可以位于寄存器或存储器中,也可以是立即数。标志位的设置与AND相同。思考:与0、1异或的结果?(5) TEST测试指令格式:TESTOPR1,OPR2执行的操作:(OPR1)∧(OPR2)两个操作数做与(AND)运算,同AND操作不同的是TEST指令不保存运算结果,但设置条件标志位,标志位的设置与AND相同。2.移位指令利用移位指令可以把寄存器或存储器中的内容向左或向右移动。如果只把运算数移动1位,可以在指令中直接指定;如果运算数移动的次数(位数)大于1,则必须通过寄存器CL来指定移位的次数。(1) SHL逻辑左移指令格式:SHLOPR,CNTSHL是逻辑左移指令,即运算数的各个位被依次向左移动,最高位总是被移动到进位标志位上,而最低位总是补充0。(2) SAL算数左移指令格式:SALOPR,CNT与SHL指令相同(3) SHR逻辑右移指令格式:SHROPR,CNTSHR是逻辑右移指令,即运算数的各个位被依次向右移动,最低位总是被移动到进位标志位上,而最高位总是补充0。(4) SAR算数右移指令格式:SAROPR,CNTSAR是算数右移指令,即运算数的各个位被依次向右移动,最低位总是被移动到进位标志位上。而空出的最高位用符号位填充,以保持符号位不变。(5) ROL循环左移指令格式:ROLOPR,CNTROL是循环左移指令,即运算数的各个位被依次向左移动,最高位被移动到最低位和进位标志位上。(6) ROR循环右移指令格式:ROROPR,CNTROR是循环右移指令,即运算数的各个位被依次向右移动,最低位被移动到最高位和进位标志位上。(7) RCL带进位循环左移指令格式:RCLOPR,CNTRCL是带进位循环左移指令,即运算数的各个位被依次向左移动,最高位被移进位标志位上,原进位标志位上的值被移动到最低位。(8) RCR带进位循环右移指令格式:RCROPR,CNTRCR是带进位循环右移指令,即运算数的各个位被依次向右移动,最低位被移进位标志位上,原进位标志位上的值被移动到最高位。习题:教材2的作业3-16假设(DX)=0B903H,(CL)=3,(CF)=1,确定下列各条指令单独执行后DX中的值。SHRDX,1SARDX,CLSHLDX,CLSHLDL,1RORDX,CLROLDL,CLSALDH,1RCLDX,CLRCRDL,13.4.4 字符串处理指令在80X86系列微处理器中有一组指令被称为字符串指令。通过它们可以对存储在存储器连续位置中的一系列运算数进行处理。为了实现对字符串的运算,一些寄存器固定地充当目标操作数和源操作数。在80X86微处理器中,寄存器SI和DI分别指向源操作数和目的操作数。80X86把SI当作数据段寄存器(DS)的偏移地址,而把DI当作附加段(ES)的偏移地址。1.MOVS字符串传送指令格式1:MOVSB执行的操作:(目的操作数)←(源操作数)(源操作数地址)←(源操作数地址)±1(目的操作数地址)←(目的操作数地址)±1格式2:MOVSW执行的操作:(目的操作数)←(源操作数)(源操作数地址)←(源操作数地址)±2(目的操作数地址)←(目的操作数地址)±2字符串指令中,运算数既可以是字节也可以是字。通过指令中最后一个字母B(字节)和字母W(字)来区别。MOVSB是把SI所指定存储单元一个字节的内容传送给DI所指定的存储单元,寄存器SI和DI都会自动加1或减1(这取决于方向标志DF)。MOVSW是把SI所指定存储单元一个字的内容传送给DI所指定的存储单元,寄存器SI和DI都会自动加2或减2。方向标志位:在标志寄存器的第11位(D10)是方向标志位(DF)。运用指令CLD清除方向标志位将会把DF的值设为0,表明字符串指令自动递增指针。STD设置方向标志位将会把DF的值设为1,表明字符串指令自动递减指针。2.REP重复前缀通过重复前缀REP可以让字符串指令重复执行。重复执行的次数存储在CX寄存器中。前缀REP告诉CPU执行字符串指令的同时不断自动地递减寄存器CX的内容。这个过程将不断重复直到CX变为0为止。例:编写程序,将数据段中DATA1中20个字节数据传送到DATA2中。在数据段中:DATA1DB‘ABCDEFGHIJKLMNOPWRST’DATA2DB20DUP(?)在代码段中:MOVAX,@DATAMOVDS,AXMOVES,AXCLDMOVSI,OFFSETDATA1 ;DATA1地址存入SIMOVDI,OFFSETDATA2 ;DATA2地址存入DIMOVCX,20 ;重复次数REPMOVSB3.4.5 控制转移指令在执行指令序列的过程中,经常需要把程序控制转移到一个不同的位置。根据转移到程序存储位置的远近,涉及FAR和NEAR两个概念在跳转和调用指令中的应用。1.FAR和NEAR如果控制权被转移到位于当前代码段内的某一存储位置,就是NEAR的情况,称为段内跳转。如果控制权被转移到位于当前代码段外的存储位置,就是FAR的情况,称为段间跳转。由于CS:IP寄存器总是指向要被执行的下一条指令的地址,所以在执行控制转移指令后它们被更新。在NEAR跳转中,IP被改变而CS保持不变,因为控制权还保留在当前的代码段内。在FAR跳转中,由于控制权被转移到当前代码段以外,所以CS和IP都必须更新为新值。2.JMP无条件转移指令(1) 格式1:JMPSHORT标签短跳转。这种跳转目标位置的地址与当前IP之间的距离处于-128到+127个字节的范围内。在这种情况下,JMP指令汇编成机器代码是EB,操作数介于00到FF之间的1个字节的数。操作数加上当前IP值便得到目标地址。如果是向后(回)跳转,操作数是二进制补码。(2) 格式2:JMP标签段内跳转,这是默认的跳转形式。段内跳转只是在当前段内转移控制。目标地址可以通过下列任何一种寻址方式获得:直接寻址、寄存器寻址、寄存器间接寻址或存储器间接寻址。(3) 格式3:JMPFARPTR标签段间跳转。段间跳转把控制权转移到当前代码段以外的地方,也就是说不仅IP值需要修改,CS值也需要修改。3.条件转移指令条件转移指令是根据上一条指令执行的结果设置标志寄存器的情况,确定是否转移到目标位置。条件转移指令见表3-3。例如:助记符JNZ(非零跳转)是判断标志寄存器零标志位,如果ZF=0,控制权就会被转移到一个新位置,如果不满足程序继续顺序执行。助记符测试的条件跳转的条件备注JA/JNBE(CF=0)and(ZF=0)高于/不低于等于无符号数JAE/JNBCF=0高于等于/不低于无符号数JB/JNAECF=1低于/不高于等于无符号数JBE/JNA(CForZF)=1低于等于/不高于无符号数JCCF=1进位

JE/JZZF=1相等/为零

JG/JNLE((SFxorOF))orZF)=0大于/不小于等于带符号数JGE/JNL(SFxorOF)=0大于等于/不小于带符号数JL/JNGE(SFxorOF)=1小于/不大于等于带符号数JLE/JNG((SFxorOF))orZF)=1小于等于/不大于带符号数JNCCF=0没有进位

JNE/JNZZF=0不相等/不为零

JNOOF=0没有溢出

JNP/JPOPF=0非偶

JNSSF=0无符号

JOOF=1溢出

JP/JPEPF=1为偶

JSSF=1带符号

5.循环指令(1) LOOP循环指令格式:LOOP标签CPU执行LOOP指令时进行两步操作:首先CX寄存器内容自动减1;判断CX中的值,不为零转到标签处执行程序,如果为零则程序继续向下执行。LOOP指令通常用作程序循环,用CX寄存器控制循环次数。例:有一个首地址为ARRAY的M字数组,试编写一个程序求出该数组的内容之和(不考虑溢出),并把结果存入TOTAL中。MOVCX,M ;循环次数MOVAX,0 ;AX清0MOVSI,0 ;SI清0AGAIN:ADDAX,ARRAY[SI] ;累加ADDSI,2 ;修改地址指针LOOPAGAIN ;CX减1,不为零跳到AGAIN处MOVTOTAL,AX ;循环结束保存结果(2) LOOPZ/LOOPE循环指令CPU执行LOOPZ/LOOPE指令与LOOP指令类似:首先CX寄存器内容自动减1;在判断条件上要同时满足两个条件,判断ZF=1并且CX中的值不为零转到标签处执行程序,如果ZF=0或CX为零则程序继续向下执行。(3) LOOPNZ/LOOPNE此指令与LOOPZ/LOOPE指令相同之处:首先CX寄存器内容自动减1;与LOOPZ/LOOPE在判断条件上有所区别:在判断条件上要同时满足两个条件,判断ZF=0并且CX中的值不为零转到标签处执行程序,如果ZF=1或CX为零则程序继续向下执行。6.子程序调用和返回指令子程序结构相当于高级语言中的过程。为便于模块化程序设计,往往把程序中某些具有独立功能的部分编写成独立的程序模块,称为子程序。程序中可由调用程序(或称主程序)调用这些子程序,而在子程序执行完后返回调用程序继续执行。(1) CALL子程序调用指令格式:CALLDST(2) RET返回指令格式:RET在CA

温馨提示

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

评论

0/150

提交评论