分支程序设计.pptx

上传人:王** 文档编号:270917 上传时间:2023-04-23 格式:PPTX 页数:53 大小:111.74KB
下载 相关 举报
分支程序设计.pptx_第1页
第1页 / 共53页
分支程序设计.pptx_第2页
第2页 / 共53页
分支程序设计.pptx_第3页
第3页 / 共53页
分支程序设计.pptx_第4页
第4页 / 共53页
分支程序设计.pptx_第5页
第5页 / 共53页
分支程序设计.pptx_第6页
第6页 / 共53页
分支程序设计.pptx_第7页
第7页 / 共53页
分支程序设计.pptx_第8页
第8页 / 共53页
分支程序设计.pptx_第9页
第9页 / 共53页
分支程序设计.pptx_第10页
第10页 / 共53页
亲,该文档总共53页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《分支程序设计.pptx》由会员分享,可在线阅读,更多相关《分支程序设计.pptx(53页珍藏版)》请在优知文库上搜索。

1、第4章 分支分支程序设计程序设计4.1 简单分支简单分支程序程序4.2 多重分支程序多重分支程序 分支程序的结构形式有两种,如图4.1所示,这两种形式类似于高级语言里面的IF_THEN_ELSE语句和CASE。IF_THEN_ELSE语句可以引出两个分支,而CASE语句可以引出多个分支。在汇编语言里,实现分支选择的语句是通过跳转语句实现的,具体的实现方式如下:先对某一些变量进行比较,然后根据比较的结果跳转到不同的地方去执行。 实现分支的方法: 比较/转移法和跳转表转移法: 比较转移指令可嵌套,但程序结构复杂,跳转表可使程序结构清晰。4.1 简单分支程序简单分支程序 在编写分支程序时,要尽可能避

2、免编写“头重脚轻”的结构 在编写分支结构时,一般先处理简单的分支,再处理较复杂的分支。对多分支的情况,也可遵循“由易到难”的原则。因为简单的分支只需要较少的指令就能处理完,一旦处理完这种情况后,在后面的编程过程中就可集中考虑如何处理复杂的分支 例例4.1 X为任意有符号字节数,若X为负数,则将其取补码,否则与Y相加,和存入AX中。 题目分析:在数据段中定义变量X和Y的值,取出X与比较大小,如果小于,则用求补指令NEG求出补码仍旧存入X存储单元;如果大于0,则计算X+Y的值并存入AX。 .MODEL TINY ;简短模式的程序定义 .DATA X DB -8 ;定义变量X Y DB 210 ;

3、定义变量Y .CODE STARTUP: MOV AX,DATA MOV DS,AX ;取出数据段的段地址 MOV AL,X ;X0?CMP AL,0 JGE BIG;如果X=0,跳转到BIG处与变量Y相加 NEG AL;如果Xhigh,则查找失败,置CF=1,程序结束;否则,计算中间位置mid=(low +high)/2 (3)查找元素k与中点元素rmid比较,若k= rmid,则查找成功,置CF=0,并SImid,程序结束;若krmid, 则转第(5) (4)在低半部分查找。Low值不变, high mid -1,返回第(2),继续查找 (5)在高半部分查找。high值不变,low mid

4、 + 1,返回第(2),继续查找 data segment lw dw ? hg dw ? data ends extra segment arr dw 6,1,2,5,7,9,12 extra ends code segment main proc far assume cs:code,ds:data,es:extra start: mov ax,3 push ax mov ax,data mov ds,ax mov ax,extra mov es,ax pop ax lea di,arr cmp ax,es:di+2 ja chk_last lea si,es:di+2 je exit s

5、tc jmp exit chk_last: mov si,es:di shl si,1 add si,di cmp ax,es:di jb search je exit stc jmp exit search: mov lw,1 mov bx,es:di mov hg,bx mov bx,di mid: mov cx,lw mov dx,hg cmp cx,dx ja no_match add cx,dx shr cx,1 mov si,cx shl si,1 compare: cmp ax,es:bx+si je exit ja higher dec cx mov hg,cx jmp mid

