从程序结构角度展开程序设计重点掌握分支结构

上传人:工**** 文档编号:587579295 上传时间:2024-09-06 格式:PPT 页数:70 大小:255.52KB
返回 下载 相关 举报
从程序结构角度展开程序设计重点掌握分支结构_第1页
第1页 / 共70页
从程序结构角度展开程序设计重点掌握分支结构_第2页
第2页 / 共70页
从程序结构角度展开程序设计重点掌握分支结构_第3页
第3页 / 共70页
从程序结构角度展开程序设计重点掌握分支结构_第4页
第4页 / 共70页
从程序结构角度展开程序设计重点掌握分支结构_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《从程序结构角度展开程序设计重点掌握分支结构》由会员分享,可在线阅读,更多相关《从程序结构角度展开程序设计重点掌握分支结构(70页珍藏版)》请在金锄头文库上搜索。

1、综合应用第2章硬指令和第3章伪指令,第4章从程序结构角度展开程序设计,重点掌握:分支结构程序设计循环结构程序设计子程序结构程序设计第章 基本汇编语言程序设计14.1 顺序程序设计l顺序程序结构是指完全按顺序逐条执行的指令序列,这在程序段中是大量存在的,是最基本、最常见的程序结构,但作为完整的程序则很少见2例:简单计算例:简单计算.model small.stack.dataXdw 5Ydw 6Zdw 7 .code.startupmov ax,Xadd ax,Yadd ax,Zmov dl,al;入口参数:DLALmov ah,2;02号DOS功能调用int 21h;显示一个ASCII码字符.

2、exit 0end34.2 分支程序设计l分支程序根据条件是真或假决定执行与否l判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志l转移指令Jcc和JMP可以实现分支控制;还可以采用MASM 6.x提供的条件控制伪指令实现4单分支程序设计l条件成立跳转,否则顺序执行分支语句体;注意选择正确的条件转移指令和转移目标地址5cmp ax,0jns nonneg;分支条件:AX0neg ax;条件不满足,求补nonneg: mov result,ax;条件满足例:计算AX的绝对值6双分支程序设计条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体。注意第1个分支体后一定要有一个J

3、MP指令跳到第2个分支体后7例例: :显示显示BXBX最高位最高位shl bx,1;BX最高位移入CFjc one ;CF1,即最高位为1,转移mov dl,0 ;CF0,即最高位为0,DL0jmp two;一定要跳过另一个分支体one: mov dl,1 ;DL1two: mov ah,2int 21h;显示8mov dl,0 ;DL0shl bx,1;BX最高位移入CFjnc two ;CF0,最高位为0,转移mov dl,1 ;CF1,最高位为1,DL1two: mov ah,2int 21h;显示例例: :显示显示BXBX最高位最高位9多分支程序设计l多个条件对应各自的分支语句体,哪个

4、条件成立就转入相应分支体执行。多分支可以化解为双分支或单分支结构的组合,例如: or ah,ah;等效于cmp ah,0 jz function0;ah0,转向function0 dec ah;等效于cmp ah,1 jz function1;ah1,转向function1 dec ah;等效于cmp ah,2 jz function2;ah2,转向function210地址表形成多分支l需要在数据段事先安排一个按顺序排列的转移地址表l输入的数字作为偏移量。因为只有2个字节16位偏移地址,所以偏移量需要乘2l关键是要理解间接寻址方式JMP指令地址表地址表分支分支1地址地址分支分支2地址地址.T

5、able db disp1, disp2, disp3, disp4, .12.datamsgdb Input number(18):,0dh,0ah,$msg1db Chapter 1 : .,0dh,0ah,$msg2db Chapter 2 : .,0dh,0ah,$.msg8db Chapter 8 : . ,0dh,0ah,$tabledw disp1,disp2,disp3,disp4dw disp5,disp6,disp7,disp8;取得各个标号的偏移地址例例: : 数据段数据段此处等同于此处等同于 offset disp113start1:mov dx,offset msg;

