欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

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

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

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

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

    第 5 章 基 本 汇 编 语 言 程 序 设 计封面 1 1第 5 章 基 本 汇 编 语 言 程 序 设 计第5章基本汇编语言程序设计第第5 5章章 基本汇编语言程序设计基本汇编语言程序设计5.15.1 顺序程序设计顺序程序设计5.2 5.2 分支程序设计分支程序设计5.3 5.3 循环程序设计循环程序设计 本章要点及习题分析本章要点及习题分析2 2第 5 章 基 本 汇 编 语 言 程 序 设 计顺序程序设计(e)5.15.1 顺序程序设计顺序程序设计指令按程序中的书写顺序逐条执行,称为顺序程序。指令按程序中的书写顺序逐条执行,称为顺序程序。除非编程解决非常简单的问题,顺序程序并不多见,除非编程解决非常简单的问题,顺序程序并不多见,但是顺序程序往往是复杂程序结构的一部分,如分支但是顺序程序往往是复杂程序结构的一部分,如分支结构的一个分支,循环结构的循环体等。结构的一个分支,循环结构的循环体等。3 3第 5 章 基 本 汇 编 语 言 程 序 设 计例例:设有例:设有3 3个字变量个字变量x,yx,y和和z z,求出三者之和,结果存,求出三者之和,结果存入字变量入字变量w w。DATAS SEGMENTDATAS SEGMENTX Xdw 5 dw 5 Y Ydw 6 dw 6 Z Zdw 7 dw 7 W Wdw?dw?DATAS ENDSDATAS ENDSCODES SEGMENTCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:START:MOV AX,DATAS MOV AX,DATAS MOV DS,AX MOV DS,AXmov ax,xmov ax,xadd ax,yadd ax,yadd ax,zadd ax,zmov w,axmov w,ax MOV AH,4CHMOV AH,4CH INT 21HINT 21HCODES ENDSCODES ENDS END STARTEND START4 4第 5 章 基 本 汇 编 语 言 程 序 设 计【例【例5-35-3】将一个字节压缩将一个字节压缩BCDBCD码转换为两个码转换为两个ASCIIASCII码。码。分分析析:一一个个字字节节的的压压缩缩BCDBCD码码就就是是用用一一个个字字节节的的二二进进制制数数表表示示两两位位十十进进制制数数,如如十十进进制制数数9696表表示示成成压压缩缩BCDBCD码码就就是是96H96H,转转换换成成ASCIIASCII码码就就是是把把压压缩缩BCDBCD码码表表示示的的十十进进制制数数的的高高位位和和低低位位分分开开,并并以以ASCIIASCII码码表表示示,即即转转换换成成39H39H和和36H36H。5 5第 5 章 基 本 汇 编 语 言 程 序 设 计DATADATASEGMENTSEGMENTBCDBUF DB 96HBCDBUF DB 96H;定义;定义1 1个字节的压缩个字节的压缩BCDBCD码码ASCBUF DB 2ASCBUF DB 2 DUP(?)DUP(?);定义;定义2 2个字节的结果单元个字节的结果单元DATADATA ENDS ENDSCODECODE SEGMENT SEGMENT ASSUME CS:CODEASSUME CS:CODE,DS:DATADS:DATASTARTSTART:MOV AX MOV AX,DATADATA MOV DS MOV DS,AXAX MOV AL MOV AL,BCDBUF BCDBUF ;取出;取出BCDBCD码码 MOV BL MOV BL,ALAL ;送;送BLBL暂存暂存 MOV CL MOV CL,4 4 SHR AL SHR AL,CL CL ;高;高4 4位变成低位变成低4 4位,高位,高4 4位补位补0(96H09H)0(96H09H)ADD AL ADD AL,30H 30H ;变成;变成ASCIIASCII码码(39H)(39H)6 6第 5 章 基 本 汇 编 语 言 程 序 设 计MOVMOVASCBUFASCBUF,ALAL;存储第;存储第1 1个个ASCIIASCII码码ANDANDBLBL,0FH0FH;屏蔽掉高;屏蔽掉高4 4位,只保留低位,只保留低4 4位位(96H06H)(96H06H)ADDADDBLBL,30H30H;变成;变成BCDBCD码码(36H)(36H)MOVMOVASCBUF+1ASCBUF+1,BLBL;存储第;存储第2 2个码个码MOVMOVAHAH,4CH4CHINTINT21H21HCODECODE ENDS ENDSENDENDSTARTSTART7 7第 5 章 基 本 汇 编 语 言 程 序 设 计【例例5-45-4】利利用用直直接接查查表表法法完完成成将将键键盘盘输输入入的的一一位位1010进进制制数数(09)(09)转转换换成成对对应应的的平平方方值值并并存存放放在在SQRBUFSQRBUF单单元中。元中。分分析析:0909的的平平方方值值分分别别为为0 0、1 1、4 4、9 9、1616、2525、3636、4949、6464、8181。把把平平方方值值放放在在一一起起形形成成一一个个平平方方值值表表,根根据据输输入入的的值值和和对对应应平平方方值值所所在在单单元元地地址址之之间间的的关系关系(表首地址加上输入的值表首地址加上输入的值),查出相应的平方值。,查出相应的平方值。8 8第 5 章 基 本 汇 编 语 言 程 序 设 计DATADATA SEGMENT SEGMENTSQUTABSQUTABDB DB 0 0,1 1,4 4,9 9,1616,2525,3636,4949,6464,8181SQUBUFSQUBUFDBDB?DATADATA ENDS ENDSCODECODE SEGMENT SEGMENTASSUMEASSUMECS:CODECS:CODE,DS:DATADS:DATASTARTSTART:MOVMOV AXAX,DATADATA9 9第 5 章 基 本 汇 编 语 言 程 序 设 计MOVMOVDSDS,AXAXMOVMOVBXBX,OFFSETOFFSETSQUTAB SQUTAB ;平方表首地址;平方表首地址MOVMOVAHAH,1 1INTINT21H21H ;由键盘输入;由键盘输入个数,得到其个数,得到其ASCIIASCII码码SUBSUBALAL,30H30H;由;由ASCIIASCII码得到相应的数码得到相应的数XLATXLAT;查表;查表MOVMOVSQUBUFSQUBUF,AL AL ;存储结果;存储结果MOVMOVAHAH,4CH4CHINTINT21H21HCODECODE ENDSENDS END STARTEND START1010第 5 章 基 本 汇 编 语 言 程 序 设 计分支程序设计4.2 4.2 分支程序设计分支程序设计条件转移指令条件转移指令JccJcc和无条件转移指令和无条件转移指令JMPJMP用于实现程序用于实现程序的分支结构,的分支结构,JMPJMP不测试条件,不测试条件,JccJcc可根据条件是否成可根据条件是否成立决定转移到指定位置或不转移而顺序执行后续指令。立决定转移到指定位置或不转移而顺序执行后续指令。由于由于JccJcc不支持条件表达式,而是以当前标志位的状态不支持条件表达式,而是以当前标志位的状态为条件,故为条件,故JccJcc之前一定要安排设置标志位的指令,如之前一定要安排设置标志位的指令,如加减法、比较、测试等指令。加减法、比较、测试等指令。基本分支类型分为单分基本分支类型分为单分支和双分支支和双分支。1111第 5 章 基 本 汇 编 语 言 程 序 设 计单分支1.1.单分支类型单分支类型 对同一个问题,根据选择的条件不同,单分支结对同一个问题,根据选择的条件不同,单分支结构的流程图有两种画法,对应的程序也有两种编法。构的流程图有两种画法,对应的程序也有两种编法。如如计算计算AXAX中的有符号数的绝对值。中的有符号数的绝对值。1212第 5 章 基 本 汇 编 语 言 程 序 设 计单分支 cmpax,0jgenonegnegaxNoneg:movresult,axcmpax,0jngeyesnegjmpdoneyesneg:negaxDone:movresult,axAX0 AX0?求补指令求补指令YN保存结果保存结果AXAX0 0?求补指令求补指令YN保存结果保存结果JMP1313第 5 章 基 本 汇 编 语 言 程 序 设 计双分支2.2.双分支程序双分支程序 两个分支都有语句两个分支都有语句体,如何选择条件不重体,如何选择条件不重要。要。流程图中分支体的流程图中分支体的位置就是程序的实际顺位置就是程序的实际顺序,故分支语句体最序,故分支语句体最后一定要有一条后一定要有一条指令,跳过语句体,指令,跳过语句体,转移到转移到“后续操作后续操作”。条件成立?条件成立?分支语句体分支语句体2YN分支语句体分支语句体1后后续续操操作作1414第 5 章 基 本 汇 编 语 言 程 序 设 计双分支双分支举例:显示双分支举例:显示BXBX的最高位。的最高位。shl bx,1shl bx,1jc one jc one ;转分支体;转分支体 mov dl,0mov dl,0 ;分支体;分支体1 1 jmp nextjmp next;转后续操作;转后续操作One:mov dl,1One:mov dl,1 ;分支体;分支体2 2next:mov ah,2next:mov ah,2 ;后续操作;后续操作 int 21hint 21h .分支程序的其他问题分支程序的其他问题有些双分支问题可以先假设一种情况,把双分有些双分支问题可以先假设一种情况,把双分支改成单分支问题。如上例,先假设支改成单分支问题。如上例,先假设BXBX最高位为最高位为0 0,在分支外准备显示在分支外准备显示0 0;如最高位为;如最高位为0 0,即可直接跳到后,即可直接跳到后续操作;如最高位为续操作;如最高位为1 1才需要执行分支体。才需要执行分支体。mov dl,0mov dl,0 shl bx,1 shl bx,1 jnc jnc nextnext mov dl,1 mov dl,1nextnext:mov ah,2:mov ah,2 int 21h int 21h1515第 5 章 基 本 汇 编 语 言 程 序 设 计多分支分支的嵌套形成多分支,嵌套形式多种多样。分支的嵌套形成多分支,嵌套形式多种多样。例例1 1:求符号函数:求符号函数 1 1 当当 X0 X0Y=Y=0 0 当当 X=0 X=0 -1 -1 当当 X0 XSTR2STR1STR2,FLAGFLAG为为1 1;如果;如果STR1STR2STR1STR2,FLAGFLAG为为FFHFFH。3838第 5 章 基 本 汇 编 语 言 程 序 设 计例5.9 剔除空格程序例:剔除以结尾的字符串中的空格。例:剔除以结尾的字符串中的空格。双重循环程序:外层循环负责搜索字符串中的双重循环程序:外层循环负责搜索字符串中的空格;内层循环负责剔除搜索到的空格(由于空格后空格;内层循环负责剔除搜索到的空格(由于空格后的字符要依次向前移动一个字节,因而也是一个循环的字符要依次向前移动一个字节,因而也是一个循环结构)。结构)。无论是外层循环,还是内层循环,循环次数都无论是外层循环,还是内层循环,循环次数都未知,只能用未知,只能用“条件判断条件判断”控制循环。控制循环。外层循环采用外层循环采用“先判断、后循环先判断、后循环”结构;对内结构;对内层循环而言,由于搜索到空格才进入内循环,所以采层循环而言,由于搜索到空格才进入内循环,所以采用用“先循环、后判断先循环、后判断”结构。结构。3939第 5 章 基 本 汇 编 语 言 程 序 设 计例例:例:现有一个以现有一个以$结尾的字符串,要求剔除其中的空结尾的字符串,要求剔除其中的空格。格。.data.datastringstringdb Let us have a try!,$db Let us have a try!,$.code.code.startup.startupmov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21h ;显示原字符串显示原字符串mov al,mov al,;AL;AL空格(空格(ASCIIASCII码为码为20H20H)mov di,offset stringmov di,offset string4040第 5 章 基 本 汇 编 语 言 程 序 设 计例outlp:cmp byte ptr di,$outlp:cmp byte ptr di,$;外循环,先判断后循外循环,先判断后循环环jz donejz done ;为为$结束结束cmp al,dicmp al,di ;检测是否是空格检测是否是空格jnz nextjnz next ;不是空格继续外循环不是空格继续外循环mov si,di mov si,di ;是空格,进入剔除空格分支是空格,进入剔除空格分支inlp:inc si inlp:inc si ;该分支是循环程序段该分支是循环程序段mov ah,simov ah,si ;取空格后的一个字符取空格后的一个字符mov si-1,ah mov si-1,ah ;向前移动一个字节;向前移动一个字节cmp byte ptr si,$cmp byte ptr si,$;内循环,先循环后判断内循环,先循环后判断jnz inlpjnz inlp4141第 5 章 基 本 汇 编 语 言 程 序 设 计例next:inc dinext:inc di ;继续对后续字符进行处理继续对后续字符进行处理 jmp outlp jmp outlpdone:mov dx,offset stringdone:mov dx,offset string mov ah,9 mov ah,9 int 21h int 21h ;显示处理后字符串显示处理后字符串.exit 0.exit 0 ;结束结束 end end返回第四章返回第四章4242第 5 章 基 本 汇 编 语 言 程 序 设 计5.4(目录)子程序设计 4.4 4.4 子程序设计子程序设计 把功能相对独立的程序段单独编写和调试,作为把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序。一个相对独立的模块供程序使用,就形成子程序。使用子程序:简化源程序结构;提高编程效率。使用子程序:简化源程序结构;提高编程效率。4.4.1 4.4.1 过程定义伪指令过程定义伪指令 4.4.2 4.4.2 子程序的参数传递子程序的参数传递 4.4.3 4.4.3 子程序的嵌套递归重入子程序的嵌套递归重入 4.4.4 4.4.4 子程序的应用子程序的应用返回第四章返回第四章4343第 5 章 基 本 汇 编 语 言 程 序 设 计5.4.1 过程定义伪指令(1)4.4.1 4.4.1 过程定义伪指令过程定义伪指令过程名过程名 PROC NEAR|FAR PROC NEAR|FAR 过程体过程体 RET RET(RET NRET N)过程名过程名 ENDP ENDP过程名:符合语法的标识符;同模块唯一性。过程名:符合语法的标识符;同模块唯一性。距离属性:距离属性:可省略,由汇编程序判断。可省略,由汇编程序判断。堆栈使用:平衡。才能保证堆栈使用:平衡。才能保证RETRET指令弹出的是断指令弹出的是断点地址。点地址。保护现场与恢复现场:子程序用到的寄存器或保护现场与恢复现场:子程序用到的寄存器或存储单元,注意:后进先出。存储单元,注意:后进先出。注意子程序的规范和格式注意子程序的规范和格式PUSH AXPUSH AXPUSH BXPUSH BXPUSH CXPUSH CXPUSH DXPUSH DXPOP DXPOP DXPOP CXPOP CXPOP BXPOP BXPOP AXPOP AX4444第 5 章 基 本 汇 编 语 言 程 序 设 计 关于“距离属性”关于关于“距离属性距离属性”vNEARNEAR属性(段内近调用)的过程只能被相同代码段属性(段内近调用)的过程只能被相同代码段的其他程序调用的其他程序调用vFARFAR属性(段间远调用)的过程可以被相同或不同属性(段间远调用)的过程可以被相同或不同代码段的程序调用代码段的程序调用 对简化段定义格式,在微型、小型和紧凑存储模对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为式下,过程的缺省属性为nearnear;在中型、大型和巨型;在中型、大型和巨型存储模式下,过程的缺省属性为存储模式下,过程的缺省属性为farfar 对完整段定义格式,过程的缺省属性为对完整段定义格式,过程的缺省属性为nearnear用户可以在过程定义时用用户可以在过程定义时用nearnear或或farfar改变缺省属性改变缺省属性4545第 5 章 基 本 汇 编 语 言 程 序 设 计 子程序规范子程序规范子程序规范 一个完整的子程序,特别是供其他编程人员使用一个完整的子程序,特别是供其他编程人员使用的子程序,必须附有一个详细说明:的子程序,必须附有一个详细说明:子程序名(过程名)子程序名(过程名)子程序功能介绍子程序功能介绍子程序的入口参数子程序的入口参数子程序的出口参数子程序的出口参数子程序内使用的寄存器(存储单元)子程序内使用的寄存器(存储单元)使用该子程序的范例使用该子程序的范例v子程序名:子程序名:DTOBv功能:完成两位十进制数转换成二进制数功能:完成两位十进制数转换成二进制数v入口参数:入口参数:AL存放待转换的两位存放待转换的两位BCD码码v出口参数:出口参数:CL存放转换后的二进制数存放转换后的二进制数v占用寄存器:占用寄存器:BXv示例:输入示例:输入AL=01010110B(56H)输出输出CL=00111000B(38H)某某子子程程序序的的说说明明4646第 5 章 基 本 汇 编 语 言 程 序 设 计 子程序的常见格式子程序的常见格式子程序的常见格式;子程序说明;子程序说明;子程序说明;子程序说明subnamesubname procproc;具有缺省属性的具有缺省属性的subnamesubname过程过程push axpush ax;保护寄存器:顺序压入堆栈保护寄存器:顺序压入堆栈push bxpush bx;ax/bx/cx;ax/bx/cx仅是示例仅是示例push cxpush cx;过程体过程体pop cxpop cx;恢复寄存器:逆序弹出堆栈恢复寄存器:逆序弹出堆栈pop bxpop bxpop axpop axretret;过程返回过程返回subnamesubname endpendp;过程结束过程结束4747第 5 章 基 本 汇 编 语 言 程 序 设 计 简单子程序 简单子程序简单子程序;子程序功能:实现光标回车换行子程序功能:实现光标回车换行dpcrlfdpcrlfprocproc ;过程开始过程开始push axpush ax ;保护寄存器保护寄存器AXAX和和DXDXpush dxpush dxmov dl,0dhmov dl,0dh ;显示回车显示回车mov ah,2mov ah,2int 21hint 21hmov dl,0ahmov dl,0ah ;显示换行显示换行mov ah,2mov ah,2int 21hint 21hpop dxpop dx ;恢复寄存器恢复寄存器DXDX和和AXAXpop axpop axretret ;子程序返回子程序返回dpcrlfdpcrlfendpendp ;过程结束过程结束4848第 5 章 基 本 汇 编 语 言 程 序 设 计 例:编写子程序(e)例例4.104.10:编写子程序,将:编写子程序,将ALAL寄存器内的二进制数寄存器内的二进制数用十六进制数显示。用十六进制数显示。8 8位二进制数,可转换成两位十六进制数。位二进制数,可转换成两位十六进制数。十六进制数十六进制数ASCIIASCII码码2#2#功能调用显示功能调用显示1001B9H1001+1001B9H1001+0011 00000011 000039H39H(9 9的的ASCIIASCII)1010BAH1010+1010BAH1010+0011 01110011 011141H41H(A A的的ASCIIASCII)注意:对注意:对0-90-9加加30H30H,对,对A-FA-F加加37H37H,即,即+30H+07H+30H+07H先转换高先转换高4 4位二进制数,并显示;然后转换低位二进制数,并显示;然后转换低4 4位位并显示。并显示。例题例题410410回回 4949第 5 章 基 本 汇 编 语 言 程 序 设 计5.4.2 子程序的参数传递 4.4.2 4.4.2 子程序的参数传递子程序的参数传递 主程序和子程序之间通常需要传递参数:主程序和子程序之间通常需要传递参数:v入口参数入口参数(输入参数):主程序提供给子程序(输入参数):主程序提供给子程序v出口参数出口参数(输出参数):子程序返回给主程序(输出参数):子程序返回给主程序v参数的形式参数的形式:数据本身(传值)数据本身(传值)数据的地址(传址)数据的地址(传址)v传递的方法传递的方法:寄存器寄存器 变量变量 堆栈堆栈5050第 5 章 基 本 汇 编 语 言 程 序 设 计参数传递方法 1.1.用寄存器传递参数用寄存器传递参数方便、简单、易行。须要传递的参数较多时不适用。方便、简单、易行。须要传递的参数较多时不适用。见例题见例题411a411a。2.2.用变量传递参数用变量传递参数就是用存储器传递参数,当主程序与子程序在同一个就是用存储器传递参数,当主程序与子程序在同一个模块时,即为共享数据段的变量;不在同一模块,需模块时,即为共享数据段的变量;不在同一模块,需要用要用PUBLIC/EXTERNPUBLIC/EXTERN声明。声明。适用与参数较多情况。见例题适用与参数较多情况。见例题411b411b。3.3.用堆栈传递参数用堆栈传递参数常用方法。用常用方法。用BPBP访问堆栈段。须格外注意堆栈的平衡。访问堆栈段。须格外注意堆栈的平衡。(堆栈示意图)堆栈示意图)5151第 5 章 基 本 汇 编 语 言 程 序 设 计 堆栈示堆栈示意图意图使用堆栈传递参数时堆栈示意图:使用堆栈传递参数时堆栈示意图:PUSH PUSH 参数参数1 1PUSH PUSH 参数参数2 2PUSH PUSH 参数参数3 3CALL SUBPROCALL SUBPRO .EXIT 0.EXIT 0SUBPRO PROCSUBPRO PROC PUSH BP PUSH BP MOV BP MOV BP,SPSP PUSH AX PUSH AX POP AXPOP AX POP BP POP BP RET(RET 6)RET(RET 6)SUBPRO ENDPSUBPRO ENDPA XA XB PB PI PI P参数参数3 3参数参数2 2参数参数1 1BP=SPBP=SPBP+2BP+2BP+4BP+4BP+6BP+6BP+8BP+8SP(SP(原始原始)子程序取参数:子程序取参数:MOV AXMOV AX,BP+4(6,8)BP+4(6,8)子程序平衡堆栈子程序平衡堆栈:RET 6:RET 6主程序平衡堆栈:主程序平衡堆栈:ADD SP ADD SP,6 6例题例题411c411cSPSP5252第 5 章 基 本 汇 编 语 言 程 序 设 计例题例题/1/1例题例题4.11c4.11c:计算累加和计算累加和;用堆栈传递参数;用堆栈传递参数;入口参数;入口参数:数组首地址、数组元素个数数组首地址、数组元素个数;出口参数:;出口参数:AL AL 累加和累加和 .model small .model small .stack .stack .data .datacount equ 10count equ 10array db array db 12h,25h,0f0h,0a3h,03,68h,71h,0cah,0ffh,90h12h,25h,0f0h,0a3h,03,68h,71h,0cah,0ffh,90hresult db?result db?5353第 5 章 基 本 汇 编 语 言 程 序 设 计例题例题/2/2 .code .code .startup .startup mov ax,offset array mov ax,offset array push ax ;push ax ;首地址入栈首地址入栈 mov ax,count mov ax,count push ax push ax ;元素个数入栈;元素个数入栈 call checksuma call checksuma add sp,4 add sp,4 ;平衡两个参数占用的堆栈;平衡两个参数占用的堆栈 mov result,al mov result,al .exit 0 .exit 05454第 5 章 基 本 汇 编 语 言 程 序 设 计例题例题/3/3checksuma procchecksuma proc push bp push bp mov bp,sp mov bp,sp;使;使BPBP指向刚进入子程序的堆栈指向刚进入子程序的堆栈顶,顶,push bx push bx push cx push cx mov bx,bp+6 mov bx,bp+6 mov cx,bp+4 mov cx,bp+4 xor al,al xor al,alsuma:add al,bxsuma:add al,bx inc bx inc bx loop suma loop suma5555第 5 章 基 本 汇 编 语 言 程 序 设 计例题例题/4/4 pop cx pop cx pop bx pop bx pop bp pop bp ret ret ;可以用;可以用RET 4RET 4checksuma endpchecksuma endp end end 5656第 5 章 基 本 汇 编 语 言 程 序 设 计 编写子程序时应注意的问题 编写子程序时应注意的问题:编写子程序时应注意的问题:使用简化的段定义格式时,过程定义在程序中使用简化的段定义格式时,过程定义在程序中的位置要注意,可以放在的位置要注意,可以放在1 1)主程序的最后,即)主程序的最后,即“.EXIT 0”“.EXIT 0”之后,之后,ENDEND语句之前;语句之前;2 2)放在主程序之)放在主程序之前,即前,即“.CODE”“.CODE”之后,之后,“.STARTUP”“.STARTUP”之前。之前。使用寄存器传递参数时,带有入口参数的寄存使用寄存器传递参数时,带有入口参数的寄存器可以保护,也可以不保护;带有出口参数的寄存器器可以保护,也可以不保护;带有出口参数的寄存器则一定不可保护和恢复;其他与出口参数无关、而子则一定不可保护和恢复;其他与出口参数无关、而子程序中使用的寄存器,子程序开始处应该保护,子程程序中使用的寄存器,子程序开始处应该保护,子程序结束、返回主程序之前应该恢复。序结束、返回主程序之前应该恢复。回回 5757第 5 章 基 本 汇 编 语 言 程 序 设 计5.4.3 子程序的嵌套递归重入4.4.3 4.4.3 子程序的嵌套、递归与重入子程序的嵌套、递归与重入1.1.子程序的嵌套子程序的嵌套子程序又调子程序称为子程序的嵌套,嵌套的层数取决于堆栈子程序又调子程序称为子程序的嵌套,嵌套的层数取决于堆栈空间的大小。嵌套子程序的设计和一般子程序完全相同。空间的大小。嵌套子程序的设计和一般子程序完全相同。2.2.子程序的递归子程序的递归子程序直接或间接地嵌套调用自己,称为递归调用。含有递归子程序直接或间接地嵌套调用自己,称为递归调用。含有递归调用的子程序称为递归子程序。调用的子程序称为递归子程序。每次调用时不能破坏以前调用所用的参数及中间结果,每次调用时不能破坏以前调用所用的参数及中间结果,因此,调用参数及中间结果一般都放在堆栈中。不可放因此,调用参数及中间结果一般都放在堆栈中。不可放在固定的寄存器或存储单元中。在固定的寄存器或存储单元中。要控制递归的次数,避免陷入死循环。要控制递归的次数,避免陷入死循环。递归深度受堆栈空间的限制。递归深度受堆栈空间的限制。5858第 5 章 基 本 汇 编 语 言 程 序 设 计 例题例题例题4.12 4.12 用递归子程序求用递归子程序求N N的阶乘,设的阶乘,设N=3N=3。递归次数用递归次数用N N控制,由控制,由N=3N=3,子程序共运行,子程序共运行4 4次(主程次(主程序调用序调用1 1次,递归调用次,递归调用3 3次);入口参数及中间结果都次);入口参数及中间结果都用堆栈保存。用堆栈保存。注释:注释:1 1)在进入子程序过程中,不计算阶乘值,)在进入子程序过程中,不计算阶乘值,只求中间参数。第一次进入,求出中间参数只求中间参数。第一次进入,求出中间参数2 2;第二;第二次进入求出中间参数次进入求出中间参数1 1;第三次进入求出中间参数;第三次进入求出中间参数0 0;第四次进入后,由于中间参数以为第四次进入后,由于中间参数以为0 0,开始执行返回,开始执行返回处理。处理。2 2)在返回过程中计算阶乘:在过程)在返回过程中计算阶乘:在过程3 3中计算中计算1*1=11*1=1,在过程在过程2 2中计算中计算1*2=21*2=2,在过程,在过程1 1中计算中计算2*3=62*3=6。3 3)递归子程序可设计出效率较高的程序,但是编程)递归子程序可设计出效率较高的程序,但是编程较难,编出的程序易读性差,使用不多。较难,编出的程序易读性差,使用不多。5959第 5 章 基 本 汇 编 语 言 程 序 设 计 子程序的重入(e)子程序被中断后,又被中断服务程序所调用,称为子子程序被中断后,又被中断服务程序所调用,称为子程序的重入。能够重入的子程序称为可重入子程序。程序的重入。能够重入的子程序称为可重入子程序。当主机与外设采用中断方式交换信息时,外设的驱动当主机与外设采用中断方式交换信息时,外设的驱动程序应按程序应按“可重入原则可重入原则”设计。设计。虽然重入与递归的概念不同,但递归子程序就是可重虽然重入与递归的概念不同,但递归子程序就是可重入子程序。设计可重入子程序与设计递归子程序的原入子程序。设计可重入子程序与设计递归子程序的原则是相同的,即参数、中间结果等都用堆栈保存,不则是相同的,即参数、中间结果等都用堆栈保存,不能用固定的存储单元或寄存器保存。能用固定的存储单元或寄存器保存。回回 6060第 5 章 基 本 汇 编 语 言 程 序 设 计5.4.4 子程序的应用 4.4.4 4.4.4 子程序的应用子程序的应用1 1)例题例题 计算有符号数的平均值。计算有符号数的平均值。有时进行运算之前,需要符号扩展;对无符号数有时进行运算之前,需要符号扩展;对无符号数应进行应进行0 0扩展。扩展。2 2)具有局部变量的子程序(截取教材)具有局部变量的子程序(截取教材P123P123部分部分程序):当某些数据只有子程序自己使用时,可在代程序):当某些数据只有子程序自己使用时,可在代码段子程序后面定义数据区。码段子程序后面定义数据区。3 3)具有多个出口的子程序:有的子程序具有多)具有多个出口的子程序:有的子程序具有多个出口,根据条件的不同,从不同的出口返回主程序。个出口,根据条件的不同,从不同的出口返回主程序。6161第 5 章 基 本 汇 编 语 言 程 序 设 计例5.15 计算平均值/1例例4.15 4.15 计算有符号数的平均值。计算有符号数的平均值。;入口参数用堆栈传递,出口参数用寄存器入口参数用堆栈传递,出口参数用寄存器AXAX传递。传递。;要计算要计算1616位有符号数的和,被加数一定要进行符号位有符号数的和,被加数一定要进行符号扩展。扩展。.model small .model small .stack .stack .data .dataarray dw 1234,-1234,1,1,-1,32767,-32768,5678,array dw 1234,-1234,1,1,-1,32767,-32768,5678,-5678,9000 -5678,9000 count equ($-array)/2 count equ($-array)/2;数据个数数据个数wmed dw?wmed dw?6262第 5 章 基 本 汇 编 语 言 程 序 设 计 /2 .code .code .startup .startup mov ax,count mov ax,count push ax push ax ;参数;参数1 1 mov ax,offset array mov ax,offset array push ax push ax ;参数;参数2 2 call mean call mean add sp,4 add sp,4 ;平衡堆栈;平衡堆栈 mov wmed,ax mov wmed,ax .exit 0 .exit 06363第 5 章 基 本 汇 编 语 言 程 序 设 计 /3mean procmean proc push bp push bp mov bp,sp mov bp,sp push bx push bx push cx push cx push dx push dx push si push si push di push di mov bx,bp+4 mov bx,bp+4;取参数;取参数2 2:偏移地址:偏移地址 mov cx,bp+6 mov cx,bp+6;取参数;取参数1 1:数据个数:数据个数 xor si,si xor si,si mov di,si mov di,si6464第 5 章 基 本 汇 编 语 言 程 序 设 计 /4mean1:mov ax,bxmean1:mov ax,bx cwd cwd add si,ax add si,ax adc di,dx adc di,dx inc bx inc bx inc bx inc bx loop mean1 loop mean1 mov ax,si mov ax,si mov dx,di mov dx,di mov cx,bp+6 mov cx,bp+6 +6565第 5 章 基 本 汇 编 语 言 程 序 设 计 /5 idiv cx ;idiv cx ;求平均值,商在求平均值,商在AXAX,余数在,余数在DXDX pop di pop di pop si pop si pop dx pop dx pop cx pop cx pop bx pop bx pop bp pop bp ret retmean endpmean endp end end 6666第 5 章 基 本 汇 编 语 言 程 序 设 计避免溢出的方法v为了避免有符号二进制数求和过程中溢出,被加数为了避免有符号二进制数求和过程中溢出,被加数要进行符号扩展,得到倍长数据(大小没有变化),要进行符号扩展,得到倍长数据(大小没有变化),然后求和然后求和v如数据采用如数据采用1616位二进制数表示,数据个数也采用位二进制数表示,数据个数也采用1616位二进制数表示,则最多为位二进制数表示,则最多为2 21616个数据。如将数据扩展个数据。如将数据扩展到到3232位二进制数表示,求和时,就不会出现溢出。位二进制数表示,求和时,就不会出现溢出。v考虑极端情况:数据全是考虑极端情况:数据全是2 21515(-32768-32768),共有),共有2 21616个,求和结果是个,求和结果

    注意事项

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

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开