版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第五章第五章 循环与分支程序设计循环与分支程序设计1、编制汇编语言程序的步骤如下:n 分析问题分析问题问题性质、目的、要求、已知条件等等。建立问题性质、目的、要求、已知条件等等。建立相应数学模型。相应数学模型。n 确定算法确定算法把实际问题转化为计算机求解的步骤和方法。把实际问题转化为计算机求解的步骤和方法。n 确定数据结构确定数据结构数据的组织方式,分配存储区数据的组织方式,分配存储区n 绘制流程图绘制流程图形象化描述程序算法。形象化描述程序算法。n 编写程序编写程序将流程图用指令集合来实现。应该将流程图用指令集合来实现。应该“简单明了简单明了、层次清晰、运算正确、短小精悍、层次清晰、运算
2、正确、短小精悍”。 n 上机调试上机调试验证程序功能,反复修改达到完善。验证程序功能,反复修改达到完善。基本步骤基本步骤2 计算机通常不会从程序的第一条指令直接顺序执行到程计算机通常不会从程序的第一条指令直接顺序执行到程序的最后一条指令结束,会根据处理事务的不同而具有不序的最后一条指令结束,会根据处理事务的不同而具有不同的执行流程。程序的流程是由程序的结构决定的。基本同的执行流程。程序的流程是由程序的结构决定的。基本的程序结构有:的程序结构有:2 2、程序基本结构、程序基本结构n 顺序结构顺序结构n 分支结构分支结构n 循环结构循环结构n 子程序结构子程序结构 3 例如,在数据区定义的字符缓冲
3、区如下:DATA SEGMENT Buffer DB 32ACTLEN DB ?STRING DB 32 DUP(?) DATA ENDS2键盘一次输入一个字符串的方法: MOV AX, SEG BufferMOV AX, SEG Buffer /Buffer是存放输入字符串的缓冲区 MOV MOV DSDS, AX, AX /Buffer的段地址存入DS MOV MOV DXDX, Offset Buffer, Offset Buffer/Buffer的偏移地址存入DX MOV Buffer, countMOV Buffer, count /设置存入字符串的最大长度并存入Buffer的首字节
4、; MOV AH, MOV AH, 0A0AH H /设置INT 21H功能参数为0AH INT 21HINT 21H /调用DOS功能By brooks too broad for leaping456顺序结构及简单程序设计 程序设计中最基本的结构是如图所示的顺序结构,它只有一个起始框、一个结束框和一至多个执行模块。具有顺序结构的程序叫做简单程序。 顺序结构中的执行模块可以是一条指令或完成某一功能的程序。简单程序执行的特点是其中的指令或语句是按顺序执行的,没有分支或循环。 开始开始A A B B结束结束7例:设置光标到屏幕左上角。 SET_CURPROC MOV AH,2 MOV BH,0
5、MOV DX,0 INT 10H RET SET_CURENDP 这个程序是顺序执行的,一条指令执行后顺序执行紧接其后的另一条指令。实际上许多程序片段都具有顺序结构。【例】编制一个程序,求下列公式中的【例】编制一个程序,求下列公式中的Z值,并将结果存放到值,并将结果存放到RESULT单元中:单元中:Z=(AB)10500。设。设A、B的值的值分别存放在分别存放在BUFA、BUFB单元中,运算结果不超过单元中,运算结果不超过16位。位。算算 法法:在二进制整数中左移:在二进制整数中左移1位相当于乘位相当于乘2,右移,右移1位相当于位相当于除除2,所以可将(,所以可将(A+B)左移)左移3位完成乘
6、以位完成乘以8的操作,然后再与的操作,然后再与(A+B)左移)左移1位(乘以位(乘以2)的结果相加得到()的结果相加得到(A+B)10的计的计算。算。 n 顺序结构程序顺序结构程序简单程序结构简单程序结构分分 析析:这是一个简单的顺序结构程序,可以直接使用汇编:这是一个简单的顺序结构程序,可以直接使用汇编指令完成。指令完成。数据结构数据结构:存储单元:存储单元RESULT用来存放结果,用来存放结果,BUFA、BUFB存放存放A、B的值,可用寄存器的值,可用寄存器BX存放中间运算结果。存放中间运算结果。程序流程图程序流程图 DATA SEGMENTBUFA DW ?BUFB DW ?RESULT
7、DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,BUFA ;DX=A ADD DX,BUFB ;DX=A+B MOV BX,DX ;BX=DX=A+B MOV CL,3 SAL DX,CL ;DX=(A+B)8 SAL BX,1;BS=(A+B)2 ADD DX,BX ; DX=(A+B)*8+(A+B)*2=(A+B)*10 SUB DX,500 ;DX=(A+B) * 8-500 MOV RESULT,DX MOV AH,4CH ;DOS系统功能调用系统功能调用 INT 21
8、H ;返回操作系统返回操作系统CODE ENDS END START编写程序编写程序【例】用查表法求整数【例】用查表法求整数X的平方值(的平方值(0 xx15的整数),将结果存入的整数),将结果存入RESULT单元中。单元中。 分析分析:用查表法求平方值,首:用查表法求平方值,首先需要建一个用于存放各数平先需要建一个用于存放各数平方值的表,以方值的表,以TABLE表示表表示表头,表中依次存放头,表中依次存放015的平的平方值,将待求数方值,将待求数X放入放入AL寄存寄存器,表的起始地址放入器,表的起始地址放入BX寄寄存器。使用存器。使用XLAT查表指令可查表指令可以将地址以将地址BX+AL上的
9、一个字上的一个字节,即节,即AL数值对应的平方值数值对应的平方值读入读入AL中。中。程序流程图程序流程图 编写程序编写程序DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81,100, 121,144,169,196,225 X DB 9RESULT DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,X MOV BX,OFFSET TABLE;LEA BX,TABLE XLAT MOV RESULT,AL MOV AH, 4CH INT
10、 21HCODE ENDS END START125.1 循环程序设计 DO-UNTILDO-UNTIL结构结构不满足不满足满足满足条件条件循环体循环体循环初始化循环初始化不满足不满足DO-WHILEDO-WHILE结构结构满足满足条件条件循环体循环体循环初始化循环初始化135.1.2 循环程序设计方法无论使用哪种循环结构,循环程序一般应包括以下几部分: 循环初始化循环初始化。包括设置循环次数的初值、地址指针初始设置等。 循环体循环体。循环工作主体,包括要重复执行的操作以及循环的修改部分。修改部分包括地址指针的修改、循环控制条件的修改等。 循环控制部分循环控制部分:判断循环条件满足与否,常用方
11、法:计数控制、特征值控制、地址边界控制等。特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。否则会得不到期望的结果。14例例5.1:把:把 BX BX 中的二进制数以十六进制的形式显示在屏幕上中的二进制数以十六进制的形式显示在屏幕上 如:如:1011 0010 1111 1010 B H BXBX11 0 1 1 0 0 1 0 1 1 1 1 1 0 1 01 0 1 10 0 1 01 0 1 01 1 1 10 0 1 01 0 1 11 0 1 01 1 1 10 0 1 01 0 1 11 0 1 01 1 1 10 0 1 01 0 1 11 0 1 01 1
12、 1 1234分析:分析:(1)程序结构的确定程序结构的确定由题意由题意,显然这,显然这可以用循环结构来完成可以用循环结构来完成,循环次数为,循环次数为4。用何种移用何种移位指令?位指令?15 (2)循环体的构成(算法确定)循环体的构成(算法确定) 循环体应该包括:循环体应该包括: (a) BX循环左移一个数位循环左移一个数位 (b)把最右边的数位转换为把最右边的数位转换为ASCII (c)显示字符显示字符. 需要了解相关知识需要了解相关知识:字符和其字符和其ASCII码之间的关系?码之间的关系? “0”“9” 30H39H, (0 + 30H = 30H)“A”F” 41H46H (A +
13、37H = 41H = A + 30H +7H)如何显示一个字符?如何显示一个字符? (a)将显示字符的将显示字符的ASCII码放入码放入DL寄存器;寄存器; (b)将将AH的内容置为的内容置为2(功能号);(功能号); (c)执行执行INT 21H(DOS 功能调用)功能调用).16(3)循环控制条件分析)循环控制条件分析因为循环次数已知,可以使用计数值作为循环控制条件。因为循环次数已知,可以使用计数值作为循环控制条件。可以使用可以使用实现。实现。!如何解决?如何解决?用用PUSH PUSH 和和 POPPOP指令解决指令解决17 mov cx, 4 mov cx, 4 ;初始化;初始化 m
14、ov cl, 4 mov cl, 4 ;设置移动的位数;设置移动的位数 rol bx, cl rol bx, cl ;循环左移;循环左移 mov al, bl mov al, bl ;避免;避免bxbx中的数被修改中的数被修改 and al, 0fh and al, 0fh ;高;高4 4位清零位清零 add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jb printit jb printit add al, 7h add al, 7h ; AF ASCII 41H46H; AF
15、 ASCII 41H46H mov dl, al mov dl, al mov ah, 2 mov ah, 2 int 21h int 21h loop rotate loop rotate 方法方法1 (LOOP)rotate:容易出错处1容易出错处4容易出错处3容易出错处2printit: 结束结束开始开始初始化循环计数值初始化循环计数值BX循环左移一个数位循环左移一个数位把最右边的数位转换为把最右边的数位转换为ASCII(即将最右边的数位即将最右边的数位+30H)是是ASCII AF?Y加上加上7显示一个字符显示一个字符循环计数值循环计数值=0?YNN用隐藏的cx作为控制条件printi
16、t: 18除了可以使用LOOP指令之外,还可以使用来实现。如何实现?LOOP AGAIN DEC 计数器计数器 JNZ AGAIN19 mov mov , 4 , 4 ;初始化;初始化rotate: mov rotate: mov , 4, 4 rol bx, cl rol bx, cl mov al, bl mov al, bl and al, 0fh and al, 0fh add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jl printit jl printit add
17、al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46Hprintit: printit: mov dl, almov dl, al mov ah, 2 mov ah, 2 int 21h int 21h 方法方法2 (条件跳转指令条件跳转指令)将将cx分成分成ch和和cl两部分使用两部分使用代替loop rotate2021 mov bx, 0 mov bx, 0newchar: mov ah, 1 newchar: mov ah, 1 ;键盘输入;键盘输入 int 21hint 21h sub al, 30h sub al, 30h jl e
18、xit ; jl exit ; 00退出退出,分支,分支1 1 cmp al, 10 cmp al, 10 jl add_to jl add_to ;分支;分支2 2 sub al, 27h ; af sub al, 27h ; af cmp al, 0ah cmp al, 0ah jl exit ; jl exit ; aff退出退出,分支,分支4 4add_to: mov cl, 4add_to: mov cl, 4 shl bx, cl shl bx, cl mov ah, 0 mov ah, 0 add bx, ax add bx, ax jmp newchar jmp newchar
19、 ;无条件死循环;无条件死循环exit: exit: (016)+1) 16+0a) 16+0f22例例5.2 在在ADDR单单元存放着数元存放着数Y的的地址,试编制一地址,试编制一程序把程序把Y中中1的的个数存入个数存入COUNT单元中单元中开始1的个数计数器0循环次数计数器CX16Y左移一次CF=11的个数计数器+1CX CX-1=0COUNT 1的个数计数器结束NYNY循环次数固定循环次数固定,完全由循环计数器控制完全由循环计数器控制23DATA SEGMENTYDW 1234HADDRDW YCOUNTDB ?DATAENDSCODESEGMENTASSUME CS:CODE,DS:D
20、ATASTART:MOV AX,DATAMOV DS,AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16REPEAT:SHL AX,1JNC NEXTINC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DLMOV AH,4CHINT 21HCODEENDSEND START例例5.224开始1的个数计数器0循环次数计数器CX16Y左移一次CF=11的个数计数器+1CX CX-1=0COUNT 1的个数计数器结束NYNYY=0NY例例5.225DATA SEGMENTYDW 1234HADDRDW YCOUNTDB ?DATAENDSCODES
21、EGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16REPEAT:SHL AX,1JNC NEXTINC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DLMOV AH,4CHINT 21HCODEENDSEND STARTCMP AX,0JZ EXIT0例例5.2JMP REPEAT26作业:Page193 5.15.8 27例5.3 在附加段中,有一个首地址为LIST和未经排序的字数组。在数组的第一个字中,存放着该数组的长度,数组的首地址已
22、存放在DI寄存器中,AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数,则把它从数组中删除。LISTL LISTDI N AXL从哪头开始查找?28del_ul proc near cld push di mov cx,es:di add di,2 repne scasw je delete pop di jmp short exitdelete: jcxz dec_cntnext_el: mov bx,ex:di mov es:di-2,bx add di,2 loop next_eldec_cnt: pop di dec word ptr es:diexit: ret
23、del_up endp最后一个是,直接把长度减1如果有多个需要删除的数,怎么办?29例例5.4 :将正数将正数 n n 插入一个已整序的正数字数组。该数组的首地插入一个已整序的正数字数组。该数组的首地址和末地址分别为址和末地址分别为ARRAY_HEAD, ARRAY_END。x dw ?x dw ?array_head dw 3,5,15,23,37,49,52,65,78,99 array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105array_end dw 105n dw 32 n dw 32 30由于数组已经排好序,因此可以将正
24、数由于数组已经排好序,因此可以将正数n依次和数组中的数进依次和数组中的数进行比较,比较有个方向问题,行比较,比较有个方向问题,怎样比较最简单?怎样比较最简单? 当遇到第一个比当遇到第一个比n小的数,记下该位置,该位置的下一个位置小的数,记下该位置,该位置的下一个位置就是要插入就是要插入n 的位置。的位置。31将正数将正数 n n 插入一个已整序的正数字数组插入一个已整序的正数字数组(P166例题例题5.4)mov ax, nmov ax, nmov array_head-2, 0ffffhmov array_head-2, 0ffffhmov si, 0mov si, 0compare:com
25、pare:cmp array_end si, axcmp array_end si, axjle insertjle insertmov bx, array_end simov bx, array_end simov array_end si+2, bxmov array_end si+2, bxsub si, 2 sub si, 2 jmp short comparejmp short compareinsert:insert:mov array_end si+2, axmov array_end si+2, ax32例例5.55.5:有数组:有数组 x(x1,x(x1,x2,x2,x10)
26、 ,x10) 和和 y(y1,y2,y10)y(y1,y2,y10), 编程计算编程计算 z z(z1,(z1,z2,z2,z10),z10)z1 = x1 + y1z1 = x1 + y1z2 = x2 + y2z2 = x2 + y2z3 = x3 - y3z3 = x3 - y3z4 = x4 - y4z4 = x4 - y4z5 = x5 - y5z5 = x5 - y5z6 = x6 + y6z6 = x6 + y6z7 = x7 - y7z7 = x7 - y7z8 = x8 - y8z8 = x8 - y8z9 = x9 + y9z9 = x9 + y9z10= x10 + y1
27、0z10= x10 + y10 逻辑尺:逻辑尺:0 0 1 1 0 1 1 1 0 00 0 1 1 0 1 1 1 0 0X1+Y1X2+Y2X3-Y3余类推33 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10lo
28、gic_rule dw 00dch ;0000,0000,1101,1100logic_rule dw 00dch ;0000,0000,1101,1100 mov bx, 0mov bx, 0 mov cx, 10 mov cx, 10 mov dx, logic_rule mov dx, logic_rulenext: mov ax, xbxnext: mov ax, xbx shr dx, 1 shr dx, 1 jc subtract jc subtract add ax, ybx add ax, ybx jmp short result jmp short result ; ; 向前
29、引用向前引用subtract: subtract: sub ax, ybx sub ax, ybxresult: mov zbx, axresult: mov zbx, ax add bx, 2 add bx, 2 loop next loop next 34总结:这种设置逻辑尺的方法非常有用。例如要传输一批数据(定义为一个数组),该数组中含有多个0元素,为了节省存储空间和传输时间,可以选用合适的数据结构。比如可以使用压缩数据及逻辑尺的方法,把所有元素按下标顺序排列,并各用1个bit表示。设0元素用0表示,非0元素用1表示。存储时只需保存非0元素(压缩数组)和逻辑尺,当进行数据传输时,若逻辑尺
30、相应位为1,则从压缩数组中取到非0数据并传送。若逻辑尺相应位为0时,只送一个标志,在接收方直接生成数字0,这样可以提高传输效率35例5.6 试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序。 20H20H L36datarea segment buffer db 80 dup(?)flag db ?datarea endsprognam segment assume cs:prognam,ds:datareastart: mov ax,d
31、atarea mov ds,ax lea bx,buffermov flag,0next: mov ah,1 int 21h test flag,01h jnz follow cmp al,20h jnz exit mov flag,1 jmp nextfollow: cmp al,20h jz exit mov bx, al inc bx jmp nextexit: mov ah, 4ch int 21h prognam ends end start 设置标志状态,0表示开始接受输入,1表示随后的正常输入37例:在字型无序表中找出最大数和最小数,并分别存入MAX和MIN单元。算法分析:把表中
32、第一个元素分别作为最大数和最小数,与下一个元素比较,若下一个元素比该元素大,则把下一个元素作为最大数,继续进入下一轮比较;若下一个元素比该元素小,则把下一个元素作为最小数,继续进入下一轮比较直至遍历整个表,最后保留下来的两个数就分别是表中的最大数和最小数。本例采用DO_UNTIL结构实现。38程序:STACKSG SEGMENT STACK STK DW 32 DUP(S)STACKSG ENDSDATA SEGMENTBUFFER DW 500,30,56,77,999,67,433, 5675,0,9999;无序表 DW 3455,6578,32766,8,0, 32560,45,889,
33、5665,09CN DW ($-BUFFER)/2 ;元素个数MAX DW ?;存放最大数单元MIN DW ? ;存放最小数单元DATA ENDS39CODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA SI,BUFFER ;初始化地址指针 MOV CX,CN ;元素个数 MOV AX,SI ;取第一数 MOV MAX,AX ;初始化最大数 MOV MIN,AX ;初始化最小数40COMP: ADD SI,2 ;修改地址指针 MOV AX,SI;取
34、下一个数 CMP AX,MAX;与当前的最大数比较 JLE NEXT ;若小于转 MOV MAX,AX ;若大于则把此数作为最大数保存 JMP SHORT LOPNEXT: CMP AX,MIN;与当前的最小数比较 JGE LOP ;若大于转 MOV MIN,AX ;若小于则把此数作为最小数保存LOP: LOOP COMP;决定循环继续还是终止 RETMAIN ENDPCODE ENDS END MAIN41例:自定义一个按降序排列的字型数组,在数组中查找指定的数字,若找到在屏幕上显示“Duplication!”,否则插入该数字在适当位置并继续保持数组有序,且显示“Inserted!”。算法:
35、先使用字符串指令进行块 查找,若找到则显示“Duplication!”后退出。若未找到则从数组中第一个数开始比较。由于数组是降序的,所以当数组中当前元素比指定数字小时,说明该数组中无指定数字,则应插入之,且显示“Inserted!”。否则把数据前移一个位置,为以后要插入的数据腾出空间,继续循环对下一个数进行比较. 这是一个初始循环次数不定、根据条件控制循环的例子42程序:DATA SEGMENTPRT DB Duplication,$INS DB Inserted!,$X DW ? ;为数据移动预留空间TAB DW 889,754,589,546,52,31 ;降序数组CT EQU ($-TA
36、B)/2 ;元素个数N DW 234 ;要插入的数字DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA43 PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,TAB;装入表首址 MOV AX,N;要插入的数字 MOV CX,CT;个数 CLD REPNZ SCASW JE A;找到转 MOV SI,0COMPARE:CMP TABSI,AX ;比较44 JL B MOV BX,TABSI ;元素前移为插入的数字腾位置 MOV TABSI-2,BX AD
37、D SI,2 ;修改地址指针 JMP SHORT COMPAREA: MOV AH,9H LEA DX,PRT INT 21H JMP EXITB: MOV TABSI-2,AX ;插入元素 MOV AH,9 LEA DX,INS INT 21HEXIT: RET MAIN ENDPCODE ENDS END MAIN455.1.3 5.1.3 多重循环程序设计多重循环程序设计有些比较复杂的问题使用一重循环可能无法解决,此时就需要设计多重循环程序。对于多重循环程序设计,需要注意循环初始设置、循环入口、循环控制条件的修改等;还要注意内、外循环体不能交叉;在每次通过外层循环再次进入内层循环时,内层
38、循环的初始条件必须重新设置46一个简单延时程一个简单延时程序:(双重循环)序:(双重循环) mov cx,100n_start: mov dx,0ffffhn_loop: dec dx jnz n_loop dec cx jnz n_start外循环初始化外循环初始化内循环初始化内循环初始化内层循环体内层循环体外层循环体外层循环体内循环结束内循环结束外循环结束外循环结束NNYY47例5.7:有一个首地址为A的N字数组,请编程使该数组中的数按照从小到大的次序排序分析:采用起泡排序算法。从第一个数据开始依次对相邻两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍进行(N
39、-1)次比较后最大的数放到了最后;第二遍进行(N-2)次比较;总共最多进行(N-1)遍比较就可以完成排序还可以采用设立测试标志的方法来进行起泡排序48例例: 将首地址为将首地址为A的字数组从小到大排序的字数组从小到大排序32,85,16,15, 832,85,16,15, 8 (冒泡算法,多重循环)(冒泡算法,多重循环) 序号 数比比 较较 遍遍 数数1234 1 32 2 85 3 16 4 15 5 832161588516158328515816328581516328549 mov cx, 5 ; mov cx, 5 ;元素个数元素个数 dec cx ;dec cx ;比较遍数比较遍数
40、: : mov bx, 0mov bx, 0: : mov ax, Abx ; mov ax, Abx ;相邻两数相邻两数 cmp ax, Abx+2 ; cmp ax, Abx+2 ; 比较比较 jle continuejle continue xchg ax, Abx+2 ; xchg ax, Abx+2 ;交换位置交换位置 mov Abx, axmov Abx, axcontinue:continue: add bx, 2 add bx, 2 loop loop loop loop 50作业:Page193194 5.95.165.2 5.2 分支程序设计分支程序设计5.2.1 分支程序
41、的结构形式不满足满足IFTHENELSE结构CASE结构条件条件C112nC2Cn5.2.2 5.2.2 分支程序设计方法分支程序设计方法(1) 逻辑尺控制逻辑尺控制(2) 条件控制条件控制(3) 地址跳跃表地址跳跃表(值与地址有对应关系的表)(值与地址有对应关系的表)常用的分支方法:常用的分支方法:在实际程序设计中,很少有程序会从头到尾都是顺序执行的,在实际程序设计中,很少有程序会从头到尾都是顺序执行的,绝大部分程序在执行过程中会根据一些条件的判断决定不同的绝大部分程序在执行过程中会根据一些条件的判断决定不同的处理方式或程序流向,这就是分支的概念。处理方式或程序流向,这就是分支的概念。程序的
42、流向是由程序的流向是由CS和和IP中的值决定的,中的值决定的,当程序的转移仅在同一当程序的转移仅在同一段内进行时,只需修改偏移地址段内进行时,只需修改偏移地址IP的值;如果程序的转移是在的值;如果程序的转移是在不同段之间进行,则段基址不同段之间进行,则段基址CS和偏移地址和偏移地址IP均需要修改。均需要修改。两要素两要素:一是分支前的条件判断;二是根据判断结果进行转移。一是分支前的条件判断;二是根据判断结果进行转移。 在附加段中,有一个按从小到大顺序排列的无符号字数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度。在AX中有一个无符号数,要求在数组中查找(AX),如找到,则使C
43、F = 0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF = 1。 54data segmentdata segmentarray dw 12,11,22,33,44,55,66,array dw 12,11,22,33,44,55,66, 77,88,99,111,222,333 77,88,99,111,222,333number dw 55number dw 55low_idx dw ?low_idx dw ?high_idx dw ?high_idx dw ?data endsdata ends例题例题5.9 折半查找算法(折半查找算法(P P177177)搜索前,先查找
44、两端的元素值56 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9101011111212 57 lea di, array mov ax, number ;要查找数要查找数 cmp ax, di+2 ;(ax)(ax)与第一个元素比较与第一个元素比较 ja chk_last lea si, di+2 je exit ;(ax)(ax)第一个元素第一个元素, ,找到退出找到退出 stc jmp exit ;(ax)(ax)(ax)最后一个元素最后一个元素, ,未找到退出未找到退出58compare:compare: cmp ax, bx+si cmp ax, bx
45、+si je exit je exit ja higher ja higher dec cxdec cx mov high_idx, cx mov high_idx, cx jmp mid jmp midhigher:higher: inc cxinc cx mov low_idx, cx mov low_idx, cx jmp mid jmp midno_match:no_match: stc stcexit:exit: search:search: mov low_idx, 1 mov low_idx, 1 mov bx, di mov bx, di mov high_idx, bx mov high_idx, bx mov bx, di mov bx, dimid:mid: mov cx, low_idx mov cx, low_idx mov dx, high_idx mov dx, high_idx cmp cx, dx cmp cx, dx ja no_match ja no_match add cx, dx add cx, dx shr cx, 1 shr cx, 1 mov si, cx mov si, cx shl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版分期付款合同书
- 二零二五年能源管理评估合同能源管理协议3篇
- 无锡南洋职业技术学院《石油钻采机械概论》2023-2024学年第一学期期末试卷
- 2024版高清影视内容制作与版权转让合同
- 2025年度体育场馆草坪除草与赛事运营保障合同3篇
- 2024法律顾问协议
- 2024版建筑行业招投标规则与协议签订指南版B版
- 皖江工学院《商业展示设计》2023-2024学年第一学期期末试卷
- 天津体育学院《环境科学概论(Ⅱ)》2023-2024学年第一学期期末试卷
- 塔里木职业技术学院《工笔人物画》2023-2024学年第一学期期末试卷
- 2024年石家庄正定国际机场改扩建工程合同
- 2025年度爱读书学长定制化阅读计划合同2篇
- 河南省信阳市浉河区9校联考2024-2025学年八年级上学期12月月考地理试题(含答案)
- 快速康复在骨科护理中的应用
- 国民经济行业分类和代码表(电子版)
- ICU患者外出检查的护理
- 公司收购设备合同范例
- GB/T 44823-2024绿色矿山评价通则
- 广东省潮州市2023-2024学年高二上学期语文期末考试试卷(含答案)
- 漂亮的可编辑颜色鱼骨图PPT模板
- 锅炉安装表格(全套)
评论
0/150
提交评论