6、提示输入数字mov ah,9int 21hmov ah,1;等待按键int 21hcmp al,1;数字 8?ja start1and ax,000fh;将ASCII码转换成数字14dec axshl ax,1;等效于add ax,axmov bx,axjmp tablebx;(段内)间接转移:IPtable+bxstart2:mov ah,9int 21h.exit 0disp1:mov dx,offset msg1;处理程序1jmp start2.可以改为可以改为 call tablebx对应修改为对应修改为 ret154.3 循环程序设计l循环结构一般是根据某一条件判断为真或假来确定是否

7、重复执行循环体l循环指令和转移指令可以实现循环控制;还可以采用MASM 6.x提供的循环控制伪指令实现16循环结构 结束结束 初始化初始化 循环的初始状态循环的初始状态 循环体循环体 循环的工作部分循环的工作部分及修改部分及修改部分 计数控制循环计数控制循环条件控制循环条件控制循环修改部分修改部分控制条件控制条件Y YN N17.model small.stack.datasumdw ?.code.startupxor ax,ax;被加数AX清0mov cx,100again:add ax,cx;从100,99,.,2,1倒序累加loop againmov sum,ax;将累加和送入指定单元.

8、exit 0end例例4.5 4.5 求求1-1001-100的和的和 计数控制循环计数控制循环,循环次数固定循环次数固定18 mov ah,1;从键盘输入一个字符 int 21h mov bl,al;BLAL字符的ASCII码 ;DOS功能会改变AL内容,故字符ASCII码存入BL mov ah,2 mov dl,:;显示一个分号,用于分隔 int 21h mov cx,8;CX8(循环次数)again: shl bl,1;左移进CF,从高位开始显示mov dl,0;MOV指令不改变CFadc dl,30h;DL030HCF ;CF若是0,则DL0;若是1,则DL1mov ah,2int 2

9、1h;显示loop again;CX减1,如果CX未减至0,则循环例例例例: : : :用二进制显示从键盘输入的一个字符的用二进制显示从键盘输入的一个字符的ASCIIASCII码码19mov bx,offset stringagain:mov al,bx;取一个字符or al,al;是否为结尾符0jz done;是,退出循环cmp al,A;是否为大写AZjb nextcmp al,Zja nextor al,20h ;是,转换为小写字母(使D5=1)mov bx,al;仍保存在原位置next:inc bxjmp again;继续循环done:.exit 0例例例例4.7 4.7 4.7 4.

10、7 大小写大小写大小写大小写 条条件件控控制制循循环环,利利用用标标志志退退出出大小写字母仅大小写字母仅 D D5 5位不同位不同20冒泡法l“冒泡法”是一种排序算法,不是最优的算法,但它易于理解和实现l冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次大的元素排在后面;如此重复,直至完成就实现元素从小到大的排序l这需要一个双重循环程序结构21mov cx,count;CX数组元素个数dec cx;元素个数减1为外循环次数outlp: mov dx,cx;D

11、X内循环次数mov bx,offset arrayinlp:mov al,bx;取前一个元素cmp al,bx+1;与后一个元素比较jna next;前一个不大于后一个元素,则不进行交换xchg al,bx+1;否则,进行交换mov bx,alnext:inc bx;下一对元素dec dxjnz inlp;内循环尾loop outlp;外循环尾 计数控制双重循环计数控制双重循环23;现有一个以$结尾的字符串,要求剔除其中的空格.datastringdb Let us have a try !,$.code.startupmov si,offset stringoutlp:cmp byte pt

12、r di,$ ;外循环,先判断后循环jz done;为$结束cmp byte ptr si, ;检测是否是空格jnz next;不是空格继续循环例例例例: : : :剔除空格剔除空格剔除空格剔除空格24mov di,si;是空格,进入剔除空格分支;该分支是循环程序段inlp:inc dimov al,di;前移一个位置mov di-1,alcmp byte ptr di,$;内循环,先循环后判断jnz inlpjmp outlpnext:inc si;继续对后续字符进行处理jmp outlpdone:.exit 0;结束 条件控制双重循环条件控制双重循环254.4 子程序设计l把功能相对独立的

