微机原理课件-第3章指令系统_第1页
 微机原理课件-第3章指令系统_第2页
 微机原理课件-第3章指令系统_第3页
 微机原理课件-第3章指令系统_第4页
 微机原理课件-第3章指令系统_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

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

文档简介

第3章指令系统12№

2

概述

寻址方式

指令系统第3章

指令系统33.1概述3.1.1指令的格式图3-180x86指令的格式43.1概述3.1.2指令的编码格式图3-28086指令的编码格式53.2寻址方式3.2.1指令的寻址方式顺序寻址顺序结构的程序,执行时按照其代码编写顺序(内存存储顺序)执行。CPU根据IP指向的地址取出指令,分析该指令的长度,将IP的值加上指令的长度,形成下一条指令的地址,这种寻找下一条指令的方法称为指令的顺序寻址。转移寻址遇到除顺序结构外的其他结构时,下一条指令的地址本条指令(转移指令,过程调用指令,返回指令等)给出的,本条指令执行时,由CPU将下一条指令的地址传送至CS和IP,实现程序的转移,这种寻找下一条指令地址的方法称为指令的转移寻址。63.2.1操作数的寻址方式1.操作数分类。源操作数在指令中只参与运算,指令执行后源操作数不发生改变。目的操作数在指令中既要参见运算,一般还用于保存运算的结果,指令执行后目的操作数的值通常会发生改变。72.操作数的寻址方式1)立即寻址:操作数存放在指令的地址码字段,即操作数是指令的一部分,操作数存放在存储器的代码段,取指令的同时连同操作数一起取至CPU。操作数可以是8位,16位,存放时高位存放在高地址存储单元,低位存放在低地址存储单元。例:MOVAX,1A2BH82)寄存器寻址(RegisterAddressing)操作数存放在CPU内部的寄存器中,则操作数的寻址方式称为寄存器寻址。可以存放操作数的寄存器包括8位寄存器AL,AH,BL,BH,CL,CH,DL,DH,16位通用寄存器AX,BX,CX,DX,SI,DI,SP,BP或16位段寄存器CS,SS,DS,ES。例:MOVAX,BX93)直接寻址(DirectAddressing)

指令的地址码字段给出的是操作数在存储器中的16位偏移地址,这个偏移地址也被称为有效地址EA(EffectiveAddress)。如果指令前没有加操作数限制前缀,则操作数默认存放在存储器的数据段,操作数的段地址为DS的值,如果指令前有操作数限制前缀,则操作数的段地址由操作数限制前缀中给定的段寄存器确定。这种操作数寻址方式称为直接寻址。10例:MOVAX,[2000H]假设指令执行前(DS)=1000H,(12000H)=12H,(12001H)=34H。源操作数的物理地址1000H×10H+2000H=12000H11例:MOVBX,ES:[1000H]源操作数的物理地址=1200H×10H+1000H=13000H124)寄存器间接寻址(RegisterIndirectAddressing)操作数存放在存储器中,其偏移地址存放在16位寄存器中,可以存放操作数偏移地址的寄存器有4个,BX,BP,SI和DI。当操作数的偏移地址存放于BX,SI或DI寄存器中时,其默认的段为数据段,即段地址是DS的值,当操作数的偏移地址存放在BP中时,其默认的段为堆栈段,即段地址是SS的值。13例:MOV[BX],AX假设(DS)=1000H,(BX)=1100H。目的操作数的物理地址=1000H×10H+1100H=11100H14例:MOV[BP],AX假设(SS)=2000H,(BP)=6100H。目的操作数的偏移地址是6100H,段地址是2000H,物理地址=2000H×10H+6100H=26100H155)寄存器相对寻址方式(RegisterRelativeAddressing)操作数存放在存储器中,操作数的偏移地址是基址寄存器或者变址寄存器的内容加上8位或者16位的位移量。即操作数的有效地址EA=SIDI+8位disp16位dispBXBP16例MOV[BX+100H],AX假设(DS)=1000H,(BX)=1100H,目的操作数采用寄存器相对寻址方式,目的操作数的偏移地址=(BX)+100H=1200H,目的操作数的段地址为DS的内容1000H,目的操作数的物理地址=(DS)×10H+(BX)+100H=11200H17例MOVAX,[BP+100H]假设(SS)=2000H,(BP)=6100H,源操作数采用了寄存器相对寻址方式,源操作数的偏移地址=(BP)+10H=6110H,目的操作数的段地址为SS的内容2000H,目的操作数的物理地址=(SS)×10H+(BP)+100H=26110H186)基址变址寻址(BasedIndexedAddressing)操作数存放在存储器中,操作数的偏移地址是一个基址寄存器的内容和一个变址寄存器的内容之和,即有效地址EA=(SI)(DI)

