第五章 分支程序设计_第1页
第五章 分支程序设计_第2页
第五章 分支程序设计_第3页
第五章 分支程序设计_第4页
第五章 分支程序设计_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

第五章分支程序设计任课教师:陶雪丽xueli_xl@126.com河南师范大学计算机与信息技术学院22023/12/14本章内容提要分支程序结构

无条件转移指令

条件转移指令

分支程序设计方法

分支程序设计举例

河南师范大学计算机与信息技术学院32023/12/14编写汇编语言程序的步骤根据算法,画出程序框图。根据框图编写程序。分析题意,确定算法。上机调试程序。河南师范大学计算机与信息技术学院42023/12/145.1分支程序结构判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志。分支程序根据条件是真或假决定执行与否。

转移指令Jcc和JMP可以实现分支控制;还可以采用MASM6.x提供的条件控制伪指令实现。分支结构有三种形式:单分支:相当于高级语言中的IF_ELSE双分支:相当于高级语言中的IF_ELSE_THEN多分支:相当于高级语言中的CASE如图5.10所示。河南师范大学计算机与信息技术学院52023/12/14 5.2无条件转移指令执行的操作:

程序转向label标号指定的地址。格式:JMPlabel

只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令。

操作数label是要转移到的目标地址(目的地址、转移地址)。JMP指令不影响标志位。河南师范大学计算机与信息技术学院62023/12/145.2无条件转移指令JMP(jmp)跳转指令分成四种类型:寻址方式:段内转移、直接寻址——段内直接短转移、近转移段内转移、间接寻址——段内间接近转移段间转移、直接寻址——段间直接远转移段间转移、间接寻址——段间间接远转移段内转移:在同一段的范围内进行转移,只需改变IP/EIP的内容,即用新的转移目标地址代替原有的IP/EIP的值即可。段间转移:在不同的段之间进行转移,需改变CS和IP/EIP的内容,即用新的转移目标地址代替原有的CS和IP/EIP的值。河南师范大学计算机与信息技术学院72023/12/145.2无条件转移指令段内直接短转移

段内直接近转移

段内间接近转移

段间直接远转移

这些指令均不影响标志位。段间间接远转移

河南师范大学计算机与信息技术学院82023/12/14(1)段内直接短转移执行的操作:

(IP)←(IP)+8位位移量格式:JMPSHORTOPR

386及其后继机型则为:(EIP)←(EIP)+8位位移量如操作数长度为16位,则还需:

(EIP)←(EIP)AND0000FFFFH河南师范大学计算机与信息技术学院92023/12/14(2)段内直接近转移执行的操作:

(IP)←(IP)+16位位移量格式:JMPNEARPTROPR

386及其后继机型则为:(EIP)←(EIP)+32位位移量如操作数长度为16位,则还需:

(EIP)←(EIP)AND0000FFFFH8086及其他机型的实模式下段长为64KB,所以16位位移量可以转移到段内的任一个位置。386及其后继机型的保护模式下,段的大小可达4GB,32位位移量可转到段内的任何位置。河南师范大学计算机与信息技术学院102023/12/14段内直接转移说明

位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移。

转移的目标地址在汇编格式中可直接使用符号地址。

位移量是一个带符号数:当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负。 jmpagain ;转移到again处继续执行

…… again: deccx ;标号again的指令

……

jmpoutput ;转向output

……output: movresult,al ;标号output的指令河南师范大学计算机与信息技术学院112023/12/14(3)段内间接近转移执行的操作:

(IP)←(EA)格式:JMPWORDPTROPR

386及其后继机型则为:(EIP)←(EA)如操作数长度为16位,则还需:

(EIP)←(EIP)AND0000FFFFH其中EA为有效地址,值由OPR的寻址方式确定。河南师范大学计算机与信息技术学院122023/12/14(3)段内直接近转移指令形式JMPr16/m16

;(IP)←(r16/m16)JMPr32/m32

;(EIP)←(r32/m32)

将一个16/32位寄存器或主存字/双字单元内容送入IP/EIP寄存器,作为新的指令指针,但不修改CS寄存器的内容。

jmpax ;IP←AX jmpwordptr[2000h] ;IP←[2000h] 河南师范大学计算机与信息技术学院132023/12/14(4)段间直接远转移执行的操作:

