1、分支结构设计实现分支的方法:1、比较/转移法2、跳转表转移法:比较转移指令可嵌套,但程序结构复杂,跳转表可使程序结构清晰。一、比较转移法例题例1:X为任意有符号字节数,若X为负数,则将其取补码,否则和Y相加,和存入AX中。部分程序如下:MOV AL,XCMP AL,0JGE ADDTNEG ALMOV X,ALJMP EXITADDT: ADD AL,Y ADC AH,0EXIT:例2:字节单元n1、n2中存放无符号数(1) 若两个均为偶,分别加1送d1、d1均为奇数,直接送d1、d2一奇一偶,则把奇d1,偶d2。部分程序如下:MOV AL,N1MOV AH,N2TEST AL,01HJNE
2、L1INC ALINC AHJMP ENDOL1:XCHG AL,AHEND:MOV D1,AL MOV D2,AH例3:在某串中查找某个特定字符,找到显示Y,未找到显示N。分析:在串中依次比较 处理:用到的指令是SCASB和REPNE,用到的寄存器:AL(AX)、ES、DI、CX,DF。DATA SEGMENTSTRING DB How are you!,welcom to china!N EQU $-STRING ; 取得数组长度DATA ENDSCODE SEGMENT ASSUME CS:CODE , ES:DATA ;START: MOV AX,DATA MOV ES,AX LEA
3、DI,STRING MOV CX,N CLD MOV AH,1 INT 21H REPNE SCASB JZ FOUND MOV DL,N JMP DISPFOUND: MOV DL,YDISP: MOV AH,2 INT 21H MOV AH,4CH INT 21HCODE ENDS END START二、利用跳转表实现多路分支跳转表是在某一内存区域顺序排列的一组有规律的入口地址(可以是标号)如是段内分支,每个地址占两个单元(IP)如是段间分支,每个地址占4个单元(CS:IP)采用这种方法步骤:将各标号作为操作数进行定义(段内、段间),关键利用JMP指令跳转到满足条件的各标号处(如何获取标号
4、的问题,以往JMP指令后仅接着就是标号),可采用变址寻址、寄存器间接寻址、基址变址的方式例1:书147方法1:变址寻址DATA SEGMENTDATATAB DW ROUTINE 1各标号在数据段定义 DW ROUTINE 2 DW ROUTINE 8DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME START: PUSH DS SUB BX,BX PUSH BX MOV BX,DATA MOV DA,BX CMP AL,0 JE CONT MOV SI,0LP:SHR AL,1JNB NOT_YETJMP DATATABSINOT_YET: ADD SI,T
5、YPE DATATABJMP LPCONT:ROUTINE1:ROUTINE2:ROUTINE8:RETMAIN ENDPCODE ENDS END START方法2:寄存器间接寻址CMP AL,0 CMP AL,0 JE CONTJE CONTMOV SI,0LEA BX,DATATABLP:SHR AL,1LP:SHR AL,1JNB NOT_YETJNB NOT_YETJMP DATATABSIJMP WORD PRT BX 例2:根据AL(1=AL=8)中的值跳转到相应的标号(SUB1,SUB2)TABLE DW SUB1各标号在数据段定义 SUB2 SUB8DEC ALSHL AL,
6、1MOV AH,0MOV SI,AXLEA BX,TABLEJMP WORD PTR BX+SISUB1:SUB2:SUB8:循环程序设计1、初始化部分 设置初始值2、循环工作部分 具体的操作和运算3、循环修改部分 为下一次循环而修改某些参数4、循环控制部分 判断循环继续还是结束控制方法:(1)计数控制:减、增 (2)条件控制 (3)逻辑尺控制一、计数控制(控制次数可预先判别)单循环例1:将以s1为起始地址的26个字母依次送到以s2为起始地址的联系单元中DATA SEGMENTS1 DB ABCDXYZDATA ENDSESTRA SEGMENTS2 26 DUP(?)ESTRA ENDS方法
7、1:采用变址寄存器间接寻址方法 方法2:采用变址+偏移量寻址方法MOV SI,OFFSET S1 MOV SI,0 MOV DI,OFFSET S2 MOV DI,0 MOV CX,26 MOV CX,26LOP1: MOV AL,SI LOP1:MOV ,S1SI MOV ES:DI,AL MOV ES:S2DI INC SI INC SI INC DI INC DI LOOP LOP1 LOOP LOP1方法3:基址+变址 方法4:串处理MOV BX,OFFSET S1 LEA SI,S1 MOV BP,OFFSET S2 LEA DI,S2 MOV SI,0 MOV CX,26MOV D
8、I,0 CLDMOV CX,26 REP MOVSB LOP1:MOV AL,BX+SI MOV ES:BP+DI,ALINC SIINC DI LOOP LOP1例2:书150页(稍作修改)。试编制一个程序,把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。CODE SEGMENT ASSUME CS:CODESTART: SUB AX,AX MOV BX,1110100001000110B MOV CH,4LP:MOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTAADD AL,07HPRINTA: MO
9、V DL,ALMOV AH,2INT 21HDEC CHJNZ LP MOV AH,4CHINT 21HCODE ENDSEND START例3:书151页(稍作修改)。试编制一个程序,统计Y中1的个数并显示出来分析:利用左移Y,每左移一次,判断Y中的新数现状。DATA SEGMENTY DW 1110100001000110BDATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX,DATAMOV DS,AXSUB AX,AXMOV CL,0MOV AX,YREPEAT: CMP AX,0JZ EXITJNS SHIFTINC CL
10、SHIFT: SHL AX,1JMP REPEATEXIT: MOV DL,CLMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START 以上两个例题都是循环次数可知的情况。增数法:例:s=1+2+3+50,存入s中。NUM DW 1MOV CX,0MOV AX,0ROTATE:ADD AX,NUM INC WORD PTR NUM INC CX CMP CX,50JNZ ROTATEMOV S,AX减数法:NUM DW 1MOV CX,50MOV AX,0ADD_1:ADD AX,NUMINT WORD PTR NUMLOOP ADD_1MOV S
11、,AX二、条件控制法:(循环续)有些情况无法确定循环次数。在问题中找出一个终止循环的条件。每循环一次,对条件进行一次检测,如满足终止循环。利用条件转移指令控制循环是否结束。例1:产生FIB数列(1、1、2、3),要求数列中的最大项小于600,数列存放在以SERIER为首址的缓冲区。数列长达放在FIBONA单元。D_SEG SEGMENTSEGRIER DW 100 DUP(?)FIBONA DB 0MAX DW 600D_SEG ENDSMOV AX,0 ;数列首址MOV BX,1 ;数列次项LEA SI,SERIERAGAIN:MOV SI ,AX XCHG AX,BX ADD AX,BX
12、; 产生当前数列 ADD SI,2 INC FIBONA ; 数项计数 CMP AX,MAX JA NEXT JMP AGAIN例2:(书152页)在附加段中,有一首地址 LIST的字数组,数组第一个字中存放着数组长度,数组首地址存放在DI中,AX寄存器中存放着一个数。编制一程序:在数组中查找该数,找到则把它从数组删除。数组长度879654LIST(书中所列部分为查找和删除的子程序)AX: 9DEL_U1 PROC NEAR CLD PUSH DI MOV CX,ES:DI ADD DI,2 REPNE SCASW ;找到推出,DI指向下一元素 JE DELETE ; 同时ZF=1 POP D
13、I JMP SHORT EXITDELETE: JCXA DEC_CNTNEXT_EL: MOV BX,ES:SI MOV ES:SI-2,BX ADD DI,2 LOOP NEXT_ELDEC_CNT: POP DI DEC WORD PTR ES:SIEXIT: RETDEL_UL: ENDP三、逻辑尺控制法 (循环续)逻辑尺:是由若干明确的二进制位组成的控制字。控制字中每一个二进制位对应一次循环,每次循环允许做不同的事。控制字的长度根据问题的需要而定(一个字节、一个字或几个字或几个连续的存储单元)。逻辑尺控制阀法一般用在多次循环过程分部完成不同操作的程序中。例:已知数据段中有两个长度为8
14、的字数组X和Y。希望编辑计算Z1=X1+Y1 Z2=X2+Y2 Z3=X3-Y3 Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6 Z7=X7-Y7 Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10分析:以上二进制0加,1减。Z1-Z8的8中选择对应的“0”、“1”,组成逻辑尺“10010110”,可用左移指令把尺的各位移入CF,根据状态完成相应的运算。D_SEG SEGMENT X DW X1,X2,X10Y DW Y1,Y2, Y10 Z DW 10 DUP(?) RULE DW 00DCHD_SEG EDNSCODE SEGMENTMAIN PROC FAR ASSUME
15、MOV BX,0MOV CX,10MOV DX,RULENEXT:MOV AX,XBX ; 读X元素 SHL BL,1 JC SUBT ADD AX,YBX JMP SHORT RESUITSUBT:SUB AL,YBXRESUIT:MOV ZBX,AX ADD BX,2 LOOP NEXT RETMAIN ENDPCODE ENDS ENDS START子程序:D_SEG SEGMENT ARRAY DB 10,20,30,5,6COUNT EQU $-ARRAYD_SEG ENDSS_SEG SEGMENTDW 100 DUP(?)C_SEG SEGMENTASSUM CS:C_SEG,
16、DS:D_SEG, SS:S_SEGSTART:LEA SI,ARRAYMOV CX,COUTCALL SUM1CALL DISPLAY子程序SUM1入口参数SI=数组首地址CX=数组长度 出口参数AX=数组和SUM1 PROC NEARCMP CX,0JZ EXITXOR AX,AXAGAIN: ADD AL,SIADC AH,0INC SILOOP AGAINEXIT: RETSUM1 ENDPPROADD PROCNEARPUSH AXPUSH CXPUSH SIXOR AX,AXLEA SI,ARRAYMOV CX,COUNTADDT: ADD AX,SI ADD SI,2LOOP ADDTMOV SUM,AXPOP SIPOP CXPOP AXRETPROADD ENDP地址表传递示例调用子程序前,把所有参数的地址送入地址表,然后把地址表的偏移量通过寄存器带进子程序,子程序从地址表中取得参数地址。求数组之和D_SEG SEGMENTARRAY DW 50 DUP(?)COUNT DW 50SUM DW ?TABLE DW 3 DUP(?)D_SEG ENDSMOV TABLE, OFFSET ARRAYMOV TABLE+2, OFFSET COUNTMOV TABLE+4, OFFSET SUMLEA BX,TABLECALL PROADD