+(BX)(BP)19例MOVAX,[BX+SI]假设(DS)=1000H,(BX)=1100H,(SI)=1200H,源操作数采用基址变址寻址方式,源操作数的偏移地址=(BX)+(SI)=2300H,源操作数的段地址为DS的内容1000H,源操作数的物理地址=(DS)×10H+(BX)+(SI)=12300H。20例MOV[BP+DI],AX假设(SS)=2000H,(BP)=6100H,(DI)=1300H,目的操作数采用基址变址寻址方式,目的操作数的偏移地址=(BP)+(DI)=7400H,目的操作数的段地址为SS的内容2000H,目的操作数的物理地址=(SS)×10H+(BP)+(DI)=27400H217)相对基址变址寻址操作数存放在存储器中,操作数的偏移地址是一个基址寄存器的内容加一个变址寄存器的内容再加一个8位或16位的位移量形成,即+18位disp8位dispEA=(SI)(DI)

+(BX)(BP)22例MOVAX,[BX+SI+10H]假设(DS)=1000H,(BX)=1100H,(SI)=1200H,源操作数采用相对基址变址寻址方式,源操作数的偏移地址=(BX)+(SI)+10H=2310H,源操作数的段地址为DS的内容1000H,源操作数的物理地址=(DS)×10H+(BX)+(SI)+10H=12310H23例MOV[BP+DI+100H],AX假设(SS)=2000H,(BP)=6100H,(DI)=1300H,目的操作数采用相对基址变址寻址方式,目的操作数的偏移地址=(BP)+(DI)+100H=7500H,目的操作数的段地址为SS的内容2000H,目的操作数的物理地址=(SS)×10H+(BP)+(DI)+100H=27500H24按照操作数存放的位置,操作数可以分为立即数操作数,寄存器操作数和存储器操作数3类。立即数操作数:立即数存放在存储器的代码段,是指令的一部分。立即数操作数只能做为源操作数,不能做为目的操作数。寄存器操作数:寄存器操作数存放在CPU内部的寄存器中,指令执行时无需访问存储器,指令的执行速度快寄存器操作数在指令中既可以作为源操作数,也可以作为目的操作数。存储器操作数:直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址和相对基址变址寻址五种寻址方式对应的操作数为存储器操作数,存储器操作数存放在存储器中,其偏移地址通过寻址方式给出,其段地址在指令中隐含给出或者通过段超越前缀给出。存储器操作数在指令中可以作为源操作数或者目的操作数,但是8086CPU指令中,不允许两个操作数同时为存储器操作数。253.3指令系统3.3.1数据传送指令1.

通用数据传送指令1)基本的传送指令MOV指令一般形式:MOVDST,SRC指令功能:SRCDST(字节或字);26立即数操作数到寄存器的传送注意:MOV指令不能完成立即数到段寄存器的数据传送MOV指令可以实现如下数据传送立即数操作数到存储器的传送将立即数操作数传送到存储器,由于在数据传送过程中没有寄存器,CPU无法确定立即数的大小(字节数据或者字数据),也无法确定存储单元的大小(字节存储单元或者字存储单元),在此类传送中必须指明存储单元的大小。寄存器操作数到寄存器的传送寄存器分为通用寄存器和段寄存器。因此MOV指令可以实现通用寄存器间的数据传送,段寄存器与通用寄存器间的数据传送。注意:MOV指令不能实现段寄存器到段寄存器间的数据传送。27寄存器操与存储器之间的数据传送例:MOVAX,[BX+DI]MOV[BX+1000H],DL存储器操与存储器之间的数据传送注意:存储器与存储器之间的数据传送是不允许的,要实现数据从存储单元到存储单元的传送,必须借助CPU内部的寄存器作为“桥梁”来完成。282)数据交换指令XCHG格式:XCHGOPRD1,OPRD2功能:将操作数OPRD1和OPRD2进行交换,即将操作数OPRD1送至操作数OPRD2,同时将操作数OPRD2送至操作数OPRD1,是一个双向数据传送,可以实现字节数据或字数据的交换。注意:操作数OPRD1和OPRD2不能同时为存储器操作数立即数操作数不能参与交换段寄存器的内容不能参与交换29