13、程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序l子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率264.4.1 4.4.1 程序定义伪指令程序定义伪指令格式格式: :过程名过程名 proc near|farproc near|far.过程名过程名endpendpl过程名(子程序名)为符合语法的标识符NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用l对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为near;在中型、大型和巨型存储模式下,过程的缺省属性为farl对完整段

14、定义格式,过程的缺省属性为nearl用户可以在过程定义时用near或far改变缺省属性27子程序的常见格式subnameproc;具有缺省属性的subname过程push ax ;保护寄存器:顺序压入堆栈push bx ;ax/bx/cx仅是示例push cx;过程体,程序的主要功能pop cx ;恢复寄存器:逆序弹出堆栈pop bxpop axret;过程返回subnameendp;过程结束28;子程序功能:实现光标回车换行dpcrlfproc;过程开始push ax;保护寄存器AX和DXpush dxmov dl,0dh;显示回车mov ah,2int 21hmov dl,0ah;显示换行

15、mov ah,2int 21hpop dx;恢复寄存器DX和AXpop axret;子程序返回dpcrlfendp;过程结束例例: :无参数传递的子程序无参数传递的子程序29ALdispproc;实现al内容的显示push ax;过程中使用了AX、CX和DXpush cxpush dxpush ax;暂存axmov dl,al;转换al的高4位mov cl,4shr dl,clor dl,30h;al高4位变成3cmp dl,39hjbe aldisp1add dl,7;是0Ah0Fh,还要加上7aldisp1:mov ah,2;显示int 21h例例例例: : : :实现实现实现实现ALAL

16、ALAL内容显示的子程序内容显示的子程序内容显示的子程序内容显示的子程序30pop dx;恢复原ax值到dxand dl,0fh;转换al的低4位or dl,30hcmp dl,39hjbe aldisp2add dl,7aldisp2:mov ah,2;显示int 21hpop dxpop cxpop axret;过程返回ALdispendp31.;主程序mov bx,offset array;调用程序段开始mov cx,countdisplp:mov al,bxcall ALdisp;调用显示过程mov dl,;显示一个逗号,分隔数据mov ah,2int 21hinc bxloop di

17、splp;调用程序段结束.exit 0.;过程定义end32HTOASCproc;将AL低4位表达的一位16进制数转换为ASCII码and al,0fhcmp al,9jbe htoasc1add al,37h;是0AH0FH,加37Hret;子程序返回htoasc1:add al,30h;是09,加30Hret;子程序返回HTOASCendp例例例例: : : :具有多个出口的子程序具有多个出口的子程序具有多个出口的子程序具有多个出口的子程序334.4.2 子程序的参数传递l入口参数(输入参数):主程序提供给子程序l出口参数(输出参数):子程序返回给主程序l参数的形式: 数据本身(传值) 数

18、据的地址(传址)l传递的方法: 寄存器 变量 堆栈34例4.11 求校验和l子程序计算数组元素的“校验和”l校验和是指不记进位的累加入口参数:数组的逻辑地址(传址)元素个数(传值)出口参数:求和结果(传值)35l把参数存于约定的寄存器中,可以传值,也可以传址。l子程序对带有出口参数的寄存器不能保护和恢复(主程序视具体情况进行保护)l子程序对带有入口参数的寄存器可以保护,也可以不保护;但最好一致例:入口参数:CX元素个数,DS:BX数组的段地址:偏移地址出口参数:AL校验和用寄存器传递参数36.startup ;设置入口参数(含有DS数组的段地址)mov bx,offset array ;BX数

19、组的偏移地址mov cx,count;CX数组的元素个数call checksuma;调用求和过程mov result,al;处理出口参数.exit 037checksumaprocxor al,al;累加器清0suma:add al,bx;求和inc bx;指向下一个字节loop sumaretchecksumaendpend38l主程序和子程序直接采用同一个变量名共享同一个变量,实现参数的传递l不同模块间共享时,需要声明例例: :入口参数:count元素个数,array数组名(含段地址:偏移地址)出口参数:result校验和用变量传递参数39;主程序 call checksumb;子程序c

