《汇编循环与分支程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编循环与分支程序设计.ppt(66页珍藏版)》请在第壹文秘上搜索。
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 M
5、OV 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 ?RESULTDW
7、?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 21H ;
8、返回操作系统返回操作系统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 21HC
10、ODE 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 1 12
12、34分析:分析:(1)程序结构的确定程序结构的确定由题意由题意,显然这,显然这可以用循环结构来完成可以用循环结构来完成,循环次数为,循环次数为4。用何种移用何种移位指令?位指令?15 (2)循环体的构成(算法确定)循环体的构成(算法确定) 循环体应该包括:循环体应该包括: (a) BX循环左移一个数位循环左移一个数位 (b)把最右边的数位转换为把最右边的数位转换为ASCII (c)显示字符显示字符. 需要了解相关知识需要了解相关知识:字符和其字符和其ASCII码之间的关系?码之间的关系? “0”“9” 30H39H, (0 + 30H = 30H)“A”F” 41H46H (A + 37H =
13、 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 ;初始化;初始化 mov cl
14、, 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 ASCI
15、I 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作为控制条件printit: 18
16、除了可以使用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 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