版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章第五章 循环和分支程序设计循环和分支程序设计v汇编程序编写步骤汇编程序编写步骤v汇编程序编写格式汇编程序编写格式v循环程序设计循环程序设计v分支程序设计分支程序设计v子程序设计子程序设计v字符串程序设计字符串程序设计编制一个汇编语言程序的步骤编制一个汇编语言程序的步骤()分析题意,确定算法()分析题意,确定算法()根据算法,画出程序框图()根据算法,画出程序框图()根据框图编写程序()根据框图编写程序()上机调试程序()上机调试程序 exe文件的编程要求文件的编程要求 源程序可使用多逻辑段源程序可使用多逻辑段 在实模式下,每个逻辑段大小不超过在实模式下,每个逻辑段大小不超过64kb 适合
2、编写大型程序适合编写大型程序例例 显示显示10行行hello(exe(exe文件文件) );filename: 41.asm.486data segment use16mesg db hello,0dh,0ah,$data endsstack_ segment db 100 dup(?)stack_ endscode segment assume cs:code,ds:data,ss:stack_segment beg: mov ax,stack_segment mov ss,ax mov sp,100 mov ax,data mov ds,ax mov cx,10 last: mov ah,
3、9 mov dx,offset mesg int 21h loop last mov ah,4ch int 21hcode ends end begcom文件的编程要求文件的编程要求 源程序只允许使用源程序只允许使用一个逻辑段,即代码段一个逻辑段,即代码段,不允许设置,不允许设置堆栈段;堆栈段; 数据可以集中设置在段的开始或者末尾;数据可以集中设置在段的开始或者末尾; 程序的启动指令必须存放在偏移地址为程序的启动指令必须存放在偏移地址为100h的单元;的单元; 代码段长度小于代码段长度小于64kb,适合于编写中小型程序。,适合于编写中小型程序。例例 显示显示10行行hello (com(com
4、文件文件) );filename: 42.asm.486code segment assume cs:code org 100h beg: jmp start mesg db hello,0dh,0ah,$ start: mov cx,10 last : mov ah,9 mov dx,offset mesg int 21h loop last mov ah,4ch int 21hcode ends end beg汇编源程序的书写结构形式汇编源程序的书写结构形式堆栈段名堆栈段名用变量定义预置的堆栈空间用变量定义预置的堆栈空间堆栈段名堆栈段名数据段名数据段名用变量定义预置的数据空间用变量定义预置
5、的数据空间数据段名数据段名代码段名代码段名定义的寻址关系定义的寻址关系:填充数据段:填充数据段.,代码段名代码段名汇编源程序的书写结构形式汇编源程序的书写结构形式堆栈段名堆栈段名用变量定义预置的堆栈空间用变量定义预置的堆栈空间堆栈段名堆栈段名数据段名数据段名用变量定义预置的数据空间用变量定义预置的数据空间数据段名数据段名代码段名代码段名过程名过程名 f a r定义的寻址关系定义的寻址关系:,填充数据段填充数据段.过程名过程名代码段名代码段名顺序程序设计顺序程序设计例例.写出计算写出计算y=a*b+c-18的程序,题中的程序,题中a,b,c是带符号的是带符号的8位二进制数。位二进制数。顺序程序设
6、计顺序程序设计 练习练习:试编制一程序,求出下列公式中的:试编制一程序,求出下列公式中的值,并存放在单元中:值,并存放在单元中: ()() 其中,的值分别存放在,其中,的值分别存放在, 单元中。单元中。循环程序设计循环程序设计 循环程序的结构 循环程序的设计方法循环程序的组成循环程序的组成 循环初始化部分循环初始化部分 循环体循环体 循环参数修改部分循环参数修改部分 循环控制部分循环控制部分 循环程序的结构循环程序的结构 在程序设计中,常见的循环结构有两种:在程序设计中,常见的循环结构有两种: 一种是先执行循环体,然后判断循环是否一种是先执行循环体,然后判断循环是否继续进行;继续进行; 另一种
7、是先判断是否符合循环条件,符合另一种是先判断是否符合循环条件,符合则执行循环体,否则退出循环。则执行循环体,否则退出循环。 两种循环结构如下图所示。两种循环结构如下图所示。 循环控制的方法循环控制的方法 计数控制法计数控制法 条件控制法条件控制法 混合控制法混合控制法循环程序设计 单循环程序设计单循环程序设计 多重循环程序设计多重循环程序设计【例例】假设从假设从buf单元开始为一个单元开始为一个asc码字符码字符串串,找出其中的最大数送屏幕显示找出其中的最大数送屏幕显示.解一解一:.486data segment use16buf db qwertyuiop123count equ $-buf
8、max db max=“,?,0dh,0ah,$data ends单重循环程序设计单重循环程序设计code segment use16assume cs:code,ds:databeg:mov ax,data mov ds,ax mov al,0 lea bx,buf mov cx,countlast:cmp bx,al jc next mov al,bxnext:inc bx loop lastmov max+4,almov ah,9mov dx,offset maxint 21hmov ah,4chint 21hcode endsend beg解二解二:.486data segment u
9、se16buf db qwertyuiop123flag db -1max db max=“,?,0dh,0ah,$data endscode segment use16assume cs:code,ds:databeg:mov ax,data mov ds,ax mov al,0 lea bx,buflast:cmp byte ptr bx,-1 je disp cmp bx,al jc next mov al,bxnext:inc bx jmp lastdisp:mov max+4,al mov ah,9 mov dx,offset max int 21h mov ah,4ch int 2
10、1hcode endsend beg练习练习1.计算计算:s=1+2+3+4+200练习练习2.计算计算:s=1+2*3+3*4+4*5+n*(n+1)直到直到n*(n+1)200为止。为止。单重循环程序设计单重循环程序设计多重循环程序设计 【例例】在以在以bufbuf为首址的字存储区中存放有为首址的字存储区中存放有n n个有个有符号数,现需将它们按大到小的顺序排列在符号数,现需将它们按大到小的顺序排列在bufbuf存存储区中,试编写其程序。储区中,试编写其程序。 我们采用冒泡排序算法从第一个数开始依次对我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数相邻两个
11、数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(看出,第一遍需比较(n-1n-1)次,此时,最小的数)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的已经放到了最后;第二遍比较只需考虑剩下的(n-1n-1)个数,即只需比较()个数,即只需比较(n-2n-2)次;第三遍只)次;第三遍只需比较(需比较(n-3n-3)次,)次,整个排序过程最多需(整个排序过程最多需(n-n-1 1)遍。如下面的)遍。如下面的4 4个数即是采用冒泡排序比较的个数即是采用冒泡排序比较的例子。例子。 数数108169032
12、第一遍第一遍101690328第二遍第二遍169032108第三遍第三遍903216108 程序流程图如图程序流程图如图4.9所示。所示。程序如下:程序如下:datasegmentbufdw 3,-4,6,7,9,2,0,-8,-9,-10,20n=(-buf)/2dataendsstacksegnment stackdb 200 dup(0)stackendscodesegmentassume cs:code,ds:data,ss:stackstart:mov ax,datamov ds,axmov cx,ndec cxloop1: mov dx,cxmov bx,0loop2: mov a
13、x,bufbxcmp ax,bufbx+2jge lxchgax,bufbx+2mov bufbx,axl:add bx,2dec cxjne loop2mov cx,dxlooploop1mov ah,4chint 21hcodeendsendstart 程序运行后,程序运行后,buf区中的内容如下:区中的内容如下:20,9,7,6,3,2,0,-4,-8,-9,-10 思考:若要对思考:若要对n个无符号数按由大到小的顺个无符号数按由大到小的顺序排列,要如何修改程序?序排列,要如何修改程序?变址循环程序设计变址循环程序设计 变址循环变址循环:将数据有规律地存放在连续的内存将数据有规律地存放在
14、连续的内存单元单元,使数据地址在循环过程中有规律的变化使数据地址在循环过程中有规律的变化,利用变址寄存器或基址寄存器利用变址寄存器或基址寄存器,使之指向数据使之指向数据元素。元素。 例、计算例、计算c=a1*b1+a2*b2+a3*b3+a4*b4 (a) 简单分支简单分支 (b) 简单分支的两路分支简单分支的两路分支 条件成立?条件成立? y y 条件成立?条件成立? n 语句语句 语句语句 1语句语句 2语句语句 1语句语句 2语句语句 n情况情况1情况情况2情况情况n 表达式计算结果是表达式计算结果是 (c) 多路分支多路分支 分支程序设计分支程序设计 通常是在执行了算术比较指令通常是在
15、执行了算术比较指令cmp,或者逻辑比较指令或者逻辑比较指令test之后,根据之后,根据z,s,o,p,c等各种标志位的状态进行有等各种标志位的状态进行有条件转移。如果条件成立则跳转到指定指令开始执行,条件转移。如果条件成立则跳转到指定指令开始执行,否则忽略转移指令继续顺序的执行后续的指令。否则忽略转移指令继续顺序的执行后续的指令。例例、将、将bx寄存器的内容以二进制格式显示在屏幕上。寄存器的内容以二进制格式显示在屏幕上。;filename:651.asm.486code segment use16 assume cs:codebeg:mov bx,5678h mov cx,16简单分支程序的设
16、计简单分支程序的设计last:mov dl,0 rcl bx,1 jnc next mov dl,1next:mov ah,2 int 21h loop last mov ah,4ch int 21hcode endsend beg 练习练习:试编程实现将:试编程实现将buf1和和buf2两个两个字单元中的内容相加字单元中的内容相加,若无溢出若无溢出,将其和保将其和保存到存到sum单元中单元中,若有溢出若有溢出,在屏幕上显在屏幕上显示示“overflow!”。简单分支程序的设计简单分支程序的设计复合分支程序设计复合分支程序设计 例例、设、设number单元的数单元的数x以及数值以及数值n1,n
17、2均为单均为单字节无符号数,请判断字节无符号数,请判断x的大小,并更加判断结果的大小,并更加判断结果分别显示:分别显示:n1=x=n2,或或xn2.486data segment use16mesg1 db n1=x=n2 $mesg2 db xn2 $number db ?n1 equ 22n2 equ 88data endscode segment use16 assume cs:code,ds:databeg:mov ax,data mov ds,ax mov dx,offset mesg1 cmp number,n1 jnc next mov dx,offset mesg2 jmp d
18、isp next:cmp number,n2+1 jc disp mov dx,offset mesg3disp:mov ah,9 int 21h mov ah,4ch int 21hcode endsend beg练习练习:根据:根据x的值给的值给y赋值,若赋值,若x=0,则则y=0 若若x0,则,则y=-1复合分支程序的设计复合分支程序的设计作用作用:使程序能根据不同的条件转移到多个程序分支去。:使程序能根据不同的条件转移到多个程序分支去。方法方法:(1)用寄存器间接寻址的方式实现跳跃表法。)用寄存器间接寻址的方式实现跳跃表法。 (2)用基址变址的方式实现跳跃表法。)用基址变址的方式实现跳
19、跃表法。 (3)用变址寻址方式实现跳跃表法。)用变址寻址方式实现跳跃表法。 例例、 设计一个设计一个256分支的段内转移程序分支的段内转移程序,设设:jump单元有一个数单元有一个数x, 若若x=0,转移到标号为转移到标号为p000的程序段的程序段; 若若x=1,转移到标号为转移到标号为p001的程序段的程序段; 若若x=255,转移到标号为转移到标号为p255的程序段的程序段;多分支程序的设计多分支程序的设计.486data segment use16jump db ?tab dw p000 dw p001 dw p255data endscode segment use16assume cs:code,ds:databeg:mov ax,data mov ds,ax mov bl,jump mov bh,0add bx,bxmov si,offset tabjmp word ptr bx+sip000: p001: p255: code endsend beg字符串
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论