(IP)←OPR的段内偏移地址 (CS)←OPR所在段的段地址格式:JMPFARPTROPR

386及其后继机型则为:

(EIP)←OPR的段内偏移地址(CS)←OPR所在段的段地址如操作数长度为16位,则还需:

(EIP)←(EIP)AND0000FFFFH这里使用的是直接寻址方式。在汇编格式中OPR可使用符号地址。河南师范大学计算机与信息技术学院142023/12/14(4)段间直接转移指令形式JMPfarptrlabel ;(IP/EIP)←label的偏移地址 ;(CS)←label的段地址

将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP/EIP值;这样,程序跳转到新的代码段执行。

jmpfarptrotherseg

;远转移到代码段2的otherseg河南师范大学计算机与信息技术学院152023/12/14(5)段间间接远转移执行的操作:

(IP)←(EA) (CS)←(EA)+2格式:JMPDWORDPTROPR

386及其后继机型则为: (EIP)←(EA) (CS)←(EA)+4如操作数长度为16位,则还需:

(EIP)←(EIP)AND0000FFFFH其中EA为有效地址,值由OPR的寻址方式确定。河南师范大学计算机与信息技术学院162023/12/14(5)段间间接转移指令形式JMPfarptrm16 ;(IP)←(m16) ;(CS)←(mem+2)

用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字/双字单元中的,低位字/双字送IP/EIP寄存器,高位字送CS寄存器。

movwordptr[bx],0 movwordptr[bx+2],1500h JMPfarptr[bx] ;转移到1500h:0 JMPDWORDPTRALPHA[SP][DI]JMPfarptrm32 ;(EIP)←(m32) ;(CS)←(mem+4)河南师范大学计算机与信息技术学院172023/12/14 5.3条件转移指令执行的操作:

条件满足,则转移,IP←IP+8位位移量或EIP←EIP+8/32位位移量;条件不满足,则顺序执行。格式:Jcclabel

指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令(Jcc指令为2个字节,所以顺序执行就是当前指令偏移指针IP加2)。

条件转移指令采用了相对寻址方式,只能用JMP指令中的短转移格式。

所有的条件转移指令都不影响标志位。河南师范大学计算机与信息技术学院182023/12/14 JCC指令的分类Jcc指令不影响标志,但要利用标志(见表3.5)。根据利用的标志位不同,JCC指令分成4种情况:

1.判断单个标志位状态2.比较无符号数高低3.比较有符号数大小4.测试CX或ECX的值河南师范大学计算机与信息技术学院192023/12/14(1)根据单个条件标志的设置情况转移JZ/JE(jumpifzero,orequal)结果为零/相等则转移

测试条件:ZF=1JNZ/JNE(jumpifnotzero,ornotequal)结果不为零/不相等则转移

测试条件:ZF=0JS(jumpifsign)结果为负则转移

测试条件:SF=1JNS(jumpifnotsign)结果为正则转移

测试条件:SF=0示例1示例2河南师范大学计算机与信息技术学院202023/12/14(1)根据单个条件标志的设置情况转移JO(jumpifoverflow)溢出则转移

测试条件:OF=1JNO(jumpifnotoverflow)不溢出则转移

测试条件:OF=0JP/JPE(jumpifparity,orparityeven)奇偶位为1则转移

测试条件:PF=1JNP/JPO(jumpifnotparity,orparityodd)奇偶位为0则转移

测试条件:PF=0示例3示例4河南师范大学计算机与信息技术学院212023/12/14(1)根据单个条件标志的设置情况转移JB/JNAE/JC(jumpifbelow,ornotaboveorequal,orcarry)低于/不高于等于/进位为1则转移

测试条件:CF=1JNB/JAE/JNC(jumpifnotbelow,oraboveorequal,ornotcarry)不低于/高于等于/进位为0则转移

测试条件:CF=0示例5河南师范大学计算机与信息技术学院222023/12/14(2)比较两个无符号数,并根据比较的结果转移无符号数的大小用高(Above)低(Below)表示。利用CF确定高低、利用ZF标志确定相等(Equal)。JB/JNAE(jumpifbelow,ornotaboveorequal)低于/不高于等于

测试条件:CF=1JNB/JAE(jumpifnotbelow,oraboveorequal)不低于/高于等于/进位为0则转移