30PUSH指令执行前堆栈段PUSH指令执行后堆栈段

31

32出栈指令执行前堆栈段

出栈指令执行后堆栈段

333.地址传送指令1)取有效地址指令LEA格式:LEAREG16,MEM;功能:将源操作数的16位偏移地址传送至目的操作数。指令中要求源操作数必须是存储器操作数,目的操作数必须是一个16位的寄存器操作数。

343)地址指针装入ES指令格式:LESREG16,MEM32功能:将源操作数地址所对应的32位存储器操作数送入到ES和指令中指定的寄存器。32位的存储器操作数是一个逻辑地址,其高字部分为段地址,低字部分为偏移地址,指令执行时将32位存储器操作数的高字(段地址)送入到附加段寄存器ES,低字(偏移地址)送入到目的操作数给出的16位寄存器。例:LESSI,[BX];将BX指向的存储单元中的字数据送入BX,;将(BX)+2指向的存储单元中的字数据送入ES已知(DS)=2000H,(BX)=2000H,存储单元(22000H)=0A0H,(22001H)=10H,(22002H)=00H,(22003H)=18H。指令执行结果:(ES)=1800H,(BX)=10A0H。354.输入输出指令输入输出指令实现的是CPU与I/O端口之间的数据传送。其中输入指令IN是将8位或16位数据从I/O端口传送至累加器(AL或AX),输出指令是将累加器(AL或AX)中的8位或16位数据输出到I/O端口。I/O端口的寻址方式直接寻址:在指令中直接给出I/O端口的地址对I/O端口进行访问。只有部分I/O端口可以直接访问,其地址范围为00H~FFH。间接寻址:在访问I/O端口时,不直接给出I/O端口的地址,而是将I/O端口的地址送入到DX寄存器,通过DX寄存器间接访问I/O端口。所有的I/O端口都可以采用间接寻址方式进行访问。361)输入指令IN格式:INACC,PORTINACC,DX功能:将端口中的8位或16位数据输入至累加器AL或AX,即传送8位数据时累加器用AL,传送16位数据时累加器用AX。例:INAL,80HMOVDX,2100HINAL,DX372)输出指令OUT格式:OUTPORT,ACCOUTDX,ACC功能:将累加器AL或AX中的8位或16位数据输出至I/O端口,即传送8位数据时累加器用AL,传送16位数据时累加器用AX。例:OUT78H,ALMOVDX,183HOUTDX,AL385.标志寄存器传送指令1)标志寄存器装入AH指令LAHF(loadAHwithflags)格式:LAHF功能:将标志寄存器的低8位送入到AH寄存器,不影响标志寄存器中的标志位。2)AH写入标志寄存器指令SAHF(storeAHintoflags)格式:SAHF功能:将AH的数据传送到标志寄存器的低8位,会按照传入的值影响标志寄存器的标志位。393)标志寄存器压入堆栈指令PUSHF(pushtheflags)格式:PUSHF功能:将标志寄存器FLAGS中的内容压入到堆栈,压入堆栈过程参考PUSH指令,不影响标志位。4)标志寄存器出栈指令POPF(poptheflags)格式:POPF功能:将堆栈栈顶的字单元数据弹出到标志寄存器FLAGS,弹出过程参考POP指令,按照弹出到标志寄存器的内容影响标志位。40

413.3.2算术运算指令01110110+0100010110111011指令的执行结果:(AL)=0BBHSF=1ZF=0OF=1PF=1AF=0CF=0

42

