基本汇编语言程序设计.ppt
《基本汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《基本汇编语言程序设计.ppt(111页珍藏版)》请在三一办公上搜索。
1、1,封面,第5章,程序控制结构及其程序设计,2,第5章基本汇编语言程序设计,第5章 基本汇编语言程序设计5.1顺序程序设计5.2 分支程序设计5.3 循环程序设计 本章要点及习题分析,3,5.1顺序程序设计(e),5.1顺序程序设计指令按程序中的书写顺序逐条执行,称为顺序程序。除非编程解决非常简单的问题,顺序程序并不多见,但是顺序程序往往是复杂程序结构的一部分,如分支结构的一个分支,循环结构的循环体等。,4,例5.1,例5.1:设有3个字变量x,y和z,求出三者之和,结果存入字变量w。DATAS SEGMENTXdw 5 Ydw 6 Zdw 7 Wdw?DATAS ENDSCODES SEGM
2、ENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATAS MOV DS,AX,mov ax,xadd ax,yadd ax,zmov w,ax MOV AH,4CH INT 21HCODES ENDS END START,5,【例5-3】将一个字节压缩BCD码转换为两个ASCII码。分析:一个字节的压缩BCD码就是用一个字节的二进制数表示两位十进制数,如十进制数96表示成压缩BCD码就是96H,转换成ASCII码就是把压缩BCD码表示的十进制数的高位和低位分开,并以ASCII码表示,即转换成39H和36H。,6,DATASEGMENTBC
3、DBUF DB 96H;定义1个字节的压缩BCD码ASCBUF DB 2DUP(?);定义2个字节的结果单元DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,BCDBUF;取出BCD码 MOV BL,AL;送BL暂存 MOV CL,4 SHR AL,CL;高4位变成低4位,高4位补0(96H09H)ADD AL,30H;变成ASCII码(39H),7,MOVASCBUF,AL;存储第1个ASCII码ANDBL,0FH;屏蔽掉高4位,只保留低4位(96H06H)ADDBL,30H;变成BC
4、D码(36H)MOVASCBUF+1,BL;存储第2个码MOVAH,4CHINT21HCODE ENDSENDSTART,8,【例5-4】利用直接查表法完成将键盘输入的一位10进制数(09)转换成对应的平方值并存放在SQRBUF单元中。分析:09的平方值分别为0、1、4、9、16、25、36、49、64、81。把平方值放在一起形成一个平方值表,根据输入的值和对应平方值所在单元地址之间的关系(表首地址加上输入的值),查出相应的平方值。,9,DATA SEGMENTSQUTABDB 0,1,4,9,16,25,36,49,64,81SQUBUFDB?DATA ENDSCODE SEGMENTASS
5、UMECS:CODE,DS:DATASTART:MOVAX,DATA,10,MOVDS,AXMOVBX,OFFSETSQUTAB;平方表首地址MOVAH,1INT21H;由键盘输入个数,得到其ASCII码SUBAL,30H;由ASCII码得到相应的数XLAT;查表MOVSQUBUF,AL;存储结果MOVAH,4CHINT21HCODEENDS END START,11,5.2分支程序设计,4.2 分支程序设计条件转移指令Jcc和无条件转移指令JMP用于实现程序的分支结构,JMP不测试条件,Jcc可根据条件是否成立决定转移到指定位置或不转移而顺序执行后续指令。由于Jcc不支持条件表达式,而是以当
6、前标志位的状态为条件,故Jcc之前一定要安排设置标志位的指令,如加减法、比较、测试等指令。基本分支类型分为单分支和双分支。,12,单分支,1.单分支类型,对同一个问题,根据选择的条件不同,单分支结构的流程图有两种画法,对应的程序也有两种编法。如计算AX中的有符号数的绝对值。,13,单分支,cmp ax,0 jge noneg neg axNoneg:mov result,ax,cmp ax,0 jnge yesneg jmp doneyesneg:neg axDone:mov result,ax,14,双分支,2.双分支程序,两个分支都有语句体,如何选择条件不重要。流程图中分支体的位置就是程序
7、的实际顺序,故分支语句体最后一定要有一条指令,跳过语句体,转移到“后续操作”。,15,双分支,双分支举例:显示BX的最高位。shl bx,1jc one;转分支体 mov dl,0;分支体1 jmp next;转后续操作One:mov dl,1;分支体2next:mov ah,2;后续操作 int 21h.分支程序的其他问题有些双分支问题可以先假设一种情况,把双分支改成单分支问题。如上例,先假设BX最高位为0,在分支外准备显示0;如最高位为0,即可直接跳到后续操作;如最高位为1才需要执行分支体。,mov dl,0 shl bx,1 jnc next mov dl,1next:mov ah,2
8、int 21h,16,多分支,分支的嵌套形成多分支,嵌套形式多种多样。例1:求符号函数 1 当 X0Y=0 当 X=0-1 当 X0,实际是双分支的组合。,17,多分支,例2:判断AL各位的值,D0=1,转移到L0;D1=1,转移到L1;D2=1,转移到L2,也可认为是双分支的组合,但为简化编程,实现左图的分支结构可以在数据段设置转移地址表,如例题4.4,18,多分支,例5.4 使用地址表实现多分支。8个分支的标号分别为disp1,disp2在代码段有:disp1:mov dx,disp2:mov 设disp1的偏移地址为2300h,disp2的偏移地址为2500h。在数据段有:tabel d
9、w disp1,disp2,19,5.3.3 跳跃表法分支程序的两种结构形式都可以用上面所述的方法来实现。此外,在实现CASE结构时,还可以使用跳跃表法,使程序能根据不同的条件转移到多个程序分支中去。下面举例说明。【例5-6】试根据AL寄存器中哪一位为1(从低位到高位)就把程序转移到8个不同的程序分支中去。,20,下面列出了用变址寻址方式实现跳跃表法的程序,还可以使用寄存器间接和基址变址寻址方式来达到同一目的,这三种方法并无实质的区别,只是其中关键的JMP指令所用的寻址方式不同而已。跳跃表法是一种很有用的分支程序设计方法,应当通过例子掌握要领,灵活使用。用变址寻址方式实现跳跃表法的程序:,21
10、,DATA SEGMENTDATATABDWROUTINE_1DW ROUTINE_2DW ROUTINE_3DW ROUTINE_4DW ROUTINE_5DW ROUTINE_6DW ROUTINE_7DW ROUTINE_8DATA ENDS,22,CMPAL,0 JECONT MOVSI,0LP:SHRAL,1;逻辑右移 JNBNOT_YET;若CF=0,则跳转 JMPDATATABSI NOT_YET:ADDSI,TYPE DATATAB;TYPE是检验内存单元 BYTE 是1 WORD是2 DWORD是4 JMPLPCONT:ROUTINE_1:ROUTINE_2:,23,RETM
11、AINENDPCODEENDSENDSTART,24,5.3 循环程序设计,5.3 循环程序设计(重复执行的程序段)1.循环程序的组成初始化部分:设置循环条件、次数、初值等。循环体部分:重复执行的代码,含循环条件的修改等。循环控制部分:判断循环条件,决定是否继续。2.两种循环结构1)“先循环、后判断”结构相当于高级语言的“直到型”循环(DO-UNTIL)2)“先判断、后循环”结构(DO-WHILE)相当于高级语言的“当型循环”,可实现0次循环。,25,两种循环结构,26,循环程序设计,3.循环程序设计编写循环程序的关键在于循环的控制。循环次数已知:可用LOOP指令,CX计数。如教材例3-74(
12、P85)。循环次数和ZF标志:可用LOOPZ、LOOPNZ指令。循环次数未知:通常要采用各类条件转移指令实现循环控制。如教材例4.7,字符串以0结尾;例4.9,字符串以$结尾。,27,例题分析,循环程序例题分析:例5.5:计算100个数字之和。仅用循环次数控制,且循环次数已知,比较简单。例5.6:确定一个字变量中为1的最低位数。从最低位向高位依次测试,最多测试16次;测试到某位为1,即可结束程序,测试结果用ZF标志反映,因此可用LOOPE或LOOPZ控制循环(结果非0,退出)。例5.7:将一个字符串中的所有大写字母改为小写字母,字符串以0结尾。循环次数未知,应使用条件判断控制循环;循环结构应使
13、用“先判断、后执行”的结构;通常,采用条件判断控制循环时,往往采用“先判断、后执行”的循环结构。,28,例题5.6,例5.6:确定一个字变量中为1的最低位数。.startupmov ax,wordX;测试目标送AXmov cx,16;循环计数器置初值mov dl,-1;计位器置初值again:inc dltest ax,1;ax1ror ax,1;小循环右移,循环指令不影响ZFloope again;CX0且ZF=1(测试位为0),继续循环je notfound;退出循环,但0标志成立,没有1mov byteY,dljmp donenotfound:mov byteY,-1;ZF=1,16个位
14、均为0done:.exit 0 end,29,例题5.7/1,例5.7:将一个字符串中的所有大写字母改为小写字母,字符串以0结尾。.dataString db xxxxxxxxxxxxxxxxxx,0.code.startupmov bx,offset stringagain:mov al,bx;取一个字符 or al,al;是否为结尾符0 jz done;是,退出循环,30,/2,cmp al,A;是否为大写AZ jb next cmp al,Z ja next or al,20h;是,转换为小写字母(使 D5=1)mov bx,al;仍保存在原位置next:inc bx jmp again
15、;继续循环done:.exit 0 end,31,两重循环结构,4.多重循环:循环程序的嵌套构成多重(多层)循环。最常见的多重循环为两重循环。,32,冒泡法排序,例5.8:采用“冒泡法”排序(升序)。基本思想是:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置。n个数,经过n-1轮比较后完成排序。,本章目录,33,冒泡法排序,例5.8 用冒泡排序法实现升序排列。,本章目录,34,例5.8 排序/1,例5.8 对无符号字节数组元素由小到大排序。.dataAr
16、ray db 6,5,16,84,32Count equ($-array)/(type array).code mov cx,count;CX数组元素个数dec cx;元素个数减1为外循环次数outlp:mov dx,cx;DX内循环次数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;外循环尾,35,串操作程序字符串是一
17、种特殊的线性表,它的数据元素仅由一个字符组成。字符串长度:一个字符串中包含字符的个数;长度为零的字符串称之为空串,不包含任何字符;通常用单/双引号括起来:AB abcd字符串定义:str1 I am a studentstr1 I am a teacher$,36,字符串的操作基本操作求字符串的长度字符串的比较字符串的连接取子字符串组合操作插入子串删除查找并替换,37,例1:内存STR单元存放一字符串,结尾用00H作标记,编程求其串长度并存入LEN单元中。DATAS SEGMENT STR DB I live in KuangChow,00H LEN DB?;此处输入数据段代码 DATAS E
18、NDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART:MOV AX,DATAS MOV DS,AX LEA SI,STR XOR AL,ALLOP:CMP BYTE PTRSI,00HJZ DONEINC ALINC SIJMP LOPDONE:MOV LEN,AL MOV AH,4CH INT 21HCODES ENDS END START,38,例2:内存STR1和STR2单元分别存放两个字符串,均以00H作为结束标志。编制程序比较两个字符串,比较结果存放于FLAG单元。如果两串想等,FLAG为0;如果STR1STR2,FLAG为1;如果STR1ST
19、R2,FLAG为FFH。,39,例5.9 剔除空格程序,例5.9:剔除以结尾的字符串中的空格。双重循环程序:外层循环负责搜索字符串中的空格;内层循环负责剔除搜索到的空格(由于空格后的字符要依次向前移动一个字节,因而也是一个循环结构)。无论是外层循环,还是内层循环,循环次数都未知,只能用“条件判断”控制循环。外层循环采用“先判断、后循环”结构;对内层循环而言,由于搜索到空格才进入内循环,所以采用“先循环、后判断”结构。,40,例5.9/1,例5.9:现有一个以$结尾的字符串,要求剔除其中的空格。.datastringdb Let us have a try!,$.code.startupmov
20、dx,offset stringmov ah,9int 21h;显示原字符串mov al,;AL空格(ASCII码为20H)mov di,offset string,41,例5.9/2,outlp:cmp byte ptr di,$;外循环,先判断后循环jz done;为$结束cmp al,di;检测是否是空格jnz next;不是空格继续外循环mov si,di;是空格,进入剔除空格分支inlp:inc si;该分支是循环程序段mov ah,si;取空格后的一个字符mov si-1,ah;向前移动一个字节cmp byte ptr si,$;内循环,先循环后判断jnz inlp,42,例5.9
21、/3,next:inc di;继续对后续字符进行处理 jmp outlpdone:mov dx,offset string mov ah,9 int 21h;显示处理后字符串.exit 0;结束 end,返回第四章,43,5.4(目录)子程序设计,4.4 子程序设计 把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序。使用子程序:简化源程序结构;提高编程效率。4.4.1 过程定义伪指令 4.4.2 子程序的参数传递 4.4.3 子程序的嵌套递归重入 4.4.4 子程序的应用,返回第四章,44,5.4.1 过程定义伪指令(1),4.4.1 过程定义伪指令过程名
22、PROC NEAR|FAR 过程体 RET(RET N)过程名 ENDP过程名:符合语法的标识符;同模块唯一性。距离属性:可省略,由汇编程序判断。堆栈使用:平衡。才能保证RET指令弹出的是断点地址。保护现场与恢复现场:子程序用到的寄存器或存储单元,注意:后进先出。注意子程序的规范和格式,45,关于“距离属性”,关于“距离属性”NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用 对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为near;在中型、大型和巨型存储模式下,过程的缺省属性为far 对完整段定义格式,
23、过程的缺省属性为near用户可以在过程定义时用near或far改变缺省属性,46,子程序规范,子程序规范 一个完整的子程序,特别是供其他编程人员使用的子程序,必须附有一个详细说明:子程序名(过程名)子程序功能介绍子程序的入口参数子程序的出口参数子程序内使用的寄存器(存储单元)使用该子程序的范例,47,子程序的常见格式,子程序的常见格式;子程序说明;子程序说明subnameproc;具有缺省属性的subname过程push ax;保护寄存器:顺序压入堆栈push bx;ax/bx/cx仅是示例push cx;过程体pop cx;恢复寄存器:逆序弹出堆栈pop bxpop axret;过程返回su
24、bnameendp;过程结束,48,简单子程序,简单子程序;子程序功能:实现光标回车换行dpcrlfproc;过程开始push ax;保护寄存器AX和DXpush dxmov dl,0dh;显示回车mov ah,2int 21hmov dl,0ah;显示换行mov ah,2int 21hpop dx;恢复寄存器DX和AXpop axret;子程序返回dpcrlfendp;过程结束,49,例5.10:编写子程序(e),例4.10:编写子程序,将AL寄存器内的二进制数用十六进制数显示。8位二进制数,可转换成两位十六进制数。十六进制数ASCII码2#功能调用显示1001B9H1001+0011 00
25、0039H(9的ASCII)1010BAH1010+0011 011141H(A的ASCII)注意:对0-9加30H,对A-F加37H,即+30H+07H先转换高4位二进制数,并显示;然后转换低4位并显示。,例题410,回 4.4,50,5.4.2 子程序的参数传递,4.4.2 子程序的参数传递 主程序和子程序之间通常需要传递参数:入口参数(输入参数):主程序提供给子程序出口参数(输出参数):子程序返回给主程序参数的形式:数据本身(传值)数据的地址(传址)传递的方法:寄存器 变量 堆栈,51,参数传递方法,1.用寄存器传递参数方便、简单、易行。须要传递的参数较多时不适用。见例题411a。2.用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 汇编语言 程序设计
链接地址:https://www.31ppt.com/p-6108457.html