测试条件:CF=0示例6河南师范大学计算机与信息技术学院232023/12/14(2)比较两个无符号数,并根据比较的结果转移JBE/JNA(jumpifbeloworequal,ornotabove)低于等于/不高于则转移

测试条件:CF∨ZF=1JNBE/JA(jumpifnotbeloworequal,orabove)不低于等于/高于则转移

测试条件:CF∨ZF=0河南师范大学计算机与信息技术学院242023/12/14(3)比较两个带符号数,并根据比较的结果转移

有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)。JL/JNGE(jumpifless,ornotgreaterorequal)小于/不大于等于则转移

测试条件:SF≠OFJNL/JGE(jumpifnotless,orgreaterorequal)不小于/大于等于则转移

测试条件:SF=OF示例6示例7河南师范大学计算机与信息技术学院252023/12/14(3)比较两个带符号数,并根据比较的结果转移JLE/JNG(jumpiflessorequal,ornotgreater)小于等于/不大于则转移

测试条件:(SF≠OF)∨

ZF=1JNLE/JG(jumpifnotlessorequal,orgreater)不小于等于/大于则转移

测试条件:(SF≠OF)∨

ZF=0示例8综合举例无符号数比较转移指令测试条件分析带符号数比较转移指令测试条件分析河南师范大学计算机与信息技术学院262023/12/14(4)测试CX或ECX的值为0则转移JCXZ(jumpifCXregisteriszero)CX寄存器的内容为零则转移

测试条件:CX=0JECXZ(jumpifECXregisteriszero)ECX寄存器的内容为零则转移(386及其后继机型可用)

测试条件:CX=0河南师范大学计算机与信息技术学院272023/12/145.4分支程序设计方法单分支、双分支举例单分支 求绝对值、 无符号数除以2双分支 显示BX最高位、

判断有无实根、 折半查找

例5.9河南师范大学计算机与信息技术学院282023/12/14折半查找算法(1)初始化被查找数组的首尾下标,low←1,high←n;(2)若low>high,则查找失败,置CF=1,退出程序。否则,计算中点:mid←(low+high)/2;(3)k与中点元素r[mid]比较。若k=r[mid],则查找成功,程序结束;若k<r[mid],则转步骤(4);若k>[mid],则转步骤(5);(4)低半部分查找(lower),high←mid-1,返回步骤(2),继续查找;(5)高半部分查找(higher),low←mid+1,返回步骤(2),继续查找。

在一个长度为n的有序数组r中,查找元素k的折半查找算法描述如下:河南师范大学计算机与信息技术学院292023/12/14多分支结构实现方法

多分支结构:多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行。多分支可以化解为双分支或单分支结构的组合,例如: orah,ah ;等效于cmpah,0 jzfunction0 ;ah=0,转向function0 decah ;等效于cmpah,1 jzfunction1 ;ah=1,转向function1 decah ;等效于cmpah,2 jzfunction2 ;ah=2,转向function2如图所示。河南师范大学计算机与信息技术学院302023/12/14跳跃表法需要在数据段事先安排一个按顺序排列的转移地址表。

输入的数字作为偏移量。因为只有2个字节16位偏移地址,所以偏移量需要乘2。

多分支结构的实现,还可以使用跳跃表法,使程序能根据不同的条件转移到多个程序分支中去。关键是要理解间接寻址方式JMP指令地址表分支1地址分支2地址...Table dwdisp1,disp2,disp3,disp4,...河南师范大学计算机与信息技术学院312023/12/14跳跃表实现举例例5.10 a

变址寻址方式例5.10 b

间接寻址方式例5.10c

基址变址寻址方式JMP指令所用的寻址方式河南师范大学计算机与信息技术学院322023/12/14表3.5Jcc指令河南师范大学计算机与信息技术学院332023/12/14

JZ/JNZ指令举例 testal,80h ;测试最高位

jznext0

;D7=0(ZF=1),转移

movah,0ffh ;D7=1,顺序执行

jmpdone

;无条件转向next0: movah,0done: ... testal,80h ;测试最高位

jnznext1

;D7=1(ZF=0),转移

movah,0 ;D7=0,顺序执行

jmpdone ;无条件转向next1: movah,0ffhdone: ...河南师范大学计算机与信息技术学院342023/12/14

JS/JNS指令举例;计算|X-Y|(绝对值);X和Y为存放于X单元和Y单元的16位操作数;结果存入result movax,X subax,Y

