• 1.75 MB
  • 2022-04-29 14:37:27 发布

最新微机原理第三章课件PPT课件

  • 175页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'微机原理第三章课件 3.1指令系统的概述及寻址方式一条指令需要指出两部分内容:1、要进行什么操作(由操作码指出)2、指令所涉及的操作数和操作结果存放的位置 1)16位寄存器为AX,BX,CX,DX,SI,DI,SP,BP;2)8位寄存器为AH,AL,BH,BL,CH,CL,DH,DL;3)源操作数,目的操作数都(同时)可以使用寄存器寻址说明: 例:MOVSS,AX指令执行前(AX)=3064H(SS)=1234H指令执行后(SS)=3064H(AX)保持不变 3.存储器寻址方式1)直接寻址方式操作数在存储器中,存储单元的地址由指令直接给出格式:操作码地址表达式或[地址表达式]或[数字表达式]例:MOVAL,TABLEMOVAL,[TABLE]MOVAL,[1000H]TABLE是在数据段定义的一个字节数组的首地址标号(变量名),其偏移地址为1000H 例如:MOVAX,[1000H]指令执行前:(DS)=3000H,(31000)=12H,(31001)=34H3412H指令执行后:(AX)=?31000H31001H12H34HAX 默认的段寄存器位DS,如果不是DS,则需要用前缀说明说明:MOVAX,ES:[1000H]将ES段中1000H和1001H两个单元的内容送到BX中MOVAX,[1000H] 基址寄存器:BX,BP;变址寄存器:SI,DI操作数在存储器中,存储单元的有效地址在寄存器中。2)寄存器间接寻址方式格式:操作码[基址寄存器名或者变址寄存器名]例:MOVAX,[BX]MOVAX,[SI] 例如:MOVAX,[BX]假设指令执行前:(DS)=3000H,(BX)=1010H,(31010)=12H(31011)=24H2412H指令执行后:(AX)=?AX31010H31011H12H24H存储器 若指令中指定的寄存器是BX,SI,DI,则操作数默认在数据段中,即在DS中为段基址;若指令中指出寄存器为BP,则操作数默认在堆栈段,即在SS中为段基址说明: 1)以SI,DI,BX为寄存器间接寻址默认段寄存器为DS如使用其它段寄存器需要加前缀说明MOVAX,ES:[BX] 2)以BP为寄存器间接寻址默认段寄存器为SS如使用其它段寄存器需要加前缀说明MOVAX,ES:[BP] 3)寄存器相对寻址方式操作数在存储器中,存储单元的有效地址是寄存器的值与一个整数之和。格式:操作码变量名[基址寄存器名或者变址寄存器名]操作码[变量名+基址寄存器名或者变址寄存器名]操作码符号名[基址寄存器名或者变址寄存器名]操作码[变量名+基址寄存器名或者变址寄存器名]操作码[数字表达式±基址寄存器名或者变址寄存器名] 例:TABLE是在数据段定义的一个字节数组的首地址标号(也成变量名)则:MOVSI,5MOVAL,TABLE[SI]或者MOVAL,[TABLE+SI] 若指令中指定的寄存器是BX,SI,DI,则操作数默认在数据段中,即在DS中为段基址;若指令中指出寄存器为BP,则操作数默认在附加数据段中,即在ES中为段基址说明: 4)基址变址寻址方式MOVAX,[BX][SI]或MOVAX,[BX+SI]操作数的偏移地址是两个指定寄存器之和格式:操作码[基址寄存器名][变址寄存器名]操作码[基址寄存器名+变址寄存器名] 例:MOVAX,[BX][SI] 用途: 5)相对基址变址寻址方式操作数偏移地址在指定寄存器的值和相对偏移量之和格式:操作码变量名[基址寄存器名][变址寄存器名]操作码[变量名+基址寄存器名+变址寄存器名]-------- MOVAX,MASK[BX][SI]或MOVAX,MASK[BX+SI]或MOVAX,[MASK+BX+SI] 例:MOVAX,MASK[BX][DI] 若指令中指定的基址寄存器是BX,则操作数默认在数据段中,即在DS中为段基址;若指令中指定的基址寄存器为BP,则操作数默认在附加数据段中,即在ES中为段基址说明: 用途: 小结综观8086/8088寻址方式,其操作数有三种类型:立即操作数寄存器操作数存储器操作数 指令寻址有以下四种:1.段内直接寻址2.段间寻址方式3.段内间接寻址4.段间间接寻址确定下一条要执行指令的地址的方法 1.段内直接寻址格式:指令名SHORT转移目标地址标号指令名转移目标地址标号指令名NEARPTR转移目标地址标号JMPSHORTNEXT这种指令只改变IP寄存器的值,而不改变CS的值 位移量指令IP寄存器+IP寄存器段内寻址示意图 2.段间直接寻址格式:指令名FARPTR转移目标地址标号指令名段地址:段内偏移量JMPFARPTRNEXT1这种指令不仅改变IP寄存器的值,而且改变CS的值 地址指令段间寻址示意图段地址IP寄存器CS寄存器 3.段内间接寻址格式:指令名16寄存寄名指令名WORDPTR存储器寻址方式JMPWORDPTRTABLE[BX]这种指令只改变IP寄存器的值,而不改变CS的值 寄存器编号指令段内间接寻址示意图IP寄存器转移目标地址的偏移地址16位寄存器存储器寻址方式指令IP寄存器转移目标地址的偏移地址存储器计算物理地址 4.段间间接寻址格式:指令名DWORDPTR存储器寻址方式JMPDWORDPTRTABLE[BX]这种指令不仅改变IP寄存器的值,而且改变CS的值 段间间接寻址示意图存储器寻址方式指令IP寄存器转移目标地址的偏移地址存储器计算物理地址CS寄存器 3.28086/8088CPU的指令系统3.2.1数据传送指令3.2.2算术运算指令3.2.3逻辑运算和移位指令3.2.4串操作指令3.2.5控制转移指令3.2.6处理器控制指令 3.2.1数据传送指令通用传送指令累加器传送指令地址传送指令标志传送指令 1.通用传送指令1)最基本的传送指令MOV格式:MOV目的操作数源操作数功能:将源操作数存入目的操作数的寄存器或存储单元寄存器内存实现:寄存器寄存器内存/寄存器立即数寄存器段寄存器内存段寄存器 例:MOVAX,BXMOVAX,[1010H] 说明:1、目的操作数不能是立即数2、不能在两个内存单元之间直接传送数据3、不能将立即操作数送给段寄存器4、段寄存器之间不能相互传送数据5、CS,IP,PSW不能作为目的操作数,但可以作为源操作数6、源操作数和目的操作数字长必须相等7、MOV指令不影响标志位 1.MOVMEM2,MEM1修改为:MOVAX,MEM1MOVMEM2,AX2.MOVDS,2000H修改为:MOVAX,2000HMOVDS,AX3.MOVES,DS修改为:MOVAX,DSMOVES,AX例题: 2)数据进栈指令PUSH和出栈指令POP堆栈是一段内存区域,可以用于保护中间数据、运算结果或某些寄存器的值,需要时可以从堆栈中将数据取出来。堆栈按照先进后出的原则来保存数据微机一般把内存的一段区间作为堆栈使用,即堆栈段SS。段内物理地址由SS和SP决定,SP始终指向栈顶。对于数据的的保存和恢复需要有由堆栈指令来完成 格式:PUSH操作数POP操作数 假设(SS)=9000H,堆栈段位64KB(SP)=0E200H则:整个堆栈段的物理地址范围为:90000H~9FFFFH堆栈物理地址为:9E200H举例: PUSHAX;将AX内容压入堆栈 POPBX;将堆顶内容弹出到BX(1)(2) 说明:1、8086的堆栈操作总是按字进行的;2、每推入一个字,SP减2,一个字的高字节放在堆栈的较高地址,低字节放在较低地址;弹出一个字,SP加2;3、堆栈的内容按先进后出的原则;4、不能使用立即寻址方式;5、PUSH和POP指令不影响标志位;6、CS可以压入堆栈,但栈中的值出断点的之外不能弹入到CS 3)标志进栈指令PUSHF和出栈指令POPF将16位堆栈数据压入或弹出到标志寄存器(PSW)中PUSH执行的操作:(SP)(SP)-2((SP)+1,(SP))PSWPOP执行的操作:((SP)+1,(SP))PSW(SP)+2(SP) 设置TF=1则:PUSHFPOPAXORAH,01HPUSHAXPOPF 4)数据交换指令XCHG格式:XCHG目的操作数,源操作数实现:寄存器寄存器,寄存器内存功能:实现源和目的操作数的存放位置 说明:1、目的操作数和源操作数不能为立即数或段寄存器,并且不能同时为内存单元;2、CS和IP不能为交换指令的源或目的操作数;3、目的和源操作数的取值范围应相同,即同为8位或同为16位; XCHGBL,DLXCHGAX,SIXCHG[DI],ALXCHG[BX],[DI]XCHGDS,AX例题:错错 2.累加器专用指令1)累加器输入/输出指令IN,OUT输入指令用于CPU从外设端口接收数据输出指令用于CPU从外设端口发送数据实现:AL8位I/O端口,AX16位I/O端口 端口:端口:CPU与外设之间通过接口进行数据交换,一个端口通常对应接口中的一个或一组寄存器。每个8位端口有一个地址,叫端口号,两个相邻的8位端口可以组成一个16位地址 端口数:外部设备最多可以有65536个(64KB)个由A0~A16译码形成端口号:即外部设备端口地址,为0000~FFFFH。PC机仅使用A0~A9译码形成I/O端口地址,即1024H个端口地址,因此端口号范围为0000H~03FFFH。其中:A9=1表示扩充槽上的端口地址8086利用地址纵向的低16位对8位I/O端口的寻址号 1)直接累加器输入/输出指令IN,OUT格式:IN累加器,端口号OUT端口号,累加器端口号中前256个端口(0~FFH),可以使用直接的输入/输出指令:指令中提供端口号例如:INAL,50HINAX,70HOUT44H,ALOUT80H,AX 2)间接累加器输入/输出指令IN,OUT格式:IN累加器,DXOUTDX,累加器所有的端口号(0~FFFFH),都可以使用间接的输入/输出指令:执行这些指令之前,已经将端口号送入到DX中例如:INAL,DXINAX,DXOUTDX,ALOUTDX,AX注:端口号≧256时只能使用间接输入输出指令 3)XLAT换码指令使累加器的一个值转换为内存表格中对应的某一个值。换码指令用于编码制的转换格式:XLAT或XLAT地址标号功能:(AL)←((BX)+(AL)) 使用该指令前,内存的表首地址赋给BX,AL中存放表格某一项与表格首地址的位移量,执行BX+AL,得到该表格中的一个地址,再将此地址所对应单元中的值送到AL中。AL为8位无符号数,表格最多为256个代码 例题:十进制数字0~9的7段显示码表 例:求5对应的显示码MOVAL,5MOVBX,OFFSETDISP_TABLEXLAT或者XLATDISP_TABLE结果(AL)=12H 3)XLAT换码指令格式:XCHG目的操作数,源操作数实现:寄存器寄存器,寄存器内存功能:实现源和目的操作数的存放位置 3.地址传送指令1)LEA偏移地址送寄存器指令(LoadEffectiveAddress)格式:LEA16位寄存器名,存储器寻址方式功能:将源操作数的地址送到一个寄存器中例如:LEAAX,[2782H]LEABX,[BP+SI]LEASP,[0482H]MOVAX,[2782H](2782H)=02H 2)LDS(LoadPointerintoregisterandDS)指针送指定寄存器和DS寄存器指令格式:LDS16位寄存器名,存储器寻址方式功能:将寻址到的存储单元的第一个源操作数(字)送16位寄存器,第二个源操作数送DS寄存器例如:LDSDI,[2140H]DS:2134HDS:2135HDS:2136HDS:2137H01H02H05H06H(DI)=0201H(DS)=0605H 3)LES(LoadpointerintoregisterandES)指针送指定寄存器和ES寄存器指令格式:LEA16位寄存器名,存储器寻址方式功能:将寻址到的存储单元的第一个与源操作数(字)送16位寄存器,第二个源操作数送ES寄存器例如:LESDI,[2140H]三类地址传送指令中16位寄存器不包括段寄存器说明: DS:2134HDS:2135HDS:2136HDS:2137H01H02H05H06H例如:LESDI,[2140H](DI)=0201H(ES)=0605H 4.标志传送指令读取标志位,对标志位进行设置:1)读取标志指令LAHF2)设置标志指令SAHF格式:LAHF或SAHF功能:将标志寄存器中的低8位传送给AH;将AH值传送给标志寄存器 3.2.2算术运算指令无符号数和有符号数是否能使用同一套加、减、乘、除指令?无符号数和有符号数使用同一套加、减,要求参与运算的两个数必须同为无符号数或同为有符号数;另外,要用不同的方法判断运算结果是否溢出。采用什么方法? 结论:1.无符号数和有符号数加法、减法可以使用同一套指令系统;无符号数有符号数乘法、除法不可以使用同一套指令系统;2.参与运算的必须同是无符号数和有符号数;3.溢出判断:无符号数运算产生溢出时CF=1;有符号数运算产生溢出时:OF=14.无符号数运算产生溢出会设置进位位,对于多字节运算,要利用到进位;有符号数运算产生溢出则表示出现错误 3.2.2算术运算指令1.加法指令格式:ADD目的操作数,源操作数ADC目的操作数,源操作数INC操作数以上三条指令都可作字节或字操作运算,除INC指令不影响标志位CF外,其他标志位都受指令结果的影响PSW中最主要的是ZF,SF,CF,OF四位ADC用于多字节的减法指令中 ADDAL,50HADDCX,1000HADD[BC+DI],AXADDAX,[BX+2000H]ADCAX,SIADDDX,[SI]ADCBX,2000HADCAL,5 例:设两个四字节数(DX,CX)=12345678H,(BX,AX)=9ABCDEF0HADDCX,AXADCDX,BX 例:利用ADC指令实现多字节加法MOVSI,2000HMOVAX,[SI]MOVDI,3000HADDAX,[DI]MOV[SI],AXMOXAX,[SI+2]ADCAX,[DI+2]MOV[SI+2],AXMOVAX,0000HADCAX,0000HMOV[SI+4],AX 2.减法指令格式:SUB目的操作数,源操作数SBB目的操作数,源操作数DEC操作数NEG求补指令求补指令,即各位取反后末位加1,结果送回操作数通常CF=1SBB用于多字节的减法指令中 SUBBX,CXSUB[BP+2],CLSUBAL,20SUBWORDPTR[DI],1000HSBBAX,2030HSUBWORDPTR[DI+2],1000HDECAXDECAL 3.比较指令格式:CMP目的操作数,源操作数结果不送回,两操作数保持原值,但影响标志位不保存结果例如:CMPAX,2000HCMPAL,50HCMPAX,[BX+DI+100]CMPDX,DI 标志位的状态判断比较结果:1.ZF=1,则两个操作数相等2.对于两个无符号数,CF=0,则OPRD1>OPRD2;CF=1,则OPRD1OPRD2;SF=1,则OPRD1OPRD2 4.乘法指令格式:MUL源操作数(无符号数)若为字节操作(AX)←(AL)×源操作数;若为字操作((DX),(AX))←(AX)×源操作数格式:IMUL源操作数(有符号数) IMUL/MULBLIMUL/MULCXIMUL/MULBYTEPTR[DI]IMUL/MULWORDPTR[DI] 注意:1)不允许使用立即数为操作数2)乘法指令只影响CF,OF,若MUL执行后高字节部分为0,则CF=OF=0,否则CF=OF=1,若IMUL执行后高字节是低字节部分的扩展,则CF=OF=0,否则CF=OF=1, 5.除法指令除数为被除数的一半长;被除数放在AX中或AX,DX中;被除数为16位时,8位商放在AL中,8位余数在AH;被除数为32位时,16商放在AX中,16位余数在DX8086规定余数的符号与被除数相同AF,CF,OF,PF,ZF,SF不确定当被除数不够除数的2倍时,应对被除数进行扩展 格式:DIV源操作数(无符号数)若为字节操作(AL)←(AX)/源操作数的商,(AH)←(AX)/源操作数的余数;若为字操作(AX)←((DX),(AX))/源操作数的商,(DX)←((DX),(AX))/源操作数的余数格式:IDIV源操作数(有符号数)DIVCL 5.符号扩展指令例除数为一8位数,被除数位于AL中的值为11000011,则将其扩展为1111111111000011,其高八位置于AH中对于无符号数的除法,被除数的扩展是将AH或DX清0对于有符号数的除法,被除数的扩展是将AH或DX进行低位字节或低位字的符号扩展 格式:CBW字节转化为字(将AL中的值扩展到AX值)格式:CBD字转化为双字(将AX中的值扩展到DX,AX值) 3.2.3逻辑运算和移位指令逻辑运算指令移位指令 TEST与AND指令执行的操作相同,但不改变原操作数的值,也不送回结果,只是根据结果设置相应的标志位。TEST指令一般用来检测测试位是“1”还是“0”1.逻辑运算指令 NOT指令不影响标志位,其它指令会使CF和OF清零,AF不定,并根据一般规则设置SF,ZF,PF逻辑指令功能:逻辑指令主要用于根据源操作数中数据位的组合格式有选择的使目的操作数某些位改变,清零或对它进行测试TEST指令后面可能跟一条JNZ或JZ指令,从而根据Z结果判断进行转移 1)AND逻辑与运算指令格式:AND目的操作数,源操作数例如:ANDAL,00001111B功能:用来完成使某一个操作数清0,而保留其它位不变,即将需清0的位与“0”相与,要保留的位与“1”相与 2)OR逻辑或运算指令格式:OR目的操作数,源操作数例如:ORAL,1000000B功能:用来完成使一个操作数的某些位为1,而保留其它位不变,即将需置1的位与“1”相或,要保留的位与“0”相或 3)XOR异或指令格式:XOR目的操作数,源操作数例如:XORAL,AL实现:完成使某一操作数的某些位取反,而保留其余位不变。即将要取反的威位与“1”异或,保留的位与“0”异或 4)TEST测试指令格式:TSET目的操作数,源操作数实现:两个操作数实行与运算,但测试结果不保存,用来检测某一位或几位的条件是否满足,5)NOT逻辑非格式:NOT目的操作数注意:目的操作数不能是立即数 功能举例:在这些应用中,源操作数称为掩码,这种操作称为屏蔽操作例1:(1)对源操作数01101101的第0、2、4位置001101101AND11101010MOVAL,01101101ANDAL,11101010 例2:(1)对源操作数01101101的第0、1、5位置101101101OR00100011MOVAL,01101101ANDAL,00100011例3:将寄存器AL内容清001101101XOR01101101 例4:检测AL的低0位的值?TESTAL,00000001JNZAA01101101TEST00000001结果为0(ZF=1),则检测位为0结果不为o(ZF≠1),则检测为为1 思考题:1.将英文小写字母转化为大写字母2.判断A单元中数据的奇偶性 例:将英文小写字母转化为大写字母大写英文字母ASCII为:“A”~”Z”→41H-5AH小写英文字母ASCII为:“a”~”z”→61H-7AH41H:0100000161H:01100001MOVAL,"A′ADDAL,20HMOVAL,‘a′ANDAL,0DFHDFH:11011111 例:判断A单元中数据的奇偶性 2.移位指令Right) (1)非循环移位指令01001111SAL10011110 例如:SALDX,1MOVCL,4SALA,CLSALAL,CLSALA,3(无效的)SALAL,BL(无效的) 说明:操作数可以是寄存器或内存单元中的8位或16位操作数逻辑移位指令把操作数看成无符号数算术运算指令把操作数看成有符号数SAL和SHL操作相同,以0填充最低位SAR和SHR的操作不同,SAR最高位保持不变(符号位),SHR以0填充对于移位指令,只有移位次数为1时,OF才有意义,移位后如果CF和最高有效位不同则OF=1,否则为0如果移位次数大于1,必须用CL寄存器预先指定移位次数 左移n位与乘以2n等效,可以使用SHL/SAL指令例如:6×22=00000110B×100B=00011000B同样,右移n位与除以2n等效。如果是无符号数,则右移使用SHR,如果是有符号数则右移使用SAR使用移位指令编辑乘除运算,其执行指令时间比乘除指令快5-6倍 例如:将(AL)乘以10SALAL,1MOVBL,ALMOVCL,2SALAL,CLADDAL,BLAL×21+AL×23 (2)循环移位指令 操作数可以是寄存器或内存单元中的8位或16位操作数ROL和ROR不含CF循环移位指令,8位操作数移动8位后还原RCLRCR含CF循环移位指令,8位操作数移动9次后还原对于循环移位指令,只有移位次数为1时,OF才有意义,移位后如果CF和最高位不同,则OF=1,否则为0如果移位次数大于1,必须用CL寄存器预先指定移位次数说明: 例如:将位于1000H单元中的2位非组合BCD码-转换成组合BCD码MOVCL,4MOVSI,1000HMOVAX,WORDPTR[SI]SHLAL,CL(ROLAL,CL)SHRAX,CL(RORAX,CL)MOV[SI],ALSHRAH,CLSHLAX,CL1000H000010010000100010001001 3.2.4串操作指令用一条指令实现对一个字符串或一个字串进行操作。 (1)字符串送指令(MOVSB/MOVSW)格式:MOVSBMOVSWMOVS目的操作数,源操作数实现:将SI所指向的源串中的一个字节或字传送到DI所指向的目的串中。([DS:SI])→([ES:DI])注意:自动修改SI,DI的地址,以指向下一个或两个单元重复操作MOVSES:BYTEPTR[DI],DS:[SI] 1、可以通过重复前缀(REP)来实现串操作2、串可以是字串或字节串3、以SI作为源操作数的指针寄存器,默认段为DS段,以DI作为目的操作数的指针寄存器,默认为ES段。4、串操作地址的修改和FLAG的DF位有关,DF=0时,SI和DI增量变化;DF=1时,SI和DI减量变化,对于字节串操作SI、DI每次变化量为±1,对于字串操作SI、DI每次变化量为±2 例如:将数据段1000H开始的100个字节传送到扩展段2000H开始的单元MOV[DI],[SI]INCSIINCDI(CX)←(CX)-1当CX=0时退出MOVSB 计数器CX存放传送的字节数或字数带重复前缀REP,则每次传送一次CX自动减1,直到CX为0SI、DI分别为源和目的寄存器方向标志位DF=0,SI、DI自动减量,否则自动增量不影响标志位使用指令前的初始化工作说明: 格式:LODSBLODSWLODS目的操作数,源操作数实现:若字节AL←((DS):(SI))若字AX←((DS):(SI))(2)取字符串指令(LODSB/LODSW)若字节(SI)←(SI)±1(DF=0用“+”)若字(SI)←(SI)±2(DF=0用“+”)不用重复前缀REP 程序举例:将0700H单元开始的5个字节的内容逐一取出,进行处理,处理之后再送回到0700H的内存区域CLDMOVSI,0700HMOVDI,SIMOVCX,5LT:LODSBPUSHCX----POPCXDECCXMOV[DI],ALJNZLISTRING→fbca 格式:STOSBSTOSWSTOS目的操作数(3)存字符串指令(STOSB/SOTSW)实现:若字节((ES):(DI))←AL若字((ES):(DI))←AX可用重复前缀REP,使一串内存单元填充相同的数 CLDLEADI,AREAMOVCX,0080HXORAX,AXREPSTOSB例: (4)字符串比较指令(CMPSB/CMPSW)格式:CMPSB(字节比较指令)CMPSW(字比较指令)CMPS源操操作数寻址,目的操作数寻址实现:将SI所指向的源串中的一个字节或字与DI所指向的目的串中的一个字节或一个字相减,但不保存结果,只是根据结果设置标志位。([DS:SI])-([ES:DI]) 带重复前缀REPE/REPZCX≠0且比较字节相等(ZF=1)时,继续比较带重复前缀REPNE/REPNZCX≠0且比较字节不相等(ZF=0)时,继续比较通过重复前缀REPE/REPZ或REPNE/REPNZ实现两个字符串中寻找第一个不等的元素或第一个相等的元素 程序举例:比较STR1和STR2开头的两个字符串,两个字符串完全相同,则将AL置1,否则置0.字符串长度为3LEADI,STR1LEASI,STR2CLDMOVCX,3REPZCMPSBJZMATCHANDAL,0HLTMATCH:MOVAL,1HLTSTR1→abcSTR2→abc (5)字符串检索指令(SCASB/SCASW)格式:SCASB(字节比较指令)SCASW(字比较指令)SCAS目的操作数AL(AX)-[ES:DI]根据相减结果置标志位 带重复前缀REPE/REPZCX≠0且与AL(AX)内容相等(ZF=1)时,继续检索带重复前缀REPNE/REPNZCX≠0且与AL(AX)的内容不相等(ZF=0)时,继续检索通过重复前缀REPE/REPZ或REPNE/REPNZ寻找第一个与AL(AX)不同或相同的单元 程序举例:试检索AL中字符在STRING字符串中的位置,将该位置记录在BX寄存器中,如果没有检索到则BX置为-1,STRING字符串长度为4LEADI,STRINGCLDMOVCX,4MOVBX,CXREPNZSCASBJZFNDMOVBX,FFFFHHLTFND:SUBBX,CXHLTSTRING→face(AL)=c 3.2.5控制转移指令(1)无条件转移指令段内直接寻址段内间接寻址段间直接寻址段间间接寻址 1.段内直接寻址格式:指令名SHORT转移目标地址标号指令名转移目标地址标号指令名NEARPTR转移目标地址标号JMPSHORTNEXT这种指令只改变IP寄存器的值,而不改变CS的值 位移量指令IP寄存器+IP寄存器段内寻址示意图 2.段间直接寻址格式:指令名FARPTR转移目标地址标号指令名段地址:段内偏移量JMPFARPTRNEXT1这种指令不仅改变IP寄存器的值,而且改变CS的值 地址指令段间寻址示意图段地址IP寄存器CS寄存器 4.段间间接寻址格式:指令名DWORDPTR存储器寻址方式JMPDWORDPTRTABLE[BX]这种指令不仅改变IP寄存器的值,而且改变CS的值 段间间接寻址示意图存储器寻址方式指令IP寄存器转移目标地址的偏移地址存储器计算物理地址CS寄存器 段内直接寻址指令中直接给出了转移的位移量新IP值=当前的IP值+位移量JMP1000H应用于无条件转移和有条件转移、调用转移 1040H新IPJMP1000HIP=1000H+指令字节数+0020H 段内间接寻址有效地址在寄存器或内存单元内例如:JMPCXJMPWORDPTR[1000H]JMP[CX] 寄存器编号指令段内间接寻址示意图IP寄存器转移目标地址的偏移地址16位寄存器存储器寻址方式指令IP寄存器转移目标地址的偏移地址存储器计算物理地址 JMPCX 段间直接寻址指令中给出了要转移的段地址和偏移量,转移时段地址放在CS中,偏移量在IPJMPB000H:0100H JMPB000H:0100H 段间间接寻址有效地址在两个连续的内存单元中,转移时将这两个单元的内容送到CS和IP中JMPDWORDPRT[BX+SI]JMPDWORDPRT[DI] JMPDWORDPRT[SI]假设(SI)=2000H 3.2.5控制转移指令(1)无条件转移指令例如:JMP1000H(JMPNEARPTR转移地址标号)JMPAXJMP2500H:2100H(JMPFARPTR转移地址标号)JMPDWORDPTR[DI] (2)条件转移指令满足指令要求的条件,则执行指定的目标,不满足条件,则执行条件转移指令的下一条指令判断条件:FLAG的CF,SF,OF,PF,ZF位或计数器CX值 说明:条件转移指令只能段内直接寻址方式,而且转移范围为指令所在位置的-128~+127个单元,主要为了减少指令长度提高执行速度大部分指令可以用两种助记符表示:JZ/JE有符号数和无符号数比较的区别:有符号数:大于,小于无符号数:高于,小于 CMPAX,BXJGABC-----ABC: JC(或JNAE或JB)CF=1有进位转移JNC(JAE或JNB)CF=0有进位转移测试CX的值为0转移的指令JCXZ地址标号若CX=0转移 在2000H开始的区域中,存放着14H个无符号数,找出其中最大的一个数并存入2000H单元中2000H→1234566814HGATMAX:MOVBX,2000HMOVAL,[BX]MOVCX,14HP1:INCBXCMPAL,[BX]JAEP2MOVAL,[BX]P2:DECCXJNZP1MOVBX,2000HMOV[BX],AL 测试CX的值为0转移的指令JCXZ地址标号;若CX=0转移可以安排在带条件重复前缀的串指令下面,判断是否到串尾,若到串尾则结束 (3)循环控制指令三种循环控制指令,控制循环是否继续,以CX为计数器,只能使用段内直接转移,位移量只能是8位LOOPLOOPZ/LOOPELOOPNZ/LOOPNE MOVCX,NBEGING:------DECCXJNZBEGING循环体MOVCX,NBEGING:------LOOPBEGING循环体循环可用上面的两条指令实现,也可通过循环指令实现 LOOP标号;CX≠0时循环DECCXJNZ标号相当于:LOOP指令:例子:MOVCX,0100HKKK:LOOPKKK---- LOOPZ/LOOPE指令:LOOPZ/LOOPE标号;CX≠0且ZF=1时循环说明:CX的值并不影响标志位ZF,ZF是否为1,是由前面其它指令决定的 例:在40个元素组成的数组中寻找第一个非0元素MOVCX,28HMOVSI,0FFFFHNEXT:INCSICMPBYREPTR[SI],0LOOPZNEXTJNZOKK;找到CALLDISPLAY1;未找到RETOKK:CALLDISPLAY2RET LOOPNZ指令:LOOPNZ标号;CX≠0且ZF=0时循环说明:CX的值并不影响标志位ZF,ZF是否为0,是由前面其它指令决定的 例:在40个元素组成的数组中寻找第一个0元素MOVCX,28HMOVSI,0FFFFHNEXT:INCSICMPBYREPTR[SI],0LOOPNZNEXTJNZOKK;未找到CALLDISPLAY1;找到RETOKK:CALLDISPLAY2RET (5)处理器控制指令标志位设置指令CLC,STC,CMCCLC清除进位位指令,将CF置0;STC置进位位指令,将CF置1CMC进位位求反指令,如果CF为0,将其置1,若CF为1则将其置0 CLD,STDCLD方向标志位置0指令,将DF置0;STD方向标志位置1指令,将DF置1;CLI,STICLI中断标志位置0指令,将IF置0;STI中断标志位置1指令,将IF置1; 其它处理器控制指令NOP无操作指令HLT停机指令使CPU处于暂停状态,直到出现硬件中断或复位操作时,CPU才会退出暂停状态,转去执行相应的中断处理程序或复位操作常与转移指令连用,不进行任何操作,等待3个机器周期后才执行NOP之后的指令,可用作暂短的软件延时 结束语谢谢大家聆听!!!175'