20、hecksumbprocpush axpush bxpush cxxor al,al;累加器清0mov bx,offset array;BX数组的偏移地址mov cx,count;CX数组的元素个数40sumb:add al,bx;求和inc bxloop sumbmov result,al ;保存校验和pop cxpop bxpop axretchecksumbendp41l主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数l子程序将出口参数压入堆栈,主程序弹出堆栈取得它们例例: :入口参数:顺序压入偏移地址和元素个数出口参数:AL校验和用堆栈传递参数42.startupmov ax,

21、offset arraypush axmov ax,countpush axcall checksumcadd sp,4mov result,al.exit 0 要要注注意意堆堆栈栈的的分分配配情情况况,保保证证参参数数存存取取正正确确、子子程程序序正正确确返回,并保持堆栈平衡返回,并保持堆栈平衡43checksumcprocpush bpmov bp,sp;利用BP间接寻址存取参数push bxpush cxmov bx,bp+6 ;SS:BP+6指向偏移地址mov cx,bp+4 ;SS:BP+4指向元素个数xor al,alsumc:add al,bx inc bxloop sumcpo

22、p cxpop bxpop bpretchecksumcendp44子程序的嵌套子程序内包含有子程序的调用就是子程序嵌套没有什么特殊要求46ALdispprocpush axpush cx;实现al内容的显示push ax;暂存axmov cl,4shr al,cl;转换al的高4位call htoasc;子程序调用(嵌套)pop ax;转换al的低4位call htoasc;子程序调用(嵌套)pop cxpop axretALdispendp例例: :嵌套子程序嵌套子程序47;将AL低4位表达的一位16进制数转换为ASCII码HTOASCprocpush axpush bxpush dxmo

23、v bx,offset ASCII;BX指向ASCII码表and al,0fh;取得一位16进制数xlat CS:ASCII;换码:ALCS:BXAL,注意数据在代码段CS mov dl,al;显示mov ah,2int 21hpop dxpop bxpop axret;子程序返回;子程序的数据区ASCIIdb 30h,31h,32h,33h,34h,35h,36h,37hdb 38h,39h,41h,42h,43h,44h,45h,46hHTOASCendp48 这是一个具有局部变量的子程序。因为数据区与子程序都在代码段,所以利用了换码指令XLAT的另一种助记格式(写出指向缓冲区的变量名,目

24、的是便于指明段超越前缀)。串操作MOVS、LODS和CMPS指令也可以这样使用,以便使用段超越前缀 除采用段超越方法外,子程序与主程序的数据段不同时,我们还可以通过修改DS值实现数据存取;但需要保护和恢复DS寄存器49子程序的递归l当子程序直接或间接地嵌套调用自身时称为递归调用,含有递归调用的子程序称为递归子程序l递归子程序必须采用寄存器或堆栈传递参数,递归深度受堆栈空间的限制例:求阶乘 N!= N*(N-1)! 当N0 1 当N=050.model small.stack 256.dataNdw 3resultdw ?.code.startupmov bx,Npush bx;入口参数:Nca

25、ll fact;调用递归子程序pop result;出口参数:N!.exit 0例例: :51;计算N!的近过程;入口参数:压入 N;出口参数:弹出 N!fact procpush axpush bpmov bp,spmov ax,bp+6 ;取入口参数 Ncmp ax,0jne fact1;N0,N!N(N-1)!inc ax;N0,N!1jmp fact252fact1:dec ax;N-1push axcall fact;调用递归子程序求(N-1)!pop axmul word ptr bp+6 ;求 N(N-1)!fact2:mov bp+6,ax ;存入出口参数 N!pop bppo

26、p axretfactendp53子程序的重入l子程序的重入是指子程序被中断后又被中断服务程序所调用,能够重入的子程序称为可重入子程序。在子程序中,注意利用寄存器和堆栈传递参数和存放临时数据,而不要使用固定的存储单元(变量),就能够实现重入。l子程序的重入不同于子程序的递归。重入是被动地进入,而递归是主动地进入;重入的调用间往往没有关系,而递归的调用间却是密切相关的。递归子程序也是可重入子程序。55例:从键盘输入有符号十进制数l子程序从键盘输入一个有符号十进制数;子程序还包含将ASCII码转换为二进制数的过程l输入时,负数用“”引导,正数直接输入或用“”引导l子程序用寄存器传递出口参数,主程序