jnsnonneg negax ;neg是求补指令

nonneg: movresult,ax河南师范大学计算机与信息技术学院352023/12/14

JO/JNO指令举例;计算X-Y;;X和Y为存放于X单元和Y单元的16位操作数;若溢出,则转移到overflow处理

movax,X subax,Y

jooverflow ... ;无溢出,结果正确overflow: ... ;有溢出处理河南师范大学计算机与信息技术学院362023/12/14

JP/JNP指令举例;设字符的ASCII码在AL寄存器中;将字符加上奇校验位;在字符ASCII码中为“1”的个数已为奇数时;则令其最高位为“0”;否则令最高位为“1” andal,7fh

;最高位置“0”,同时判断“1”的个数

jnpnext

;个数已为奇数,则转向next oral,80h ;否则,最高位置“1”next: ...河南师范大学计算机与信息技术学院372023/12/14

JC/JNC指令举例-1;记录BX中1的个数

xoral,al ;AL=0,CF=0again: testbx,0ffffh ;等价于cmpbx,0 jenext shlbx,1

jncagain incal jmpagainnext: ... ;AL保存1的个数河南师范大学计算机与信息技术学院382023/12/14

记录BX中1的个数-2;记录BX中1的个数

xoral,al ;AL=0,CF=0again: cmpbx,0

jznext shlbx,1 ;也可使用shrbx,1 adcal,0 jmpagainnext: ... ;AL保存1的个数河南师范大学计算机与信息技术学院392023/12/14

无符号数比较和带符号数比较举例;无符号数比较

cmpax,bx ;比较ax和bx

jnbnext

;若ax≥bx,转移

xchgax,bx ;若ax<bx,交换next: ...

;带符号数比较

cmpax,bx ;比较ax和bx

jnlnext

;若ax≥bx,转移

xchgax,bx ;若ax<bx,交换next: ...河南师范大学计算机与信息技术学院402023/12/14

两数比较举例例3.77;α、β为两个双精度数,;分别存储于DX、AX及BX、CX中。

CMPDX,BX

JGX JLY CMPAX,CX

JAX

Y:

X:

…河南师范大学计算机与信息技术学院412023/12/14

JG、JNS指令举例例3.76;X,Y均为存放在X和Y单元中的16位操作数

MOVAX,X CMPAX,50

JGTOO_HIGH SUBAX,Y JOOVERFLOW

JNSNONNEG NEGAX

NONNEG: MOVRESULT,AX

TOO_HIGH:

OVERFLOW: …河南师范大学计算机与信息技术学院422023/12/14

综合举例-1例3.78;测试首地址为ARRAY的N字数组中正数及负数的个数。;正数的个数放在DI中,0的个数放在SI中,;负数的个数放在AX中,;若有负数则转移到NEG_VAL中去执行。

movcx,N movbx,0 movdi,bx movsi,bx

again: cmparray[bx],0

jleless_or_eq incdi河南师范大学计算机与信息技术学院432023/12/14

综合举例-2 jmpshortnext

less_or_eq:

jlnext incsi

next: addbx,2 deccx

jnzagain movax,N subax,di subax,si

jzskip jmpnearptrneg_val

skip:

… neg_val: …河南师范大学计算机与信息技术学院442023/12/14图5.10分支程序的结构形式河南师范大学计算机与信息技术学院452023/12/14

分支程序举例-1;计算AX的绝对值

cmpax,0 jnsnonneg ;分支条件:AX≥0 negax ;条件不满足,求补nonneg: movresult,ax ;条件满足;计算AX的绝对值

cmpax,0 jlyesneg ;分支条件:AX<0 jmpnonnegyesneg: negax ;条件不满足,求补nonneg: movresult,ax

;条件满足河南师范大学计算机与信息技术学院462023/12/14

分支程序举例-2;无符号数除以2;将AX中存放的无符号数除以2,如果是奇数,则加1后除以2

testax,01h ;测试AX最低位

jzeven ;最低位为0:AX为偶数

addax,1;最低位为1:AX为奇数,需要加1even: rcrax,1 ;AX←AX÷2;如果采用SHR指令,则不能处理AX=FFFFH的特殊情况河南师范大学计算机与信息技术学院472023/12/14