43例:已知内存数据区DATA1和DATA2开始的区域存放有5字节数据36E340FA32H和184DA2397EH,要求编程求两个多字节数据的和并保存至DATA1开始的存储器。程序代码如下:MOVCX,5MOVSI,0CLCAGAIN:MOVAL,DATA2[SI]ADCDATA1[SI],ALINCSIDECCX JNZAGAIN44

45

011101101011101100110001指令执行结果:(AL)=31HSF=0ZF=0OF=0PF=0AF=0CF=046

47

48

49例:内存数据段存放了10个带符号数,数据的首地址为DATA1,将数据取绝对值后存入以DATA2为首地址的内存区。程序代码:LEASI,DATA1LEADI,DATA2MOVCX,10CHECK:MOVAL,[SI]CMPAL,0JGEPOSIZERONEGALPOSIZERO:MOV[DI],ALINCSIINCDILOOPCHECKHLT50例:在内存数据段从DATA开始的两个单元分别存放了两个8位无符号数,试比较它们的大小,并将其中较大的数送至数据区1000H单元。LEABX,DATAMOVAL,[BX]INCBXCMPAL,[BX]JNCNEXTMOVAL,[BX]NEXT:MOV[1000H],AL

51

52

53例:MOVAL,87HMOVBL,35HMULBL执行结果:(AX)=1BF3H,CF=OF=1表明乘积AH中包含了有效数字。例:MOVAX,35E3HMOVBX,2487HIMULBX执行结果:(DX)=07B0H,(AX)=56B5H,CF=OF=1,表明DX中包含有效数字,而不仅仅是符号位的扩展。54

55注意:1指令中的源操作数只能是寄存器操作数或者存储器操作数,不能为立即数操作数,当操作数为存储器操作数时,需要规定存储单元的属性。2除法指令对标志位的影响无定义。3除法指令中要求被除数为除数长度的2倍,在使用除法指令进行除法运算时,如果被除数和除数长度相同,需要使用符号扩展指令对被除数的长度进行扩展。4在使用除法运算指令时,必须考虑除法的溢出问题。商超出AL(AX)表示范围时发生溢出。5在执行带符号数除法指令时,余数的符号与被除数相同。56例:MOVAX,87MOVCL,10DIVCL执行结果:(AL)=8(AH)=7例:MOVAX,-87MOVCL,10IDIVCL执行结果:(AL)=0F8H(-8)(AH)=0F9H(-7)575.符号扩展指令字节扩展成字指令CBW(ConvertBytetoWord)格式:CBW;将AL中的数据符号位扩展到AH中,形成字数据(AX)字扩展成双字指令CWD(ConvertWordtoDoubleWord)格式:CWD;将AX中数据的符号位扩展到DX中,形成双字数据(DX:AX)583.3.3逻辑运算与移位指令

59

60

61

62

632.移位类指令(1)一般移位类指令1)逻辑/算术左移指令SHL/SAL(Shiftlogicleft/shiftarithmeticleft)格式:SHL/SALDST,1/CL功能:将目的操作数逻辑左移/算术左移一位或者CL寄存器中指定的位数。逻辑/算术移位指令左移一位时,目的操作数的每一位左移一位,最高位进入进位标志CF,最低位补0。

