欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    基本汇编语言程序设计.ppt

    • 资源ID:6108457       资源大小:429.50KB        全文页数:111页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基本汇编语言程序设计.ppt

    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 SEGMENT 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,DATASEGMENTBCDBUF 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;变成BCD码(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 SEGMENTASSUMECS: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不支持条件表达式,而是以当前标志位的状态为条件,故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.双分支程序,两个分支都有语句体,如何选择条件不重要。流程图中分支体的位置就是程序的实际顺序,故分支语句体最后一定要有一条指令,跳过语句体,转移到“后续操作”。,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 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 dw disp1,disp2,19,5.3.3 跳跃表法分支程序的两种结构形式都可以用上面所述的方法来实现。此外,在实现CASE结构时,还可以使用跳跃表法,使程序能根据不同的条件转移到多个程序分支中去。下面举例说明。【例5-6】试根据AL寄存器中哪一位为1(从低位到高位)就把程序转移到8个不同的程序分支中去。,20,下面列出了用变址寻址方式实现跳跃表法的程序,还可以使用寄存器间接和基址变址寻址方式来达到同一目的,这三种方法并无实质的区别,只是其中关键的JMP指令所用的寻址方式不同而已。跳跃表法是一种很有用的分支程序设计方法,应当通过例子掌握要领,灵活使用。用变址寻址方式实现跳跃表法的程序:,21,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,RETMAINENDPCODEENDSENDSTART,24,5.3 循环程序设计,5.3 循环程序设计(重复执行的程序段)1.循环程序的组成初始化部分:设置循环条件、次数、初值等。循环体部分:重复执行的代码,含循环条件的修改等。循环控制部分:判断循环条件,决定是否继续。2.两种循环结构1)“先循环、后判断”结构相当于高级语言的“直到型”循环(DO-UNTIL)2)“先判断、后循环”结构(DO-WHILE)相当于高级语言的“当型循环”,可实现0次循环。,25,两种循环结构,26,循环程序设计,3.循环程序设计编写循环程序的关键在于循环的控制。循环次数已知:可用LOOP指令,CX计数。如教材例3-74(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结尾。循环次数未知,应使用条件判断控制循环;循环结构应使用“先判断、后执行”的结构;通常,采用条件判断控制循环时,往往采用“先判断、后执行”的循环结构。,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个位均为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;继续循环done:.exit 0 end,31,两重循环结构,4.多重循环:循环程序的嵌套构成多重(多层)循环。最常见的多重循环为两重循环。,32,冒泡法排序,例5.8:采用“冒泡法”排序(升序)。基本思想是:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置。n个数,经过n-1轮比较后完成排序。,本章目录,33,冒泡法排序,例5.8 用冒泡排序法实现升序排列。,本章目录,34,例5.8 排序/1,例5.8 对无符号字节数组元素由小到大排序。.dataArray 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,串操作程序字符串是一种特殊的线性表,它的数据元素仅由一个字符组成。字符串长度:一个字符串中包含字符的个数;长度为零的字符串称之为空串,不包含任何字符;通常用单/双引号括起来: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 ENDSCODES 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;如果STR1STR2,FLAG为FFH。,39,例5.9 剔除空格程序,例5.9:剔除以结尾的字符串中的空格。双重循环程序:外层循环负责搜索字符串中的空格;内层循环负责剔除搜索到的空格(由于空格后的字符要依次向前移动一个字节,因而也是一个循环结构)。无论是外层循环,还是内层循环,循环次数都未知,只能用“条件判断”控制循环。外层循环采用“先判断、后循环”结构;对内层循环而言,由于搜索到空格才进入内循环,所以采用“先循环、后判断”结构。,40,例5.9/1,例5.9:现有一个以$结尾的字符串,要求剔除其中的空格。.datastringdb Let us have a try!,$.code.startupmov 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/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 过程定义伪指令过程名 PROC NEAR|FAR 过程体 RET(RET N)过程名 ENDP过程名:符合语法的标识符;同模块唯一性。距离属性:可省略,由汇编程序判断。堆栈使用:平衡。才能保证RET指令弹出的是断点地址。保护现场与恢复现场:子程序用到的寄存器或存储单元,注意:后进先出。注意子程序的规范和格式,45,关于“距离属性”,关于“距离属性”NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用 对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为near;在中型、大型和巨型存储模式下,过程的缺省属性为far 对完整段定义格式,过程的缺省属性为near用户可以在过程定义时用near或far改变缺省属性,46,子程序规范,子程序规范 一个完整的子程序,特别是供其他编程人员使用的子程序,必须附有一个详细说明:子程序名(过程名)子程序功能介绍子程序的入口参数子程序的出口参数子程序内使用的寄存器(存储单元)使用该子程序的范例,47,子程序的常见格式,子程序的常见格式;子程序说明;子程序说明subnameproc;具有缺省属性的subname过程push ax;保护寄存器:顺序压入堆栈push bx;ax/bx/cx仅是示例push cx;过程体pop cx;恢复寄存器:逆序弹出堆栈pop bxpop axret;过程返回subnameendp;过程结束,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 000039H(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.用变量传递参数就是用存储器传递参数,当主程序与子程序在同一个模块时,即为共享数据段的变量;不在同一模块,需要用PUBLIC/EXTERN声明。适用与参数较多情况。见例题411b。3.用堆栈传递参数常用方法。用BP访问堆栈段。须格外注意堆栈的平衡。(堆栈示意图),52,堆栈示意图,53,例题5.11c/1,例题4.11c:计算累加和;用堆栈传递参数;入口参数:数组首地址、数组元素个数;出口参数:AL 累加和.model small.stack.datacount equ 10array db 12h,25h,0f0h,0a3h,03,68h,71h,0cah,0ffh,90hresult db?,54,例题5.11c/2,.code.startup mov ax,offset array push ax;首地址入栈 mov ax,count push ax;元素个数入栈 call checksuma add sp,4;平衡两个参数占用的堆栈 mov result,al.exit 0,55,例题5.11c/3,checksuma proc push bp mov bp,sp;使BP指向刚进入子程序的堆栈顶,push bx push cx mov bx,bp+6 mov cx,bp+4 xor al,alsuma:add al,bx inc bx loop suma,56,例题5.11c/4,pop cx pop bx pop bp ret;可以用RET 4checksuma endp end,57,编写子程序时应注意的问题,编写子程序时应注意的问题:使用简化的段定义格式时,过程定义在程序中的位置要注意,可以放在1)主程序的最后,即“.EXIT 0”之后,END语句之前;2)放在主程序之前,即“.CODE”之后,“.STARTUP”之前。使用寄存器传递参数时,带有入口参数的寄存器可以保护,也可以不保护;带有出口参数的寄存器则一定不可保护和恢复;其他与出口参数无关、而子程序中使用的寄存器,子程序开始处应该保护,子程序结束、返回主程序之前应该恢复。,回 4.4,58,5.4.3 子程序的嵌套递归重入,4.4.3 子程序的嵌套、递归与重入1.子程序的嵌套子程序又调子程序称为子程序的嵌套,嵌套的层数取决于堆栈空间的大小。嵌套子程序的设计和一般子程序完全相同。2.子程序的递归子程序直接或间接地嵌套调用自己,称为递归调用。含有递归调用的子程序称为递归子程序。每次调用时不能破坏以前调用所用的参数及中间结果,因此,调用参数及中间结果一般都放在堆栈中。不可放在固定的寄存器或存储单元中。要控制递归的次数,避免陷入死循环。递归深度受堆栈空间的限制。,59,例题5.12,例题4.12 用递归子程序求N的阶乘,设N=3。递归次数用N控制,由N=3,子程序共运行4次(主程序调用1次,递归调用3次);入口参数及中间结果都用堆栈保存。注释:1)在进入子程序过程中,不计算阶乘值,只求中间参数。第一次进入,求出中间参数2;第二次进入求出中间参数1;第三次进入求出中间参数0;第四次进入后,由于中间参数以为0,开始执行返回处理。2)在返回过程中计算阶乘:在过程3中计算1*1=1,在过程2中计算1*2=2,在过程1中计算2*3=6。3)递归子程序可设计出效率较高的程序,但是编程较难,编出的程序易读性差,使用不多。,60,子程序的重入(e),3.子程序的重入子程序被中断后,又被中断服务程序所调用,称为子程序的重入。能够重入的子程序称为可重入子程序。当主机与外设采用中断方式交换信息时,外设的驱动程序应按“可重入原则”设计。虽然重入与递归的概念不同,但递归子程序就是可重入子程序。设计可重入子程序与设计递归子程序的原则是相同的,即参数、中间结果等都用堆栈保存,不能用固定的存储单元或寄存器保存。,回 4.4,61,5.4.4 子程序的应用,4.4.4 子程序的应用1)例题4.15 计算有符号数的平均值。有时进行运算之前,需要符号扩展;对无符号数应进行0扩展。2)具有局部变量的子程序(截取教材P123部分程序):当某些数据只有子程序自己使用时,可在代码段子程序后面定义数据区。3)具有多个出口的子程序:有的子程序具有多个出口,根据条件的不同,从不同的出口返回主程序。,62,例5.15 计算平均值/1,例4.15 计算有符号数的平均值。;入口参数用堆栈传递,出口参数用寄存器AX传递。;要计算16位有符号数的和,被加数一定要进行符号扩展。.model small.stack.dataarray dw 1234,-1234,1,1,-1,32767,-32768,5678,-5678,9000 count equ($-array)/2;数据个数wmed dw?,63,/2,.code.startup mov ax,count push ax;参数1 mov ax,offset array push ax;参数2 call mean add sp,4;平衡堆栈 mov wmed,ax.exit 0,64,/3,mean proc push bp mov bp,sp push bx push cx push dx push si push di mov bx,bp+4;取参数2:偏移地址 mov cx,bp+6;取参数1:数据个数 xor si,si mov di,si,65,/4,mean1:mov ax,bx cwd add si,ax adc di,dx inc bx inc bx loop mean1 mov ax,si mov dx,di mov cx,bp+6,dx.ax+di.si di.si,66,/5,idiv cx;求平均值,商在AX,余数在DX pop di pop si pop dx pop cx pop bx pop bp retmean endp end,67,避免溢出的方法,为了避免有符号二进制数求和过程中溢出,被加数要进行符号扩展,得到倍长数据(大小没有变化),然后求和如数据采用16位二进制数表示,数据个数也采用16位二进制数表示,则最多为216个数据。如将数据扩展到32位二进制数表示,求和时,就不会出现溢出。考虑极端情况:数据全是215(-32768),共有216个,求和结果是231,32位数据仍然可以表达。对于无符号数,有时也需要得到倍长数据,应采用“0扩展”,即将高位置0,如“MOV DX,0”。,68,;将AL低4位表达的一位16进制数转换为ASCII码H2ASCprocpush bxmov bx,offset ASCII;BX指向ASCII码表and al,0fh;取得一位16进制数xlat CS:ASCII;换码:ALCS:BXAL,注意数据在代码段CSpop bxret;子程序返回ASCIIdb 30h,31h,32h,33h,34h,35h,36h,37hdb 38h,39h,41h,42h,43h,44h,45h,46hH2ASCendp,例题 具有局部变量的子程序,因为数据区与子程序都在代码段,所以利用了换码指令XLAT的另一种助记格式(写出指向缓冲区的变量名,目的是便于指明段超越前缀)。串操作MOVS、LODS和CMPS指令也可以这样使用,以便使用段超越前缀 除采用段超越方法外,子程序与主程序的数据段不同时,我们还可以通过修改DS值实现数据存取;但需要保护和恢复DS寄存器,69,HTOASCproc;将AL低4位表达的一位16进制数转换为ASCII码and al,0fhcmp al,9jbe htoasc1add al,37h;是0AH0FH,加37Hret;子程序返回htoasc1:add al,30h;是09,加30Hret;子程序返回HTOASCendp,例题 具有多个出口的子程序,回 4.4,70,例5.13,例4.13 编写子程序从键盘输入一个有符号十进制数;并将输入的ASCII码转换为二进制数。输入时,负数用“”引导,正数直接输入或用“”引导子程序用寄存器传递出口参数,主程序调用该子程序输入10个数据将ASCII码转换为二进制数的过程 首先判断输入为正或负数,并用一个寄存器记录 接着输入09数字(ASCII码),并减30H转换为二进制数 然后将前面输入的数值乘10,并与刚输入的数字相加得到新的数值 重复、步,直到输入一个非数字字符结束 负数进行求补,转换成补码;否则直接保存数值,71,输入和转换流程图,输入和转换流程图:,输入非数字字符,结束输入,72,输入数字举例,设从键盘输入数字 258:输入顺序:-2 5 8 CX-1-1-1-1 BX 0 0002 0019H=25 0102H=258数字输入结束后,由于CX为负数标志,再对BX求补。,73,程序/1,.datacount=10arraydw count dup(0);预留数据存储空间.code.startupmov cx,countmov bx,offset arrayagain:call read;调用子程序输入一个数据mov bx,ax;将出口参数存放缓冲区inc bxinc bxcall dpcrlf;调用子程序,光标回车换行以便输入下一个数据loop again.exit 0,这是主程序,74,程序/2,;输入有符号10进制数的通用子程序;出口参数:AX补码表示的二进制数值read procpush bxpush cxpush dxxor bx,bx;BX保存结果xor cx,cx;CX为正负标志,0为正,1为负mov ah,1;输入一个字符int 21h,75,程序/3,cmp al,+;是“”,继续输入字符jz read1cmp al,-;是“”,设置1标志jnz read2;非“”和“”,转read2mov cx,-1read1:mov ah,1;继续输入字符int 21hread2:cmp al,0;不是09之间的字符,则输入数据结束jb read3cmp al,9ja read3,76,程序/4,sub al,30h;是09之间的字符,则转换为二进制数;利用移位指令,实现数值乘10:BXBX10shl bx,1mov dx,bxshl bx,1shl bx,1add bx,dxmov ah,0add bx,ax;已输入数值乘10后,与新输入数值相加jmp read1;继续输入字符,77,程序/5,read3:cmp cx,0jz read4neg bx;是负数,进行求补read4:mov ax,bx;设置出口参数pop dxpop cxpop bxret;子程序返回readendpdpcrlfproc;使光标回车换行的子程序.;省略dpcrlfendpend,78,例 5.14,例4.14 编写子程序,将二进制数转换为10进制数的ASCII码,并在屏幕上显示一个有符号10进制数。显示时,负数用“”引导,正数直接输出、没有前导字符。子程序的入口参数用共享变量传递,主程序调用该子程序显示10个数据。将二进制数转换为10进制数的ASCII码 首先判断数据是零、正数或负数,是零显示“0”退出 是负数,显示“”,求数据的绝对值;接着数据除以10,余数加30H转换为ASCII码压入堆栈 重复步,直到余数为0结束 依次从堆栈弹出各位数字,进行显示,79,显示数字举例,显示数字举例:设AX中数据为-258的补码1.显示负号-。2.求补,AX中得到-258的绝对值。3.258/10,商为25,余数为8,此为个位。8+30H,入栈。4.25/10,商为2,余数为5,此为十位。5变ASCII码入栈。5.2/10,商为0,余数为2,此为百位。2变ASCII码入栈。6.由于商为0,变换结束。7.顺序出栈显示。,80,程序/1,.dataCount=10Array dw 1234,-1234,0,1,-1,32767,-32768,dw 5678,-78,9000Wtemp dw?;共享变量.code.startupmov cx,countmov bx,offset arrayagain:mov ax,bxmov wtemp,ax;将入口参数存入共享变量call write;调用子程序显示一个数据inc bxinc bxcall dpcrlf;便于显示下一个数据loop again.exit 0,81,程序/2,;显示有符号10进制数的通用子程序;入口参数:共享变量wtempwriteprocpush axpush bxpush dxmov ax,wtemp;取出显示数据test ax,ax;判断零、正数或负数jnz write1mov dl,0;是零,显示“0”后退出mov ah,2int 21hjmp write5;恢复现场后返回,82,程序/3,write1:jns write2;不是负数,转向数据转换。mov bx,ax;是负数,显示“”mov dl,-mov ah,2int 21hmov ax,bxneg ax;求绝对值write2:mov bx,10;准备除数push bx;10压入堆栈,作为退出标志,83,程序/4,write3:cmp ax,0;数据(商)为零jz write4;转向显示sub dx,dx;扩展被除数DX.AXdiv bx;数据除以10:DX.AX10add dl,30h;余数(09)转换为ASCII码push dx;数据各位先低位后高位压入堆栈jmp write3,84,程序/5,write4:pop dx;数据各位先高位后低位弹出堆栈 cmp dl,10;是结束标志10,则退出 je write5 mov ah,2;进行显示 int 21h jmp write4write5:pop dx pop bx pop ax ret;子程序返回writeendp dpcrlfproc;使光标回车换行的子程序.;省略dpcrlfendpend,85,本章要点,本章要点:分支程序设计:单分支、双分支、多分支 单分支流程图的画法 用转移地址表法实现多分支循环程序设计:两种循环结构 循环程序的控制方法:计数法、条件判断法 单层循环和双层循环子程序设计:过程定义伪指令 子程序的参数传递:寄存器、变量、堆栈,86,习题分析:补充1,1.将AX中存放的无符号数除以2,如果是奇数,则加1后除以2(单分支)test ax,01h;测试AX最低位jz even;最低位为0:AX为偶数add ax,1;最低位为1:AX为奇数,需要加1even:rcr ax,1;AXAX2;如果采用SHR指令,则不能处理AXFFFFH的特殊情况,87,补充2/1,2.判断一元二次方程是否有实根。有,TAG置1;无,TAG置0。(教材例题4.3:双分支).dataa db?b db?c db?tag db?.code.startupmov al,bimul almov bx,ax;BX中为b2,88,补充2/2,mov al,aimul cmov cx,4imul cx;AX中为4ac(DX无有效数据)cmp bx,ax;比较二者大小jge yes;条件满足?mov tag,0;第一分支体:条件不满足,tag0jmp done;跳过第二个分支体yes:mov tag,1;第二分支体:条件满足,tag1done:.exit 0 end,89,补充3/1,3.按键盘输入的数字1-8,转8个分支(显示不同的信息)。(同教材例题4.4,但显示的信息不同)分析过程见课件4.2节的“多分支部分”.datamsg db Input number(18):,0dh,0ah,$Msg1 db Chapter 1:.,0dh,0ah,$msg2 db Chapter 2:.,0dh,0ah,$.msg8 db Chapter 8:.,0dh,0ah,$table dw disp1,disp2,disp3,disp4 dw disp5,disp6,disp7,disp8;取得各个标号的偏移地址,90,补充3/2,start1:mov dx,offset msg;提示输入数字 mov ah,9 int 21h mov ah,1;等待按键 int 21h cmp al,1;数字 8?ja start1 and ax,000fh;将ASCII码转换成数字,91,补充3/3,dec ax shl ax,1;等效于add ax,ax mov bx,ax jmp tablebx;(段内)间接转移:IPtable+bxstart2:mov ah,9 int 21h.exit 0disp1:mov dx,offset msg1;处理程序1 jmp start2Disp2:.end,92,习题5.4,习题分析4.4 编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。框图:(省略输入字符的判断:简单的顺序程序),93,5.5,4.5 已知用于LED数码管显示的代码表为:LEDTABEL DB 0C0H,0F9H(共16项数据)依次表示09,AF这16个数码的显示代码,编写一个程序实现将lednum中的一个数字转换成对应的LED显示代码。(查表程序),94,5.8,4.8 如果在例题4.4的tabel中依次添入msg1msg8,程序应该如何修改?(Tabel dw msg1,.)mov bx,ax mov bx,ax jmp tabelbx mov dx,tabelbxStart2:mov ah,9 mov ah,9 int 21h int 21h.exit 0.exit 0 end 程序变得更加简单。,取显示信息 偏移地址,取转移地 址送IP,95,5.9,4.9 编制一个程序,将变量BUFX、BUFY中较大者送入BUFZ;若两者相等,则把其中之一送入BUFZ中。设变量为无符号8位数。,96,5.10,4.10 设变量bufX为有符号数,编程将其符号状态保存在singX,如X大于等于0,保存0;如X小于0,保存-1。该题为一个可以演变成单分支的双分支结构:,97,5.11,4.11 X、Y、Z是三个有符号16位数(教

    注意事项

    本文(基本汇编语言程序设计.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开