《分支结构程序设计》由会员分享,可在线阅读,更多相关《分支结构程序设计(17页珍藏版)》请在金锄头文库上搜索。
1、 第第7 7章章 分支结构程序设计分支结构程序设计l l在高级语句中,分支结构一般用在高级语句中,分支结构一般用IFIF语句来实现,在汇编语语句来实现,在汇编语言中,课用无条件转移指令或条件转移指令实现的分支结言中,课用无条件转移指令或条件转移指令实现的分支结构。如图构。如图6.26.2给出了二种常用的分支结构。给出了二种常用的分支结构。l l在编写分支程序时,要尽可能避免编写在编写分支程序时,要尽可能避免编写“ “头重脚轻头重脚轻” ”的结构,的结构,即:当前分支条件成立时,将执行一系列指令,而条件不即:当前分支条件成立时,将执行一系列指令,而条件不成立时,所执行的指令很少。这样就使后一个分
2、支离分支成立时,所执行的指令很少。这样就使后一个分支离分支点较远,有时甚至会遗忘编写后一分支程序。这种分支方点较远,有时甚至会遗忘编写后一分支程序。这种分支方式不仅不利于程序的阅读,而且也不便将来的维护。式不仅不利于程序的阅读,而且也不便将来的维护。l l所以,在编写分支结构时,一般先处理简单的分支,再处所以,在编写分支结构时,一般先处理简单的分支,再处理较复杂的分支。对多分支的情况,也可遵循理较复杂的分支。对多分支的情况,也可遵循“ “由易到难由易到难” ”的原则。因为简单的分支只需要较少的指令就能处理完,的原则。因为简单的分支只需要较少的指令就能处理完,一旦处理完这种情况后,在后面的编程过
3、程中就可集中考一旦处理完这种情况后,在后面的编程过程中就可集中考虑如何处理复杂的分支。虑如何处理复杂的分支。7.2 转移指令l l1 1条件转移指令条件转移指令l l根据条件标志位的状态判断的转移指令根据条件标志位的状态判断的转移指令l l这组条件转移指令共有这组条件转移指令共有1010条。条。l l JZ JZ 结果为零则转移。结果为零则转移。l l JNZ/JNE JNZ/JNE 结果不为零则转移。结果不为零则转移。l l JS JS 结果为负则转移。结果为负则转移。l l JNS JNS 结果为正则转移。结果为正则转移。l l JO JO 溢出则转移。溢出则转移。l l JNO JNO
4、不溢出则转移。不溢出则转移。l l JP/JPE 奇偶位为1则转移。l l JNP/JPO 奇偶位为0则转移l l JC 进位为1则转移。l l JNC 进位为0则转移。l l根据两个无符号数的比较结果判断的转移指令 l l指令用于两个无符号数a、b的比较。l l JB/JNAE 低于/不高于等于转移。l l JNB/JAE 不低于/高于等于则转移。l l JBE/JNA 低于等于/不高于则转移。l l JNBE/JA 不低于等于/高于则转移。l l根据两个带符号数的比较结果判断的转移指令 l l本指令用于两个有符号数a、b的比较。l l JL/JNGE 小于/不大于等于则转移。l l JNL
5、/JGE 不小于/大于等于则转移。l l JLE/JNG 小于等于/不大于则转移。l l JG/JNLE 大于/不小于等于则转移。计算AX的绝对值l lcmp ax,0cmp ax,0l ljns nonnegjns nonneg ; ;分支条件:分支条件:AX0AX0l lneg axneg ax; ;条件不满足,求补条件不满足,求补l lnonneg:nonneg: mov result,axmov result,ax; ;条件满足条件满足l lcmp ax,0cmp ax,0l ljl yesnegjl yesneg; ;分支条件:分支条件:AXAX0 0l ljmp nonnegjmp
6、 nonnegl lyesneg:yesneg: neg axneg ax; ;条件不满足,求补条件不满足,求补l lnonneg:nonneg: mov result,axmov result,ax; ;条件满足条件满足无条件转移指令l l1.1.段内转移段内转移l l1)1)段内转移直接寻址段内转移直接寻址l lJMP ABCJMP ABCl l2)2)段内转移间接寻址段内转移间接寻址l lJMP CXJMP CXl lJMP WORD PTR BX JMP WORD PTR BX l l2.2.段间转移段间转移l l1)1)段间转移直接寻址段间转移直接寻址l lJMP FAR PTR T
7、AGJMP FAR PTR TAGl l2)2)段间转移间接寻址段间转移间接寻址l lJMP DWORD PTRBXSIJMP DWORD PTRBXSIl l编写一程序段,计算下列函数值。其中:变量X和Y是有符号字变量。 l l l l MOV AX, X MOV AX, X l l CMP AX, 0 CMP AX, 0 l l JGE case23 JGE case23 l l ADD AX, 10 ; ADD AX, 10 ;第一种情况的计算结果第一种情况的计算结果 l l JMP result JMP result l lcase23: CMP AX, 10D case23: CMP
8、 AX, 10D l l JG case3 JG case3 l l MOV BX, 30D MOV BX, 30D l l IMUL BX ; IMUL BX ;第二种情况的计算结果第二种情况的计算结果 l l JMP result JMP result l lcase3: SUB AX, 9 ;case3: SUB AX, 9 ;第三种情况的计算结果第三种情况的计算结果 l lresult: MOV Y, AX ;result: MOV Y, AX ;把计算结果保存到变量把计算结果保存到变量Y Y中中 l l 多分支程序设计l l多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执
9、行。多分支可以化解为双分支或单分支结构的组合,地址表形成多分支l l需要在数据段事先安排一个按顺序排列的转移地址表l l输入的数字作为偏移量。因为只有2个字节16位偏移地址,所以偏移量需要乘2l l关键是要理解间接寻址方式JMP指令l lDATAS SEGMENTDATAS SEGMENTl l base dw m0 base dw m0l l dw m1 dw m1l l dw m2 dw m2l l mes0 db first,$ mes0 db first,$l l mes1 db second,$ mes1 db second,$l l mes2 db third,$ mes2 db
10、third,$ l lDATAS ENDSDATAS ENDSl lSTACKS SEGMENTSTACKS SEGMENTl l ; ;此处输入堆栈段代码此处输入堆栈段代码l lSTACKS ENDSSTACKS ENDSl lCODES SEGMENTCODES SEGMENTl l ASSUME CS:CODES,DS:DATAS,SS:STACKS ASSUME CS:CODES,DS:DATAS,SS:STACKSl lSTART:START:l l MOV AX,DATAS MOV AX,DATASl l MOV DS,AX MOV DS,AXl l mov ah,8 mov ah
11、,8l l int 21h int 21hl l cmp al,0 cmp al,0; ;数字数字 0 2 2?l l ja start ja startl l mov ah,0 mov ah,0l l and al,0fh ; and al,0fh ;将将ASCIIASCII码转换成数字码转换成数字l l add al,al add al,all l mov bx,ax mov bx,axl ljmp basebx ; jmp basebx ; (段内)间接转移:(段内)间接转移: IPbase+bxIPbase+bxl l m0:mov dx,offset mes0 m0:mov dx,offset mes0l l jmp disp jmp displ l m1:mov dx,offset mes1 m1:mov dx,offset mes1l l jmp disp jmp displ l m2:mov dx,offset mes2 m2:mov dx,offset mes2l l jmp disp jmp displ l l ldisp:mov ah,09hl l int 21hl l mov ah,01hl l int 21hl l MOV AH,4CHl l INT 21Hl lCODES ENDSl l END START