0CFDST642)逻辑右移指令SHR(shiftlogicalright)格式:SHRDST,1/CL功能:将目的操作数逻辑右移一位或者CL寄存器中指定的位数。逻辑右移一位时,目的操作数的每一位右移一位,最低位进入进位标志CF,最高位补0。653)算术右移指令SAR(shiftarithmeticright)格式:SARDST,1/CL功能:将目的操作数算术右移一位或者CL寄存器中指定的位数。算术右移一位时,目的操作数的每一位右移一位,最低位进入进位标志CF,最高位补原来的最高位。66(2)循环移位指令1)循环左移指令ROL(rotateleft)和循环右移指令ROR(rotateright)循环左移指令格式:ROLDST,1/CL功能:将目的操作数循环左移一位或者左移CL寄存器指定的位数,最高位移至CF,最低位补原来操作数的最高位,目的操作数本身形成一个封闭循环。67循环右移指令格式:RORDST,1/CL功能:将目的操作数循环右移一位或者左移CL寄存器指定的位数,最低位移至CF,最高位补原来操作数的最低位,目的操作数本身形成一个封闭循环。注意:循环移位指令影响标志位CF和OF。当循环左移指令移位位数为一位时,移位完成后目的操作数的最高位和CF相等,则OF=0,否则OF=1。当循环右移指令移位位数为一位时,移位完成后目的操作数的最高位和次高位相等,则OF=0,否则OF=1。CF总是等于最后移入到CF的值。682)带进位循环左移指令RCL(rotateleftthroughcarry)和带进位循环右移指令RCL(rotaterightthroughcarry)带进位循环左移指令RCL格式:RCLDST,1/CL功能:将目的操作数循环左移一位或者左移CL寄存器指定的位数,最高位移至CF,最低位补指令执行前CF的值,目的操作数和CF共同形成一个封闭循环。69带进位循环右移指令RCR格式:RCRDST,1/CL功能:将目的操作数循环右移一位或者左移CL寄存器指定的位数,最低位移至CF,最高位补指令执行前CF的值,目的操作数和CF共同形成一个封闭循环。注意:带进位循环移位指令影响标志位CF和OF。当循环左移指令移位位数为一位时,移位完成后目的操作数的最高位和CF相等,则OF=0,否则OF=1。当循环右移指令移位位数为一位时,移位完成后目的操作数的最高位和次高位相等,则OF=0,否则OF=1。CF总是等于最后移入到CF的值。70例:将存放于DX:AX中32位数乘以8。分析:32位数据的低16位D0~D15存放在AX中,高16位D16~D31存放在DX中a原始数据b处理后数据程序代码:MOVCL,3AGAIN:SALAX,1RCLDX,1DECCXJNZAGAIN713.3.4串操作指令源操作数的偏移地址存放于源变址寄存器SI,其默认的段地址为当前的数据段,即DS的值,允许段超越;目的操作数的偏移地址存放于目的变址寄存器DI,其默认的段地址为当前的附加段,不允许段超越。串操作指令执行后,会根据情况修改地址指针。当DF=0时,按照地址递增的顺序处理数据,每执行一次字节串操作指令,地址指针加1,每执行一次字串操作指令,地址指针加2。