27、调用该子程序输入10个数据57.datacount= 10arraydw count dup(0);预留数据存储空间.code.startupmov cx,countmov bx,offset arrayagain:call read;调用子程序输入一个数据mov bx,ax;将出口参数存放缓冲区inc bxinc bxcall dpcrlf;调用子程序,光标回车换行以便输入下一个数据loop again.exit 058;输入有符号10进制数的通用子程序;出口参数:AX补码表示的二进制数值;说明:负数用“”引导,正数用“”引导或直接输入;数据范围是3276732768readprocpush

28、 bxpush cxpush dxxor bx,bx;BX保存结果xor cx,cx;CX为正负标志,0为正,1为负mov ah,1;输入一个字符int 21h59cmp al,+;是“”,继续输入字符jz read1cmp al,-;是“”,设置1标志jnz read2;非“”和“”,转read2mov cx,-1read1:mov ah,1;继续输入字符int 21hread2:cmp al,0;不是09之间的字符,则输入数据结束jb read3cmp al,9ja read360sub al,30h;是09之间的字符,则转换为二进制数;利用移位指令,实现数值乘10:BXBX10shl b

29、x,1mov dx,bxshl bx,1shl bx,1add bx,dx;bx内容乘10mov ah,0add bx,ax;已输入数值乘10后,与新输入数值相加jmp read1;继续输入字符61read3:cmp cx,0jz read4neg bx;是负数,进行求补read4:mov ax,bx;设置出口参数pop dxpop cxpop bxret;子程序返回readendp;使光标回车换行的子程序dpcrlfproc.;省略dpcrlfendpend62例:显示有符号十进制数l子程序在屏幕上显示一个有符号十进制数;子程序还包含将二进制数转换为ASCII码的过程l显示时,负数用“”引导

30、,正数直接输出、没有前导字符l子程序的入口参数用共享变量传递,主程序调用该子程序显示10个数据64.datacount= 10arraydw 1234,-1234,0,1,-1,32767dw -32768,5678,-5678,9000wtempdw ?;共享变量.code.startupmov cx,countmov bx,offset arrayagain:mov ax,bxmov wtemp,ax;将入口参数存入共享变量call write;调用子程序显示一个数据inc bxinc bxcall dpcrlf;便于显示下一个数据loop again.exit 065;显示有符号10进制

31、数的通用子程序;入口参数:共享变量wtempwriteprocpush axpush bxpush dxmov ax,wtemp;取出显示数据test ax,ax;判断零、正数或负数jnz write1mov dl,0;是零,显示“0”后退出mov ah,2int 21hjmp write566write1:jns write2;是负数,显示“”mov bx,ax;AX数据暂存于BXmov dl,-mov ah,2int 21hmov ax,bxneg ax;数据求补(求绝对值)write2:mov bx,10push bx;10压入堆栈,作为退出标志67write3:cmp ax,0;数据(

32、余数)为零jz write4;转向显示sub dx,dx;扩展被除数DX.AXdiv bx;数据除以10:DX.AX10add dl,30h;余数(09)转换为ASCII码push dx;数据各位先低位后高位压入堆栈jmp write3write4:pop dx;数据各位先高位后低位弹出堆栈cmp dl,10;是结束标志10,则退出je write568mov ah,2;进行显示int 21hjmp write4write5:pop dxpop bxpop axret;子程序返回writeendp;使光标回车换行的子程序dpcrlfproc.;省略dpcrlfendpend69总 结1. 掌握基本程序结构顺序结构、分支结构、循环结构、子程序及其汇编语言程序设计2. 熟悉常见程序设计问题:多精度运算、查表(查代码、特定值等)ASCII、BCD及十六进制数据间的代码转换数据范围判断(09、AZ、az)字母大小写转换;字符串传送、比较等操作求最小最大值、数据求和、统计字符个数子程序的寄存器和共享变量传递参数70

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号