6、 higher: inc cx mov lw,cx jmp mid no_match: stc exit: pop ds ret main endp code ends end start4.2.2 利用跳跃表实现多路分支利用跳跃表实现多路分支 例例4.6 根据AL寄存器中哪一位为1把程序转移到不同的分支执行。 题目分析:事先在AL寄存器中存有数据,在程序中测试AL的值,利用SHR指令每次把AL中的最低位移入CF标志位,JNB或JB指令的测试条件是测试CF的值是否为0或1。 不同的程序分支存储在跳跃表中,程序中取出跳跃表的首地址,然后根据测试的AL中的值,用首地址加上偏移地址,得到跳跃的地址,

7、有了跳跃地址就可以在跳跃表中跳转到不同的地方 branch segment brch_tab dw rout1 dw rout2 dw rout3 dw rout4 dw rout5 dw rout6 dw rout7 dw rout8 branch ends code segment main proc far assume cs:code, ds:branch start: push ds sub ax,ax push ax mov ax,branch mov ds,ax mov al,00000100B cmp al,0 je exit mov si,0 bch: shr al,1 jn

8、c net_yet jmp brch_tabsi net_yet: add si,type brch_tab jmp bch 重要指令分析: shr al,1 :把AL寄存器中的数值逻辑右移一位,最低位移到CF中,最高位补0。下面一条指令测试CF的值,就可以知道AL的最低位是0或者1了。这样循环执行,就可以测试中各个数位了。 jmp brch_tabsi:这是一种寄存器相对寻址方式,如果满足条件,就跳转到数据段中brch_tab存储单元里面偏移段首si个位置的地方执行。在本例中,brch_tab定义的是跳跃表,假定si 2,则brch_tabsi的有效地址就是对应rout2的地方,所以程序跳转

9、到语句标号为rout2的地方执行。 add si,type brch_tab:type伪操作是取出数据段中brch_tab定义的数据类型的字节数,本例是dw类型,即2个字节。 例例4.7 统计输入的字符串中的字母、数字和其他字符的个数并把结果以16进制显示出来 题目分析:字符串以$结束。一次取出每个字符,字符在内存中存储的是16进制的ASCII码,0的ASCII码为30h,a 的ASCII码为61h,A 的ASCII码为41h。如果字符的值在30h到39h之间,则为数字;如果字符的值在41h到5ah之间,则为大写字母;如果字符的值在61h到7ah之间,则为小写字母;否则,是其他的字符。 dat

10、a segment line db w34STP5 r9rstuv34,$ da1 dw 0 da2 dw 0 da3 dw 0 res1 db 0ah,0dh,digits:,$ res2 db 0ah,0dh,letters:,$ res3 db 0ah,0dh,others:,$ data ends code segment main proc far assume cs:code,ds:data start: push ds sub ax,ax push ax mov ax,data mov ds,ax lea bx,line mov dl,bx push bx s: cmp dl,3

11、0h jl other cmp DL,39h jg ch1 digit: mov bx,da1 inc bx mov da1,bx jmp next ch1: cmp DL,41h jl other cmp DL,5ah jg continue ch2: mov bx,da2 inc bx mov da2,bx jmp next continue: cmp DL,61h jl other cmp DL,7ah jng ch2 other: mov bx,da3 inc bx mov da3,bx jmp next next: pop bx inc bx mov dl,bx push bx cmp dl,$ jnz s result: lea DX,line mov Ah,09 int 21h lea DX,res1 mov Ah,09 int 21h mov bx,DS:da1 call display lea dx,res2 mov ah,09 int 21h mov bx,ds:da2 call display lea dx,res3 mov Ah,09 int 21h mov bx,DS:da3 call display exit: ret

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 数据结构与算法

copyright@ 2008-2023 yzwku网站版权所有

经营许可证编号:宁ICP备2022001189号-2

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!