当DF=1时,按照地址递减的顺序处理数据,每执行一次字节串操作指令,地址指针减1,每执行一次字串操作指令,地址指针减2。有些串操作指令前面可以加重复前缀,加入重复前缀的指令将按照规定重复执行。72加入重复前缀REP的串操作指令执行过程如下:1检查CX,若(CX)=0,则退出串操作指令,(CX)≠0,则转入22执行串操作指令3根据DF和操作数据类型(字节或字)修改地址指针4(CX)=(CX)-15转至第一步731.字符串传送指令MOVS(Movestring)格式:MOVSDST_String,SRC_String一般形式:MOVSB;字节串数据传送MOVSW;字串数据传送指令的功能:将DS:SI指向的存储单元中的的一个字节数据或一个字数据传送至ES:DI指定的存储单元,并按照DF的值和指令修改地址SI和DI,字符串传送指令不影响标志位。74例:将内存数据区自2000H开始的20个字节数据,传送至内存数据区自6000H开始的存储区。分析:20个字节数据的传送可以使用字符串传送指令实现,源串的位置由DS:SI确定,目的串的位置由ES:DI确定。程序代码:方法一:MOVAX,DSMOVES,AX;让附加段和数据段重叠MOVSI,2000HMOVDI,6000HCLD;DF=0MOVCX,20;传送的字节数AGAIN:MOVSB;字节串传送DECCX;循环次数减1JNZAGAIN;循环次数不为0,跳至AGAIN75方法二:MOVAX,DSMOVES,AX;让附加段和数据段重叠MOVSI,2000HMOVDI,6000HCLD;DF=0MOVCX,20;传送的字节数REPMOVSB;字节串传送762.字符串比较指令CMPS(Comparestring)格式:CMPSSRC_String,DST_String一般形式:CMPSB;字节串比较CMPSW;字串比较指令功能:将目的字符串和源字符串进行比较,即ES:DI指向的存储单元存放的字节/字数据减DS:SI指向的存储单元存放的字节/字数据,结果不送回目的串,影响标志位,两者相同,ZF=1,两者不同,ZF=0,同时根据DF和处理的串数据类型修改地址指针SI和DI。77例:比较两个长度相等的字符串STR1和STR2是否相等,如果两个字符串相等,将RESULT单元清0,如果两个字符串不相等,则将RESULT单元置1。STR1DB‘COMPUTER’;定义字符串STR1STR2DB‘COMPUTER’;定义字符串STR2RESULTDB?;定义变量RESULT,预留保存结果的存储单元MOVSI,OFFSETSTR1;将字符串STR1的偏移地址送至SIMOVDI,OFFSETSTR2;将字符串STR2的偏移地址送至DIMOVCX,8;将字符串的长度送至CXCLD;将DF清0CHECK:CMPSB;将字符串STR1和STR2对应的字符进行比较JNZNEXT;字符串不相等,跳至NEXTDECCX;循环次数减1JNZCHECK;循环次数不为0,跳至CHECKMOVAL,0JMPOUTPUTNEXT:MOVAL,1OUTPUT:MOVRESULT,AL;将结果送至RESULT单元78方法二:STR1DB‘COMPUTER’;定义字符串STR1STR2DB‘COMPUTER’;定义字符串STR2RESULTDB?;定义变量RESULT,预留保存结果的存储单元MOVSI,OFFSETSTR1;将字符串STR1的偏移地址送至SIMOVDI,OFFSETSTR2;将字符串STR2的偏移地址送至DIMOVCX,8;将字符串的长度送至CXCLD;将DF清0REPECMPSB;将字符串STR1和STR2对应的字符进行比较JNZNEXT;字符串不相等,跳至NEXTMOVAL,0JMPOUTPUTNEXT:MOVAL,1OUTPUT:MOVRESULT,AL;将结果送至RESULT单元793.字符串扫描指令SCANS(Scanstring)格式:SCANSDST_String一般形式:SCANSB;字节串扫描SCANSW;字串扫描指令功能:将目的字符串和累加器(AL或AX)进行比较,即AL或AX中存放的字节/字数据减ES:DI指向的存储单元存放的字节/字数据,按照结果影响标志位,两者相同,ZF=1,两者不同,ZF=0,同时根据DF和处理的串数据类型修改地址指针DI。80例:查找长度为50的字符串STR中是日含有字符’*’,如果有字符’*’,则将字符’Y’送至DL,否则,将字符’N’送至DL。程序代码如下:方法一:MOVDI,OFFSETSTR;字符串首地址送至DIMOVAX,SEGSTRMOVES,AX;字符串段地址送至ESMOVAL,’*’;被搜索的字符送至ALMOVCX,50;字符串长度送至CXCLD;DF=0CHECK:SCASB;字符串扫描JZFIND;找到字符’*’,跳转至FINDDECCX;(CX)-1CXJNZCHECK;字符串没有搜索完,跳至CHECKMOVDL,’N’;没有搜索到’*’,’N’DLJMPOUTPUTFIND:MOVDL,’y’;搜索到’*’,’y’DLOUTPUT:HLT81方法二:MOVDI,OFFSETSTR;字符串首地址送至DIMOVAX,SEGSTRMOVES,AX;字符串段地址送至ESMOVAL,’*’;被搜索的字符送至ALMOVCX,50;字符串长度送至CXCLD;DF=0REPNESCASB;字符串扫描JZFIND;找到字符’*’,跳转至FINDMOVDL,’N’;没有搜索到’*’,’N’DLJMPOUTPUTFIND:MOVDL,’y’;搜索到’*’,’y’DLOUTPUT:HLT824.字符串转入指令LODS(loadfromstring)格式:LODSSRC_String一般形式:LODSB;字节串装入((DS):(SI))ALLODSW;字串装入((DS):(SI))AX指令功能:将(DS):(SI)指向的源串数据装入到累加器AL或AX中,同时根据DF和装入数据的类型修改地址指针SI,不影响标志位。83例:要求将内存数据区1000H开始的10个字数据装入到累加器,求其绝对值后送回到内存数据区1000H开始的存储区。程序代码如下:CLD;DF=0MOVDI,1000H;设置目的存储区地址指针MOVSI,1000H;设置源存储区地址指针MOVCX,10;设置循环次数AGAIN:LODSW;((DS):(SI))AXANDAX,AX;检测累加器中数据是非负数还是负数JNSNNEG;累加器中数据非负转至NNEGNEGAX;负数求绝对值NNEG:MOV[DI],AX;求绝对值后的数据送至目的存储区INCDIINCDI;修改目的存储区地址指针DECCXJNZAGAIN;数据未处理完,跳转至AGAINHLT845.字符串送存指令STOS(Storestring)格式:STOSDST_String一般形式:STOSB;字节串送存AL((ES):(DI))STOSW;字串送存AX((ES):(DI))指令功能:将累加器AL或AX中存放的字节数据或者字数据送至(ES):(DI)指向的存储单元中,同时根据DF和装入数据的类型修改地址指针DI,不影响标志位。例:内存数据区自1000H开始存放了长度未知的字符串,字符串中包含大写字母,小写字母和其他字符,字符串以’$’结束,要求将字符串中的大写字母转换成对应的小写字母后将字符串传送至内存数据区自2000H开始的存储区。85程序代码如下:MOVAX,DSMOVES,AXMOVSI,1000H;设置源数据地址指针MOVDI,2000H;设置目标地址指针CLD;DF=0AGAIN:LODSB;从源串取一个字符送至ALCMPAL,’$’;判断是否是字符串结束字符’$’JZOUTPUT;是字符串结束字符,跳至OUTPUT,程序结束CMPAL,’A’;判断是否为大写字母JBTRANS;不是大写字母,跳转至TRANSCMPAL,’Z’;判断是否为大写字母JATRANS;不是大写字母,跳转至TRANSADDAL,20H;大写字母转换为小写字母TRANS:STOSB;将字符送至目的存储区存储JMPAGAIN;跳转至AGAINOUTPUT:HLT863.3.5控制转移类指令转移指令循环指令子程序调用和返回指令中断指令和中断返回指令871.转移指令(1)无条件转移指令JMP格式:JMPDST功能:程序在不需要满足任何条件的情况下转移到目的操作数指定的地址去执行指令。注意:目的操作数可以是标号,立即数操作数,也可以是寄存器操作数或者存储器操作数。881)段内直接转移转移目标地址在转移指令的操作数部分直接给出,并且转移目标地址和转移指令地址位于同一个逻辑段,称为段内直接转移。A.段内直接短转移格式:JMPSHORTLABEL功能:程序无条件转移到LABEL标号处执行程序。段内直接短转移是指目标指令的地址与转移指令地址之间的相对偏移量范围在-128~127之间,此时目标指令的标号是一个短标号,用关键字SHORT标示。89B.段内直接近转移格式:JMPNEARPTRLABELJMP偏移地址功能:程序无条件转移到LABEL标号处执行程序或者程序转移到指令中给定的偏移地址处执行。段内直接近转移是指目标指令的地址与转移指令地址之间的相对偏移量范围在-32768~32767之间。指令汇编后,计算出目标指令地址和转移指令之间的16位相对偏移量,指令执行时,将当前IP值加上一个16位偏移量形成新的IP值,实现程序的转移。902)段内间接转移格式:JMPREG16JMPMEM16操作数说明:指令中的操作数可以是16位的寄存器操作数(寄存器寻址)或者16位的存储器操作数(除立即寻址和寄存器寻址以外的其他寻址方式)。功能:程序无条件转移到操作数指定的目标地址。913)段间直接转移格式:JMPFARPTRLABElJMP段地址:偏移地址功能:指令无条件转移到LABEL标号处执行,LABEL标号是一个属性为FAR的标号,或者程序转移到指令指定的逻辑地址处执行。执行的操作:将标号的偏移地址送至IP,将标号的的段地址送至CS,或者将指令中给定的偏移地址送至IP,段地址送至CS,使程序的执行顺序发生改变。924)段间间接转移格式:JMPMEM32功能:指令无条件转移到操作数指定的地址执行。执行的操作:指令的操作数是一个32位的存储器操作数,其高字部分为段地址,低字部分为偏移地址,将操作数低字送至IP,将操作数高字送至CS,使程序的执行顺序发生改变。93(2)条件转移指令1)根据两个操作数比较形成的条件转移指令助记符测试条件转移条件备注JA/JNBECF=0且ZF=0高于/不低于等于转移无符号数JAE/JNBCF=0高于等于/不低于转移JB/JNAECF=1低于/不不高于等于转移JBE/JNACF=1或ZF=1低于等于/不高于转移JG/JNLESF+OF=0且ZF=0大于/不小于等于转移带符号数JGE/JNLSF+OF=0大于等于/不小于转移JL/JNGESF+OF=1且ZF=0小于/不大于等于转移JLE/JNGSF+OF=1小于等于/不大于转移942)根据一个标志位形成的条件转移指令助记符测试条件转移条件JZ/JEZF=1结果为0或相等转移JNZ/JNEZF=0结果不为0或不相等转移JCCF=1有进位时转移JNCCF=0无进位时转移JSSF=1结果为负时转移JNSSF=0结果为非负时转移JP/JPEPF=1结果中1的个数为偶数时转移

