版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章分支结构(jiégòu)程序设计第一页,共108页。带着问题(wèntí)学习:1.分支(fēnzhī)程序结构有哪几种?2.都有哪些指令可以实现分支(fēnzhī)?3.可以对二进制的某一位操作的指令有哪些?4.系统是如何把程序调入内存执行的?5.菜单程序如何设计?第二页,共108页。学习(xuéxí)要点掌握(zhǎngwò)分支结构程序设计方法掌握(zhǎngwò)与分支有关的转移指令深入分析程序转移的特征第三页,共108页。任务1如何将学生姓名字符串“ZhangSan”变成“ZHANGSAN”?任务2如何计算(jìsuàn)下面函数的值:任务3如何判断某一年是否是闰年?任务4给出一百分制成绩,如何输出相应的‘A’、‘B’、‘C’、‘D’,‘E’等级?第四页,共108页。第六章分支(fēnzhī)结构程序设计6.1分支结构6.2与分支有关(yǒuguān)的指令------控制转移类指令无条件转移类指令条件转移类指令6.2.3与转移地址有关(yǒuguān)的寻址方式6.3分支结构程序设计举例第五页,共108页。任务(rènwu):从键盘输入一个(yīɡè)字符,判断该字符是否是小写字母?如果是小写字母,请把它转换成大写字母输出,否则不转换,原样输出。第六页,共108页。Ch<=‘a’?输入一个字符chCh>=‘z’?显示字符否是否是将字符转换成大写是否是输入一个字符chCh>=‘a’?Ch<=‘z’?显示字符否将字符转换成大写第七页,共108页。movah,0ffh ;选择合适的转移(zhuǎnyí)指令第九十九页,共108页。STACK SEGMENT STACK必须找到它的物理地址,可以使用与存储单元有关的5种寻址方式incsi1.分支(fēnzhī)程序结构有哪几种?⑷不低于等于(高于):JNBE(JA)dwroutine6第二十九页,共108页。msg2 db0ah,0dh,'output:$'JMPTable[BX] ;利用地址表实现多路转移cmpax,bx ;movah,0ffh ;第六十二页,共108页。无符号数的大小用高(Above)低(Below)表示(AL)<0, ′-′→DL;
MOVAH,01H INT21H
CMPAL,’a’
JBDISPLAY
CMPAL,’z’
JADISPLAY SUBAL,20HDISPLAY: MOVDL,AL MOVAH,02H INT21HCh<=‘a’?输入一个字符chCh>=‘z’?显示字符否是否是将字符转换成大写第八页,共108页。1.两路分支(fēnzhī)结构2.多级分支(fēnzhī)结构3.多路分支(fēnzhī)结构图示图示图示分支(fēnzhī)结构种类6.1分支(fēnzhī)结构需要满足一定的条件,才能实现分支转移!第九页,共108页。返回(fǎnhuí)第十页,共108页。返回(fǎnhuí)第十一页,共108页。返回(fǎnhuí)第十二页,共108页。6.2控制转移(zhuǎnyí)类指令控制转移类指令用于实现分支(fēnzhī)、循环、过程等程序结构,是仅次于传送指令的最常用指令控制转移类指令通过改变IP(和CS)值,实现(shíxiàn)程序执行顺序的改变第十三页,共108页。控制转移(zhuǎnyí)类指令无条件(tiáojiàn)转移指令JMP条件(tiáojiàn)转移指令JZ/JNZ、JE/JNE、JS/JNS、JO/JNO、JP/JNP、JB/JNB、JL/JNL、JBE/JNBE、JLE/JNLE、JCXZ循环指令LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE子程序调用和返回指令CALL、RET中断与中断返回指令INT、INTO、IRET第十四页,共108页。6.2.1无条件转移(zhuǎnyí)指令只要执行无条件转移指令(zhǐlìng)JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令(zhǐlìng)操作数label是要转移到的目标地址(目的地址、转移地址)JMP指令(zhǐlìng)分成4种类型:⑴段内转移、直接寻址⑵段内转移、间接寻址⑶段间转移、直接寻址⑷段间转移、间接寻址JMPlabel ;程序转向(zhuǎnxiàng)label标号指定的地址JMP第十五页,共108页。用来确定转移(zhuǎnyí)指令及CALL指令的转向地址。与转移(zhuǎnyí)地址有关的寻址方式:段内寻址段内直接(zhíjiē)寻址JMPNEARPTRNEXT段内间接寻址JMPTABLE[BX]段间寻址段间直接(zhíjiē)寻址JMPFARPTRNEXT段间间接寻址JMPDWORDPTR[BX]第十六页,共108页。目标(mùbiāo)地址的寻址方式直接寻址方式转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式间接(jiànjiē)寻址方式转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接(jiànjiē)寻址方式用标号(biāohào)表达用寄存器或存储器操作数表达第十七页,共108页。目标(mùbiāo)地址的范围:段内段内转移——近转移(near)在当前代码段64KB范围内转移(±32KB范围)不需要更改CS段地址,只要改变IP偏移地址段内转移——短转移(short)转移范围可以用一个(yīɡè)字节表达,在段内-128~+127范围的转移代码段代码段第十八页,共108页。目标(mùbiāo)地址的范围:段间段间转移——远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围需要更改CS段地址和IP偏移地址目标地址必须用一个32位数表达(biǎodá),叫做32位远指针,它就是逻辑地址代码段代码段实际编程时,汇编程序会根据目标地址的距离,自动处理(chǔlǐ)成短转移、近转移或远转移程序员可用操作符short、nearptr或farptr强制第十九页,共108页。段内转移(zhuǎnyí)、直接寻址JMPlabel ;IP←IP+位移量位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负 jmpagain ;转移到again处继续执行 ……again: deccx ;标号(biāohào)again的指令 …… jmpoutput ;转向output ……output: movresult,al ;标号(biāohào)output的指令实际(shíjì)为相对寻址第二十页,共108页。(1)段内直接(zhíjiē)寻址转向的有效地址=当前(dāngqián)(IP)+位移量(8bit/16bit)第二十一页,共108页。例:JMPNEARPTRNEXT近转移(zhuǎnyí)-32768~+32767
JMPSHORTNEXT短转移(zhuǎnyí)-128~+127第二十二页,共108页。段内转移(zhuǎnyí)、间接寻址JMPr16/m16 ;IP←r16/m16将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针(zhǐzhēn),但不修改CS寄存器的内容jmpax ;IP←AXjmpwordptr[2000h] ;IP←[2000h] 第二十三页,共108页。(2)段内间接寻址转向的有效地址是一个寄存器或存储单元的内容。(可用除立即数以外的任何一种(yīzhǒnɡ)数据寻址方式得到)例:(BX)=1256H(SI)=528EHTABLE=20A2H(DS)=2000H(232F8H)=3280H(264E4H)=2450H
JMPBX;(IP)=1256H
JMPTABLE[BX]JMPWORDPTRTABLE[BX];(IP)=3280H
JMP[BX][SI]JMPWORDPTR[BX][SI];(IP)=2450H第二十四页,共108页。段间转移(zhuǎnyí)、直接寻址JMPfarptrlabel ;IP←label的偏移地址 ;CS←label的段地址将标号(biāohào)所在段的段地址作为新的CS值,标号(biāohào)在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行jmpfarptrotherseg ;远转移到代码段2的otherseg第二十五页,共108页。code1segment……jmpfarptrnext……code1endscode2segment……next:…...……code2ends(3)段间直接寻址用指令中提供的转向段地址(dìzhǐ)和偏移地址(dìzhǐ)取代CS和IP。
例:第二十六页,共108页。段间转移(zhuǎnyí)、间接寻址JMPfarptrmem ;IP←[mem],CS←[mem+2]用一个双字存储单元表示要跳转的目标地址。这个(zhège)目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器movwordptr[bx],0movwordptr[bx+2],1500hJMPfarptr[bx];转移到1500h:0第二十七页,共108页。(4)段间间接寻址用存储器中的两个相继(xiāngjì)字的内容取代CS和IP。(存储单元的地址可用除立即数和寄存器以外的任何一种数据寻址方式得到)例:JMPDWORDPTR[INTERS+BX]第二十八页,共108页。无条件转移(zhuǎnyí)指令段内直接短转移:JMPSHORTOPR执行(zhíxíng)操作:(IP)←(IP)+8位位移量段内直接近转移:JMPNEARPTROPR执行(zhíxíng)操作:(IP)←(IP)+16位位移量段内间接转移:JMPWORDPTROPR执行(zhíxíng)操作:(IP)←(EA)第二十九页,共108页。无条件转移(zhuǎnyí)指令段间直接远转移JMPFARPTROPR执行操作:(IP)←OPR的段内偏移地址(CS)←OPR所在(suǒzài)段的段地址段间间接转移:JMPDWORDPTROPR执行操作:(IP)←(EA)(CS)←(EA+2)第三十页,共108页。6.2.2条件(tiáojiàn)转移指令指定的条件cc如果成立,程序(chéngxù)转移到由标号label指定的目标地址去执行指令;条件不成立,则程序(chéngxù)将顺序执行下一条指令操作数label是采用短转移,称为相对寻址方式JccJcclabel;条件(tiáojiàn)满足,发生转移:IP←IP+8位位移量;条件(tiáojiàn)不满足,顺序执行第三十一页,共108页。相对(xiāngduì)寻址方式Jcc指令的操作数label是一个标号一个8位位移量,表示Jcc指令后的那条指令的偏移地址(dìzhǐ),到目标指令的偏移地址(dìzhǐ)的地址(dìzhǐ)位移8位位移量是相对于当前IP的,且距当前IP地址(dìzhǐ)-128~+127个单元的范围之内,属于段内短距离转移Jcc目标地址(dìzhǐ)就采用这种相对寻址方式Jcc指令为2个字节,条件不满足时的顺序执行就是当前指令偏移指针IP加2Jcc第三十二页,共108页。Jcc指令(zhǐlìng)的分类Jcc指令不影响标志,但要利用标志(表)。根据利用的标志位不同,16条指令分成3种情况:1.判断单个标志位状态2.比较无符号(fúhào)数高低3.比较有符号(fúhào)数大小Jcc第三十三页,共108页。(1)根据单个条件标志的设置情况转移
格式测试条件JZ(JE)OPRZF=1JNZ(JNE)OPRZF=0JSOPRSF=1JNSOPRSF=0JOOPROF=1JNOOPROF=0JPOPRPF=1JNPOPRPF=0JCOPRCF=1JNCOPRCF=0条件转移指令(zhǐlìng):(只能使用段内直接寻址的8位位移量)第三十四页,共108页。
(2)比较两个(liǎnɡɡè)无符号数,并根据比较结果转移*格式测试条件<JB(JNAE,JC)OPRCF=1>=JNB(JAE,JNC)OPRCF=0<=JBE(JNA)OPRCF∨ZF=1>JNBE(JA)OPRCF∨ZF=0*适用(shìyòng)于地址或双精度数低位字的比较第三十五页,共108页。(3)比较两个带符号数,并根据比较结果转移*
格式测试(cèshì)条件<JL(JNGE)OPRSFOF=1>=JNL(JGE)OPRSFOF=0<=JLE(JNG)OPR(SFOF)∨ZF=1>JNLE(JG)OPR(SFOF)∨ZF=0适用于带符号数的比较(4)测试(cèshì)CX的值,为0则转移
格式测试(cèshì)条件JCXZOPR(CX)=0第三十六页,共108页。条件转移(zhuǎnyí)指令中的条件ccJcc实际虽然指令只有16条,但却有30个助记符采用多个助记符,只是为了方便(fāngbiàn)记忆和使用第三十七页,共108页。1.判断(pànduàn)单个标志位状态这组指令单独判断5个状态标志之一⑴JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)⑵JS和JNS:利用符号标志SF,判断结果是正是负⑶JO和JNO:利用溢出标志OF,判断结果是否产生溢出⑷JP/JPE和JNP/JPO:利用奇偶(qíǒu)标志PF,判断结果中“1”的个数是偶是奇⑸JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位Jcc例题(lìtí)例题例题例题例题第三十八页,共108页。例:JZ/JNZ指令(zhǐlìng) testal,80h ;测试最高位 jznext0 ;D7=0(ZF=1),转移 movah,0ffh ;D7=1,顺序(shùnxù)执行 jmpdone ;无条件转向next0: movah,0done: ... testal,80h ;测试最高位 jnznext1 ;D7=1(ZF=0),转移 movah,0 ;D7=0,顺序(shùnxù)执行 jmpdone ;无条件转向next1: movah,0ffhdone: ...第三十九页,共108页。例:JS/JNS指令(zhǐlìng);计算(jìsuàn)|X-Y|(绝对值);X和Y为存放于X单元和Y单元的16位操作数;结果存入result movax,X subax,Y jnsnonneg negax ;neg是求补指令nonneg: movresult,ax第四十页,共108页。例:JO/JNO指令(zhǐlìng);计算X-Y;;X和Y为存放(cúnfàng)于X单元和Y单元的16位操作数;若溢出,则转移到overflow处理 movax,X subax,Y jooverflow ... ;无溢出,结果正确overflow: ... ;有溢出处理第四十一页,共108页。例:JP/JNP指令(zhǐlìng);设字符的ASCII码在AL寄存器中;将字符加上奇校验位;在字符ASCII码中为“1”的个数已为奇数时;则令其最高位为“0”;否则(fǒuzé)令最高位为“1” andal,7fh ;最高位置“0”,同时判断“1”的个数 jnpnext ;个数已为奇数,则转向next oral,80h ;否则(fǒuzé),最高位置“1”next: ...第四十二页,共108页。例:JC/JNC指令(zhǐlìng);记录(jìlù)BX中1的个数 xoral,al ;AL=0,CF=0again: testbx,0ffffh;等价于cmpbx,0 jenext shlbx,1 jncagain incal jmpagainnext: ... ;AL保存1的个数另一种(yīzhǒnɡ)做法第四十三页,共108页。记录(jìlù)BX中“1”的个数 xoral,al ;AL=0,CF=0again: cmpbx,0 jznext shlbx,1 ;也可使用(shǐyòng)shrbx,1 adcal,0 jmpagainnext: ... ;AL保存1的个数第四十四页,共108页。2.比较无符号(fúhào)数高低无符号数的大小用高(Above)低(Below)表示利用CF确定高低(gāodī)、利用ZF标志确定相等(Equal)两数的高低(gāodī)分成4种关系:⑴低于(不高于等于):JB(JNAE)⑵不低于(高于等于):JNB(JAE)⑶低于等于(不高于):JBE(JNA)⑷不低于等于(高于):JNBE(JA)Jcc第四十五页,共108页。例:比较(bǐjiào)无符号数 cmpax,bx ;比较ax和bx jnbnext ;若ax≥bx,转移(zhuǎnyí) xchgax,bx ;若ax<bx,交换next: ...结果:AX保存(bǎocún)较大的无符号数第四十六页,共108页。3.比较有符号(fúhào)数大小有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定(quèdìng)相等(Equal)两数的大小分成4种关系:⑴小于(不大于等于):JL(JNGE)⑵不小于(大于等于):JNL(JGE)⑶小于等于(不大于):JLE(JNG)⑷不小于等于(大于):JNLE(JG)Jcc第四十七页,共108页。例:比较(bǐjiào)有符号数 cmpax,bx ;比较(bǐjiào)ax和bx jnlnext ;若ax≥bx,转移 xchgax,bx ;若ax<bx,交换next: ...结果:AX保存较大(jiàodà)的有符号数第四十八页,共108页。JCXZ指令(zhǐlìng)JCXZlabel ;CX=0,转移(zhuǎnyí)到标号label第四十九页,共108页。例6.8:记录(jìlù)空格个数 movcx,count ;设置循环次数 movsi,offsetstring xorbx,bx ;bx=0,记录空格数 jcxzdone moval,20h ;如果长度为0,退出again: cmpal,es:[si] jnznext ;ZF=0非空格,转移 incbx ;ZF=1是空格,个数加1next: incsi loopagain ;字符(zìfú)个数减1,不为0继续循环deccxjnzagaincmpcx,0jznext第五十页,共108页。例6-9:如果(rúguǒ)X>50,转到TOO_HIGH;计算X-Y,如果(rúguǒ)溢出转到OVERFLOW,否则|X-Y|→RESULT JGJOJNS
MOVAX,XCMPAX,50
TOO_HIGHSUBAX,Y
OVERFLOW
NONNEGNEGAXNONNEG:MOVRESULT,AXTOO_HIGH:……OVERFLOW:……第五十一页,共108页。例6-10:、是双精度数,分别(fēnbié)存于DX,AX及BX,CX中,>时转L1,否则转L2
CMPDX,BX
JG
L1
JL
L2CMPAX,CX
JA
L1L2:
……L1:
……第五十二页,共108页。单分支程序设计(chénɡxùshèjì)方法根据条件标志位或结果实现(shíxiàn)分支转移,否则按指令顺序继续执行if(flag==1)转移;JZ/JC/JS/JO/JP/JBIf(flag==0)转移;JNZ/JNC/JNS/JNO/JNP/JNB条件是否(shìfǒu)满足?否是目的程序段共有程序段第五十三页,共108页。双分支程序设计(chénɡxùshèjì)方法如果(条件满足)则执行程序段1,否则执行程序段2注意程序段1和程序段2的位置(wèizhi)注意程序段的出口条件(tiáojiàn)是否满足执行程序段1执行程序段2否是共有程序段跳转!第五十四页,共108页。例6-1从键盘输入一个(yīɡè)小写字母,将其换成大写字母,输出如果任务1中允许用户多次测试字符,如何修改?从键盘任意输入一个(yīɡè)字符,判断该字符是否是小写字母?如果是小写字母,请把它转换成大写字母输出,否则不转换,原样输出。第五十五页,共108页。 MOVAH,01H ;完成单个字符(zìfú)输入 INT21HBEGIN:程序运行能结束(jiéshù)吗?CMPAL,1BHJZEXIT CMPAL,’a’;判断字符是否为小写字母? JBDISPLAY CMPAL,’z’ JADISPLAY SUBAL,20H;完成小写字母转换成大写DISPLAY: MOVDL,AL ;完成单个字符的显示输出 MOVAH,02H INT21H JMPBEGIN MOVAH,4CH;程序(chéngxù)返回 INT21HEXIT:第五十六页,共108页。分支程序(chéngxù)实例例6-11设A、B、C三个单元存放着三个数,若三个数都不为0,则求三数之和放在D单元内,若其中有一个为0,则将另外两个也清0。分析:此题为判断(pànduàn)A、B、C三个数是否为0的分支程序。存贮单元的分配,题目已告诉,变量名分别为A、B、C、D,都为字变量。第五十七页,共108页。STACK SEGMENT STACK DB200DUP(0)STACK ENDSDATA SEGMENTA DWaB DWbC DWcD DW?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN: MOVAX,DATA MOVDS,AX CMPA,0 JZL1 CMPB,0 JZL1 CMPC,0 JZL1 MOVAX,A ADDAX,B ADDAX,C MOVD,AXEXIT: MOVAH,4CH INT21HL1: MOVA,0 MOVB,0 MOVC,0 JMPEXITCODE ENDS ENDBEGINNYYNYNa=0?b=0?c=0?a+b+c→Da、b、c清0开始结束第五十八页,共108页。分支程序(chéngxù)实例例6-12设计分支程序,实现下列公式计算。假设X数组中保存三个16位带符号数:9,-6,34,根据它们不同(bùtónɡ)的值,分别进行函数值Y的计算,存入Y数组中。
第五十九页,共108页。设计(shèjì)思路:在数据段中定义数组X、Y,均为带符号数;在X单元中分别取出三个数据作判断,根据(gēnjù)X的大小作分支转移;采用寄存器相对寻址方式(MOVAX,X[SI])分别取出X的三个值;标号OUT1是各路分支的公共出口。第六十页,共108页。程序框图:第六十一页,共108页。程序(chéngxù)如下:;6-11.asm用正常程序格式编写分支程序DATASEGMENTXDW 9,-6,34YDW 3dup(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVCX,3 ;循环三次 MOVSI,0 LET0: MOVAX,X[SI] ;取出X CMPAX,0 ;X≥0? JGELET1 ;是,转到let1 MOVBX,AX ;否,计算(jìsuàn)X*X IMULBX JMPOUT ;跳到公共出口out1第六十二页,共108页。LET1: CMPAX,10 ;X≥10? JGELET2 ;是,转到let2 SALAX,1 ;否,计算2X+3 ADDAX,3 JMPOUT ;跳到公共出口out1LET2: MOVBL,6 ;计算X/6 IDIVBL ;商在al,余数在ahOUT: MOVY[SI],AX ;保存Y ADDSI,2 DECCX ;CX-1 CMPCX,0 JNZLET0 ;CX≠0转移(zhuǎnyí)到let0 MOVAH,4CH ;CX=0,程序结束 INT21HCODEENDSENDSTART返回(fǎnhuí)第六十三页,共108页。运行结果(jiēguǒ):在DOS下执行程序后又返回到DOS,没有显示。要观察运行结果(jiēguǒ),采用DEBUG执行。在DEBUG下,用U命令查看,找到断点0039,用G0039执行,再用D命令查看结果(jiēguǒ)。第六十四页,共108页。设计思路:(1)用TEST测试指令来区分数字(shùzì)和字母:数字(shùzì)的ASCII码: 30H~39H 00110000B~00111001B大写字母的ASCII码: 41H~5AH 01000001B~01011010B小写字母的ASCII码: 61H~7AH 01100001B~01111010B例6-12从键盘输入一串字符,如果是数字存入(cúnrù)NUMB单元,如果是字母,将大写字母存入(cúnrù)CAPI单元,小写字母存入(cúnrù)LETT单元,分别统计个数,输入回车时退出。第六十五页,共108页。数字和字母的第6位不同。因此(yīncǐ),区别数字和字母用TESTAL,40H:第6位为0是数字,第6位为1则为字母。大小写字母为第5位不同。区别大小写字母用TESTAL,20H:第5位为0是大写字母,第5位为1则为小写字母。用CMP指令排除其它字符;数字、大写字母、小写字母的个数分别放在DI、SI、BX中。第六十六页,共108页。程序(chéngxù)如下:datasegment numb db10dup(?) capi db10dup(?) lett db10dup(?)dataendscodesegment assumecs:code,ds:datastart: movax,data movds,axlet0: movah,1 ;键盘输入 int21h cmpal,0dh ;回车? jzexit ;是,转EXIT testal,40h ;区分(qūfēn)数字和字母 jzdigit ;排除字母,可能是数字,转digit testal,20h ;区分(qūfēn)大小写字母 jzchar1 ;是大写,转CHAR1 movlett[bx],al incbx ;小写个数加1 jmplet0第六十七页,共108页。char1:cmpal,5ah ;排除大小写之间的字符 jaexit movcapi[si],al incsi ;大写个数加1 jmplet0digit: cmpal,'0' ;排除其它(qítā)字符 jbexit cmpal,'9' jaexit movnumb[di],al;是数字 incdi ;数字个数加1 jmplet0exit:movah,4ch int21hcodeendsendstart第六十八页,共108页。运行结果(jiēguǒ):在DEBUG下执行:第六十九页,共108页。多分支(fēnzhī)程序设计方法方法1设计多路分支,通过(tōngguò)条件控制在程序中直接使用控制转移指令实现多分支跳转方法2组建分支表,实现各分支跳转 2-1建立转移地址表 2-2建立转移指令表方法3设计逻辑尺第七十页,共108页。菜单(càidān)程序设计例6-13设计菜单程序。实现三个功能: 1、小写字母转换(zhuǎnhuàn)为大写 2、计算立方值 3、退出设计思路:(1)在数据段中定义菜单。每行换行显示;(2)用9号功能显示菜单;(3)根据输入选择执行某段程序。第七十一页,共108页。运行(yùnxíng)结果:第七十二页,共108页。datasegmentmsg0 db0ah,0dh,'1.inputstring' db0ah,0dh,'2.calculatecube' db0ah,0dh,'3.exit' db0ah,0dh,'select:$'msg1 db0ah,0dh,'input:$'msg2 db0ah,0dh,'output:$'buff db10,?,10dup(?)x db?,?,?dataends程序(chéngxù)如下:第七十三页,共108页。codesegmentassumecs:code,ds:datastart:movax,datamovds,axlet0:movdx,offsetmsg0 ;显示菜单movah,9int21hmovah,1 ;输入选择int21hcmpal,'1'jeprog1cmpal,'2'jeprog2jmpprog3 ;按其它(qítā)键均退出第七十四页,共108页。prog1: ;菜单1 ;6-1.asm程序部分 ;输入英文单词,将小写字母转换为大写 ;…… jmplet0 ;返回(fǎnhuí)主菜单prog2: ;菜单2 ;6-2.asm程序部分 ;计算0-9立方值 ;…… jmplet0 ;返回(fǎnhuí)主菜单prog3: ;菜单3.退出 movah,4ch int21hcodeendsendstart设计多路分支完成,用控制转移(zhuǎnyí)类指令实现跳转!方法(fāngfǎ)1第七十五页,共108页。
方法2用分支表实现(shíxiàn)多路转移
所谓分支表是在数据段中建立一个表,表中存放要转移的程序段的名字(标号),也就是(jiùshì)偏移地址,称之为分支表。在程序中访问这个分支表,取得程序段名字,就可以转移到相应的标号去执行。例6-12用分支表设计多路分支
1.计算并显示(xiǎnshì)z=x+y,
2.将输入的字母改变大小写,
0.退出
第七十六页,共108页。用分支表设计多路分支
方法2-1(建立转移(zhuǎnyí)地址表)1.计算并显示z=x+y,
2.将输入的字母改变大小写,
0.退出
设计思路:在数据段中建立分支表TABLE,保存分支转移的标号(biāohào)根据键盘输入的0~2,计算分支标号(biāohào)在TABLE表中的地址采用JMPTABLE[BX],实现多路转移。第七十七页,共108页。数据(shùjù)段定义DATASEGMENTTABLEDWprog0,prog1,prog2,prog0 ;分支(fēnzhī)表MESS1DB0ah,0dh,'input0-2:$'MESS2DB0ah,0dh,'z=x+y=$'XDB3YDB6ZDB?DATAENDS第七十八页,共108页。codesegmentassumecs:code,ds:datastart: movax,data movds,axlet0: movdx,offsetmess1 ;显示(xiǎnshì)输入信息 movah,9 int21h movah,1 int21h andal,03h movah,0 shlax,1 ;计算分支表地址 movbx,ax jmptable[bx] ;按分支表转移 ;table[bx]IP
JMPTABLE[BX][SI]注意:此程序输入1~2,将走向相应(xiāngyīng)的分支;输入0或3,将走prog0;若输入4~9,则走向余4后相应(xiāngyīng)的分支。比如输入5,则走向prog1分支。第七十九页,共108页。prog1: movdx,offsetmess2 ;显示输出信息 movah,9 int21h moval,x addal,y movz,al ;z=x+y addal,30h movdl,al movah,2 int21h jmplet0prog2: movdl,0ah ;光标(ɡuānɡbiāo)在下一行 movah,2 int21h movah,1 int21h testal,20h jztransfer ;是大写转 andal,0dfh ;小写变为大写 jmpdisplaytransfer: oral,20h;大写(dàxiě)变为小写display: movdl,al movah,2 int21h jmplet0prog0: movah,4ch int21hcodeendsendstart第八十页,共108页。例6.14用地址转移表实现下列C语言的switch语句,其中(qízhōng):变量A和B是有符号的整型(int)变量。switch(a%8) { case0:b=32;break;case1:case2: b=a+43;break;case3:b=2*a;break;case4:b--;break;case5:case6:case7:printf(“Function5_6_7”);break;}第八十一页,共108页。数据(shùjù)段定义DATA1SEGMENT…A DW
13B DW
?TableDW
case0,case12,case12,case3,case4,case567,case567,case567
MSG DB
'Function5_6_7$'…DATA1ENDS
DS:00000D00
DS:0002?
?TABLEDS:000430113611DS:00083611DS:000A42case311DS:000C4Acase411DS:000E4Ecase567114Ecase567114Ecase56711ABcase0case12BXcase12第八十二页,共108页。CODE1SEGMENT … MOVAX,A MOVBX,AX ANDBX,7 ;得到BX的低三位,实现a%8的计算 SHLBX,1 ;由于地址表是字类型(lèixíng),其下标要乘2 JMPTable[BX] ;利用地址表实现多路转移case0:MOVB,32D JMPnextcase12:ADDAX,43D MOVB,AX JMPnextcase3:SHLAX,1 MOVB,AX JMPnextcase4:DECB JMPnextcase567:LEADX,MSG MOVAH,9 INT21H JMPnextnext: …CODE1ENDSswitch(a%8){case0:b=32;break;case1:case2: b=a+43;break;case3:b=2*a;break;case4:b--;break;case5:case6:case7:printf(“Function5_6_7”);break;}DATA1SEGMENT…A DW
13B DW
?TableDW
case0,case12,case12,case3 DW
case4,case567,case567,case567
MSG DB
'Function5_6_7$'…DATA1ENDS用地址表实现(shíxiàn)多路转移的关键在于:转移入口的地址表和转移情况可整数化。需要掌握转移地址所在的存储单元EA的计算!第八十三页,共108页。CODE1SEGMENT … MOVAX,A MOVBX,AX ANDBX,7 ;得到BX的低三位,实现a%8的计算(jìsuàn) SHLBX,1 ;由于地址表是字类型,其下标要乘2 JMPTable[BX] ;利用地址表实现多路转移case0:MOVB,32D JMPnextcase12:ADDAX,43D MOVB,AX JMPnextcase3:SHLAX,1 MOVB,AX JMPnextcase4:DECB JMPnextcase567:LEADX,MSG MOVAH,9 INT21H JMPnextnext: …CODE1ENDS
DS:00000D00
DS:0002?
?TABLEDS:00043011DS:00063611DS:00083611DS:000A42case311DS:000C4Acase411DS:000E4Ecase567114Ecase567114Ecase56711ABcase0case12BXcase12第八十四页,共108页。寄存器相对(xiāngduì)寻址如按下5,TABLE=0004H,(BX)=0005H,TABLE[BX]存储单元的有效地址EA=TABLE+BX*TYPETABLE=0004+0005*2=000EH从转移地址表中找到该存储单元(DS:000E),获得TABLE[BX]中的值,这值就是要转向目的分支的名字(case567),也就是目的分支所在的入口地址114E。JMPTABLE[BX]后,IP=114E,CS:IP对应的指令即是:LEADX,MSG,程序(chéngxù)转向case567 分支执行第八十五页,共108页。CODE1SEGMENT … MOVAX,A MOVBX,AX ANDBX,7 ;得到BX的低三位,实现(shíxiàn)a%8的计算 SHLBX,1 ;由于地址表是字类型,其下标要乘2 JMPTable[BX] ;利用地址表实现(shíxiàn)多路转移case0:MOVB,32D JMPnextcase12:ADDAX,43D MOVB,AX JMPnextcase3:SHLAX,1 MOVB,AX JMPnextcase4:DECB JMPnextcase567:LEADX,MSG MOVAH,9 INT21H JMPnextnext: …CODE1ENDSCASE0CS:1130B820E94DJMP115010CASE12CS:1136ADDAX,43D
MOVB,AXCASE3CS:1142JMPNEXTSHLAX,1MOVB,AXJMPB,AXCASE4CS:114ADECBJMPNEXTCASE567CS:114ELEADX,MSGMOVAH,9INT21HJMPNEXTNEXTCS:1150……….MOVB,32D第八十六页,共108页。例6-15:根据AL寄存器中哪一位为1(从低位到高位(ɡāowèi)),把程序转移到8个不同的程序分支branch_tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine8各分支名存于table表,也就是(jiùshì)在存储单元中,要读取存储单元中的数据,必须找到它的物理地址,可以使用与存储单元有关的5种寻址方式第八十七页,共108页。……cmpal,0jecontinueleabx,branch_tableL:shral,1;逻辑右移(yòuyí)jnbadd1;jnb=jncjmpwordptr[bx];段内间接转移add1:addbx,typebranch_tablejmpLcontinue:……routine1:……routine2:……(寄存器间接(jiànjiē)寻址)第八十八页,共108页。(寄存器相对(xiāngduì)寻址)……cmpal,0jecontinuemovsi,0L:shral,1;逻辑右移(yòuyí)jnbadd1;jnb=jncjmpbranch_table[si];段内间接转移add1:addsi,typebranch_tablejmpLcontinue:……routine1:……routine2:……第八十九页,共108页。(基址(jīzhǐ)变址寻址)……cmpal,0jecontinueleabx,branch_tablemovsi,7*typebranch_tablemovcx,8L:shlal,1;逻辑左移jnbsub1;jnb=jncjmpwordptr[bx][si];段内间接(jiànjiē)转移sub1:subsi,typebranch_tableloopLcontinue:……routine1:……routine2:……第九十页,共108页。用分支表设计多路分支
方法(fāngfǎ)2-2(建立转移指令表)转移指令表:在代码段建立(jiànlì)转移指令序列,依次存放跳往各个分支的转移指令。这一指令序列称为转移指令表。当需要跳往某个分支,可以通过查转移指令表,获取相应的转移指令,实现分支转移。第九十一页,共108页。数据(shùjù)段中无需额外设计DATA1SEGMENT…A DW
13B DW
?Table DW
case0,case12,case12,case3 DW
case4,case567,case567,case567MSG DB
'Function5_6_7$'…DATA1ENDS第九十二页,共108页。CODE1SEGMENT … MOVAX,A MOVBX,AX ANDBX,7;得到BX的低三位,实现a%8的计算 MOVCX,BX SHLBX,1 ADDBX,CX ADDBX,OFFSETjmptable;利用转移(zhuǎnyí)指令表实现分支转移(zhuǎnyí) jmpBX;(BX)IPjmptable:jmpcase0 jmpcase12 jmpcase12 jmpcase3 jmpcase4 jmpcase567 jmpcase567 jmpcase567 org$+80hcase0:MOVB,32D JMPnextcase12:ADDAX,43D MOVB,AX JMPnextcase3:SHLAX,1 MOVB,AX JMPnext………CODE1ENDS由于转移指令jmp本身(běnshēn)一般占用3个字节,转移指令表中各转移指令的起始位置需要乘以3
CS:IP…………CS:1200E9jmpcase03111CS:1203E9jmpcase123A11CS:1206E9jmpcase123A11CS:1209jmpcase3CS:120Cjmpcase4
CS:120Fjmpcase567jmptableBX……….代码段第1种做法,优点:转移指令表清晰明了,无需额外计算转移指令的入口(rùkǒu)地址缺点:表中重复的转移指令会增加!第九十三页,共108页。功能(gōngnéng):8个数据分支转换成最后的5个分支CODE1SEGMENT … MOVAX,A MOVBX,AX ANDBX,7;得到(dédào)BX的低三位,实现a%8的计算 CMPBX,2 JBcontinue CMPBX,5 JAcal1DECBX JMPcal1cal1:ANDBX,04Hcontinue: MOVCX,BX SHLBX,1 ADDBX,CX ADDBX,OFFSETjmptable;利用转移指令表实现分支转移 JMPBXjmptable: JMPcase0 JMPcase12 JMPcase3 JMPcase4 JMPcase567 org$+80hcase0:MOVB,32D...…CODE1ENDS…………CS:1200E9jmpcase03111CS:1203E9jmpcase123A11CS:1206E9jmpcase33D11CS:1209
jmpcase4CS:120C
jmpcase567第2种做法,优点(yōudiǎn):精简了转移指令表!缺点:增加了精简后各分支转移地址的计算指令。第九十四页,共108页。例:有数组x(x1,x2,……,x10)和y(y1,y2,……,y10),编程计算(jìsuàn)z(z1,z2,……,z10)z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10逻辑(luójí)尺:00110111001减法0加法方法(fāngfǎ)3逻辑尺控制第九十五页,共108页。xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch……movbx,0movcx,10movdx,logic_rulenext:movax,x[bx]shrdx,1jcsubtractaddax,y[bx]jmpshortresult;向前(xiànɡqián)引用subtract:subax,y[bx]result:movz[bx],axaddbx,2loopnext……第九十六页,共108页。datasegmentarraydw12,11,22,33,44,55,66,77,88,99,111,222,333numberdw55low_idxdw?high_idxdw?dataends例6-16:折半查找(cházhǎo)算法第九十七页,共108页。……leadi,arraymovax,number
cmpax,[di+2];(ax)与第一个元素比较jachk_lastleasi,[di+2];si存放(cúnfàng)位置jeexit;(ax)=第一个元素,找到退出stc;cf=1查找失败jmpexit;(ax)<第一个元素,未找到退出chk_last:movsi,[di]shlsi,1addsi,dicmpax,[si];(ax)与最后一个元素比较jbsearchjeexit;(ax)=最后一个元素,找到退出stcjmpexit;(ax)>最后一个元素,未找到退出算法(suànfǎ)1第九十八页,共108页。compare:
cmpax,[bx+si]jeexitjahigher
deccxmovhigh_id
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2016年广东省中考满分作文《我真想让时光不老》
- 设备材料采购招标文件模板
- 屋面瓦材料选购协议
- 工程项目用材料购买协议
- 水果买卖协议书模板
- 坯布采购合同送货台账表
- 物业保洁服务条款
- 合作协议与合同要点
- 商务秘书品牌推广合同
- 车辆材料订购协议
- 【道法】爱护身体 课件-2024-2025学年统编版道德与法治七年级上册
- 第二次月考测评卷(5-6单元)(试题)-2024-2025学年六年级数学上册人教版
- 医学课件抗痉挛体位摆放
- 2024年统编版七年级上册道德与法治 第三单元 珍爱我们的生命 第八课 生命可贵 第2课时 敬畏生命 教学课件
- IATF16949组织环境因素识别表
- 《积极心理学(第3版)》 课件 第11章 宽容、篇终 积极心理学的应用与展望
- 2024-2025学年七年级数学上册第一学期 期末模拟测试卷(湘教版)
- 职业素质养成(吉林交通职业技术学院)智慧树知到答案2024年吉林交通职业技术学院
- 5.5《方程的意义》(课件)-2024-2025学年人教版数学五年级上册
- 2024年秋人教版七年级上册数学全册教学课件(新教材)
- 运用PDCA管理方法,推进三甲复审工作课件
评论
0/150
提交评论