分支程序举例-3;显示BX最高位 -1 shlbx,1 ;BX最高位移入CF jcone ;CF=1,即最高位为1,转移

movdl,’0’

;CF=0,即最高位为0,DL←’0’ jmptwo ;一定要跳过另一个分支体one: movdl,’1’

;DL←’1’two: movah,2 int21h ;显示对比河南师范大学计算机与信息技术学院482023/12/14

分支程序举例-3;显示BX最高位 -2

shlbx,1

;BX最高位移入CF

jncone

;CF=0,即最高位为0,转移

movdl,’1’

;CF=1,即最高位为1,DL←’1’

jmptwo

;一定要跳过另一个分支体one: movdl,’0’

;DL←’0’two: movah,2 int21h

;显示对比河南师范大学计算机与信息技术学院492023/12/14

分支程序举例-4;判断有无实根;判断方程ax2+bx+c=0是否有实根。若有实根则将字节变量tag置为1,否则置0。

.startup mov al,_b imul al mov bx,ax ;BX中为b2 mov al,_a imul _c mov cx,4 imulcx

;AX中为4ac(DX无有效数据)河南师范大学计算机与信息技术学院502023/12/14

分支程序举例-4 cmp bx,ax ;比较二者大小

jge yes ;条件满足?

mov tag,0

;第一分支体:条件不满足,tag←0 jmp done ;跳过第二个分支体yes: mov tag,1

;第二分支体:条件满足,tag←1done: .exit0河南师范大学计算机与信息技术学院512023/12/14

分支程序举例-5例5.9在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组的第一个单元存放着数组长度。在AX中有一个无符号数。要求在数组中查找(AX),如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。;***************************************************

.modelsmall .stack .data河南师范大学计算机与信息技术学院522023/12/14

分支程序举例-5low_idx dw ?high_idx dw ? .code .startup push ds cmp ax,es:[di+2] ;(AX)<=第一个元素?

ja chk_last ;不是,则检查最后一个元素

lea si,es:[di+2] ;是,则取第一个元素的地址

je done ;若(AX)=第一个元素,则退出

stc ;若(AX)<第一个元素,则置位CF jmp done ;然后退出Chk_last:河南师范大学计算机与信息技术学院532023/12/14

分支程序举例-5 mov si,es:[di] ;指针指向最后一个元素

shl si,1 add si,di cmp ax,es:[si] ;(AX)>=最后一个元素?

jb search ;不成立,则继续查找

je done ;如果相等,则退出

stc ;如果>,则置位CF jmp done ;然后退出Serch: mov low_idx,1 mov bx,es:[di] 河南师范大学计算机与信息技术学院542023/12/14

分支程序举例-5 mov high_idx,bx mov bx,diMid: mov cx,low_idx ;计算中间指针

mov dx,high_idx cmp cx,dx ja no_match add cx,dx shr cx,1 mov si,cx shl si,1 ;计算下一个查找地址Compare:cmp ax,es:[bx+si] ;是否找到数据(AX) je done ;找到,则退出

ja higher ;大于则在高的一半查找河南师范大学计算机与信息技术学院552023/12/14

分支程序举例-5 dec cx mov high_idx,cx jmp midHigher: inc cx mov low_idx,cx jmp midNo_match: stcDone: pop ds .exit 0 end

由于多数运算型指令置条件码,所以在条件转移指令之前不一定要使用CMP或TEST指令,只要保证使用条件转移指令时的条件码符合要求就可以了。图5.11河南师范大学计算机与信息技术学院562023/12/14图5.11折半查找算法的程序框图河南师范大学计算机与信息技术学院572023/12/14

分支程序举例-6;单分支、双分支 ;寄存器AL中是字母Y或y,则令AH=0;否则令AH=-1

cmp al,’Y’

;AL是大写Y否?

jz next ;是,转移

cmp al,’y’

;AL是小写y否?

jz next ;是,转移

mov ah,-1

;不是Y或y,则AH=-1,结束

jmp done ;一定要跳过另一个分支体next: mov ah,0

;是Y或y,则AH=0,结束

done: ...河南师范大学计算机与信息技术学院582023/12/14多分支结构AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN河南师范大学计算机与信息技术学院592023/12/14

分支程序举例-7例5.10a-变址寻址方式根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8

温馨提示

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

评论

0/150

提交评论