JNPPF=0结果中1的个数为奇数时转移JOOF=1结果溢出时转移JNOOF=0结果不溢出时转移95例:已知寄存器AX和DX中各存放了一个带符号字数据,现要求将较大的字数据存放在AX中,较小者存放在DX中。 CMPAX,DX JGENEXT MOVBX,AX MOVAX,DX MOVDX,BXNEXT:HLT96例:已知内存数据区自2000H开始存放着10个带符号字节数据,统计其中正数,负数和零的个数,分别放入BL,DL和DH中。 MOVSX,2000H MOVDX,0 MOVBL,0 MOVCX,0CHECK:MOVAL,[SX] JSNEG JZZERO INCBL JMPNEXTNEG: INCDL JMPNEXTZERO: INCDH INCSI DECCX JNZCHECK HLT97指令助记符测试条件指令功能LOOPCX≠0(CX)-1(CX),CX≠0转移到标号LOOPZ/LOOPECX≠0且ZF=1(CX)-1(CX),CX≠0且ZF=1转移到标号LOOPNZ/LOOPNECX≠0且ZF=0(CX)-1(CX),CX≠0且ZF=0转移到标号JCXZCX≠0CX≠0转移到标号2.循环转移指令983.过程调用和返回指令过程调用和返回执行过程示意图991.过程调用指令CALL(CallProcedure)(1)段内直接调用格式:CALLNear_Proc;(SP)-2(SP),(IP)((SP)),(IP)+16disp(IP)功能:调用过程Near_Proc。指令执行过程:指令的操作数是一个近过程,和调用指令CALL在同一个逻辑段。指令经过汇编后,将得到断点与过程入口地址之间的16位位移量16disp,首先将断点偏移地址(即IP的值)压入堆栈,然后将IP加上计算出的16位位移量,实现从主调程序到过程的切换。100(2)段内间接调用格式:CALLREG16/MEM16;(SP)-2(SP),(IP)((SP)),(REG16)/(MEM16)(IP)功能:调用寄存器操作数或者存储器操作数指向的过程。指令执行过程:指令的操作数是一个16位的寄存器操作数或16位的存储器操作数,寄存器或存储器的值是过程的入口地址,过程和调用指令CALL在同一个逻辑段。指令执行时,先将断点偏移地址(即IP的值)压入堆栈,然后将寄存器或者存储器的值传送到IP,实现从主调程序到过程的切换。101(3)段间直接调用格式:CALLFar_Proc

;(SP)-2(SP),(CS)((SP)),SEGFar_Proc(CS)

;(SP)-2(SP)(IP)((SP)),OFFSETFar_Proc

(IP)功能:调用过程Far_Proc。指令执行过程:指令的操作数是一个远过程,和调用指令CALL不在同一个逻辑段。指令执行时,首先将断点段地址(即CS的值)压入堆栈,并将远过程的段地址送入CS,然后将断点偏移地址(即IP的值

温馨提示

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

评论

0/150

提交评论