资源预览内容
第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
第9页 / 共34页
第10页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1 32 分支程序设计 321 简单分支程序 (判断条件在两个以内)对两个操作数进行算术或逻辑运算,然后根据运算后结果对标志位的影响来产生分支 。2(1)用比较指令实现。CMP DEST,SRC ;比较两个操作数 JE EQUL EQUL: (2) 用测试指令实现。TEST DEST,SRC ;逻辑与测试JNZ ONE ONE: 3(3) 用逻辑指令实现。SHR DEST,CL ;对DEST进行逻辑右移JC NEXT ;CF=1,转移到NEXT NEXT: 4例3.26 编程实现将键盘输入的小写字母转换成大写后输出,程序流程如图3.2所示。MODEL SMALL (az的ASC 码61H 7AH,A Z的ASC 码41 H 5AH )DATABLOCK DB ERROR!,0DH,0AH,$CODESTARTUPMOV AH,1 ;读键入字符INT 21HCMP AL,a ;判字符小于aJB NEXTCMP AL,z ;判字符大于z? JA NEXT AND AL,11011111B ;将小写字母转换MOV DL,AL ; 成大写字母MOV AH,02 ;显示输出INT 21HJMP DONENEXT:LEA DX,BLOCK ;非小写字母处理MOV AH,9 INT 21H 图3.2 例3.26 程序流程DONE :EXITEND5DATE1 SEGMENTA DW ?B DW ?C DW ? DATE1 ENDS CODE1 SEGMMOV AX, AADD AX, BJLE _ELSE;小于等于0TEST C, 1 ;C%2=0? 即看C的最低位是否为0JNZ _ELSEMOV A, 62JMP NEXT _ELSE:MOV A, 21 NEXT: CODE1 ENDS 例 把下列C语言的语句改写成等价的汇编语言程序段(不 考虑运算过程中的溢出), 其中:变量a、b和c 都是有符号的整型(int)变量。 if (a+b0 break;case1:case2: b=a+43; break;case3: b=2*a; break;case4: b-; break;case5:case6:case7: printf(Function 5_6_7); break; 11.MODEL SMALL.DATAA DW ?B DW ? Table DW case0, case12, case12,case3, case4, case567, case567, case567 MSG DB Function 5_6_7$ .CODE .STARTUPMOV AX, AMOV BX, AXAND BX, 7 ;得到BX的低3位二进制数,实现a%8的计算SHL BX, 1 ;地址表是字类型,其下标要乘2 JMP TableBX ;利用地址表实现多路转移12 case0:MOV B,32 JMP next Case12:ADD AX,43 MOV B,AX JMP next Case3:SHL AX,1 MOV B,AX JMP next Case4:DEC B JMP next Case567:LEA DX,MSG MOV AH,9 INT21H JMP next next: .EXIT .END13用地址表实现多路转移的关键在于:转移入口的地址表和转移情况可整数化。如果这两个要求有一个不满足或很难构造,则无法使用该方法。 14 33 循环程序设计 331 单重循环程序 单重循环程序按照判断循环条件的流程不同可分为两类结构。一REPEATUNTIL结构:先执行程序再判断循环条件(至少执行一次)。二WHILEDO结构:先判断循环条件,满足循环条件才进入循环体。图3.6 REPEATUNTIL循环程序结构 图3.7 WHILEDO循环程序结构15例3.29 REPEATUNTIL循环结构程序实现举例。1 MOV CX,COUNT ;设置循环初值AGAIN: ;循环程序入口LOOP AGAIN ;循环控制2 MOV CL,COUNT ;设置循环初值AGAIN: DEC CL ;计数器减1 JNZ AGAIN ;循环控制 16例3.30 WHILEDO循环结构程序实现举例。MOV CX,COUNT ;设置循环初值AGAIN: JCXZ NEXT DEC CX JMP AGAINNEXT: 17例3.31 从键盘输入21个字符,按键入次序寻找字 典顺序最大的字符,并显 示输出(不区分大小写) 。 分析:判断 ASCII码值 大小时,小写字符 ASCII 码减去20H参与比较( 41H 5AH和61H7AH)。18 MODEL SMALLDATABUF DB 21,?,21DUP(?)BLOCK DB 0AH,0DH,?,$CODESTARTUPMOV DX,OFFSET BUF ;键入字符串MOV AH,0AHINT 21HLEA BX,BUF+2 ;BX第一个字符地址MOV CX,BUF+1 ;CX字符串长度DEC CXMOV AL,BX ;缓冲区第一个字符送 ALAND AL,11011111B ;小写字符 ASCII码减20HMOV SI,BX ;缓冲区第一个字符地址送 SI19AGAIN:INC BXMOV DL,BX ;缓冲区字符送 DLAND DL,11011111B CMP AL,DL ;比较两字符大小JAE NEXTXCHG AL,DL ;大数存 AL中MOV SI,BX ;大数地址送 SINEXT:LOOP AGAINMOV DL,SI ;最大字符送 DLMOV BLOCK+2,DLMOV DX,OFFSET BLOCK;显示输出MOV AH,9 INT 21H EXITEND 20 例:把数组score的平均值(取整)存入字变量 Average中,数组以负数为结束标志。 .model small .datascore dw 90,95,54,65,36,78,66,0,66,22,-1 Average dw 0 .code .startup XOR AX,AX XOR DX,DX ;用(DX:AX)保存数组元素之和 XOR CX,CX ;用CX保存数组元素个数 LEA SI,score ;用指针SI访问整个数组21 again: MOV BX,SI CMP BX,0 JL over ADD AX,BX ADC DX,0 ;求和 INC CX ;计数 ADD SI,2 ;地址增量 JMP again over:JCXZ exit;防止零作除数(空数组) DIV CX ;求平均值 MOV Average,AXexit: .EXIT END22例3.32 在BLOCK缓冲区中存放着未经排序的字数组,在数组的第一个字 中存放着该数组的长度。在KEYWORD单元中存放着一个数。试编制一程序, 在数组中查找该数,如果找到该数则把 它从数组中删除。算法:未排序的数组,只能用顺序查找法(用串扫描指令)。 要找的元素 : 无,结束程序。有, 在末尾,仅修改数组长度。不在末尾,高地址元素向低地址元素移动一个字,并修改数组长度。23例3.32程序如下: MODEL SMALLDATA BLOCK DW 08H,22H,55H,99H,44H,20H,56H,78H, 52HKEYWORD DW ?CODE STARTUPMOV AX,DATAMOV ES,AXLEA DI,BLOCKMOV AX,KEYWORD ;欲查找的关键字CLDMOV CX,DI ;取数组长度ADD DI, 2 ;指向数组第一个元素 24REPNE SCASW ;查找数组中是否有删除元素(AX -ES:DI,DIDI+2,CXCX-1 )JE DELETE JMP DONE ;未找到删除字则结束DELETE: JCXZ DELLAST ;找到要删除的元素为末尾元素,直接删除LP: MOV BX,DI ;找到要删除的元素为中间元素,高位元素依次低移SUB DI,2 MOV DI,BXADD DI,4LOOP LPDELLAST: DEC BLOCK ;删除该元素,数组长度减1DONE:EXIT END25例3.33 将正数N插入一个按递增排列的正数的字数组的 正确位置。该数组的首地址和末地址分别为HEAD和REAR。算法:1. 因为数组长度是确定的,因此找到插入位置作为循环的结束条件。2. 从数组的尾部向头部查找,逐字取出数组中的一个数与插入元素作比较。三种可能性:如果插入元素大于数组中所有数,则插入到最后。如果插入元素小于本次比较的数组元素,则把本次比较的数组元素向地址增大的方向移动一个字,然后继续查找。如果插入元素小于数组中的所有数,通过在STOP单元 中存放“1”这个数来结束循环,因为插入元素为正数。26从数组的尾部向头部查找,有三种可能性:如果插入元素大于数组中所有数,则第一次比较就可以结束循环。如果插入元素小于本次比较的数组元素,则把本次比较的数组元素向地址增大的方向移动一个字,然后继续查找;直到插入元素大于数组中本次比较的元素,则把元素插入其地址高位,结束程序。为了空出要插入元素的位置,其地址高位的全部元素,都应向地址增大的方向移动一个字。如果插入元素小于数组中的所有数,通过在STOP单元中存放“1”这个数来结束循环,因为插入元素为正数,那它必然大于1。 2728 例3.33程序如下:MODEL SMAL
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号