版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 5 章 基 本 汇 编 语 言 程 序 设 计 第 5 章 基 本 汇 编 语 言 程 序 设 计第5章基本汇编语言程序设计第第5 5章章 基本汇编语言程序设计基本汇编语言程序设计5.15.1 顺序程序设计顺序程序设计5.2 5.2 分支程序设计分支程序设计5.3 5.3 循环程序设计循环程序设计 本章要点及习题分析本章要点及习题分析第 5 章 基 本 汇 编 语 言 程 序 设 计5.1顺序程序设计(e)5.15.1 顺序程序设计顺序程序设计指令按程序中的书写顺序逐条执行,称为顺序程指令按程序中的书写顺序逐条执行,称为顺序程序。除非编程解决非常简单的问题,顺序程序并不多序。除非编程解决非
2、常简单的问题,顺序程序并不多见,但是顺序程序往往是复杂程序结构的一部分,如见,但是顺序程序往往是复杂程序结构的一部分,如分支结构的一个分支,循环结构的循环体等。分支结构的一个分支,循环结构的循环体等。第 5 章 基 本 汇 编 语 言 程 序 设 计例5.1例例5.15.1:设有:设有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 ENDSCOD
3、ES 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 START第 5 章 基 本
4、汇 编 语 言 程 序 设 计【例【例5-35-3】 将一个字节压缩将一个字节压缩BCDBCD码转换为两个码转换为两个ASCIIASCII码。码。 分析:一个字节的压缩分析:一个字节的压缩BCDBCD码就是用一个字节的二进码就是用一个字节的二进制数表示两位十进制数,如十进制数制数表示两位十进制数,如十进制数9696表示成压缩表示成压缩BCDBCD码码就是就是96H96H,转换成,转换成ASCIIASCII码就是把压缩码就是把压缩BCDBCD码表示的十进制码表示的十进制数的高位和低位分开,并以数的高位和低位分开,并以ASCIIASCII码表示,即转换成码表示,即转换成39H39H和和36H36H
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 AXMOV AX,DATADATA MOV DS MOV
6、DS,AXAX MOV AL MOV AL,BCDBUF BCDBUF ;取出;取出BCDBCD码码 MOV BLMOV BL,ALAL ;送;送BLBL暂存暂存 MOV CLMOV 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)第 5 章 基 本 汇 编 语 言 程 序 设 计MOVMOVASCBUFASCBUF,ALAL;存储第;存储第1 1个个ASCIIASCII码码ANDANDBL
7、BL,0FH0FH;屏蔽掉高;屏蔽掉高4 4位,只保留低位,只保留低4 4位位(96H06H)(96H06H)ADDADDBLBL,30H30H ;变成;变成BCDBCD码码(36H)(36H)MOVMOVASCBUF+1ASCBUF+1,BLBL ;存储第;存储第2 2个码个码MOVMOVAHAH,4CH4CHINTINT21H21HCODECODE ENDS ENDSENDENDSTARTSTART第 5 章 基 本 汇 编 语 言 程 序 设 计【例【例5-45-4】 利用直接查表法完成将键盘输入的一位利用直接查表法完成将键盘输入的一位1010进制数进制数(09)(09)转换成对应的平方
8、值并存放在转换成对应的平方值并存放在SQRBUFSQRBUF单单元中。元中。 分析:分析:0909的平方值分别为的平方值分别为0 0、1 1、4 4、9 9、1616、2525、3636、4949、6464、8181。把平方值放在一起形成一个平方值。把平方值放在一起形成一个平方值表,根据输入的值和对应平方值所在单元地址之间的表,根据输入的值和对应平方值所在单元地址之间的关系关系( (表首地址加上输入的值表首地址加上输入的值) ),查出相应的平方值。,查出相应的平方值。第 5 章 基 本 汇 编 语 言 程 序 设 计DATADATA SEGMENT SEGMENTSQUTABSQUTABDB
9、0DB 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,DATADATA第 5 章 基 本 汇 编 语 言 程 序 设 计MOVMOV DSDS,AXAXMOVMOV BXBX,OFFSETOFFSETSQUTAB SQUTAB ;平方表首地址;平方表首地址MOVMOV AHAH,1 1INTINT
10、21H21H ;由键盘输入;由键盘输入个数,得到其个数,得到其ASCIIASCII码码SUBSUB ALAL,30H30H;由;由ASCIIASCII码得到相应的数码得到相应的数XLATXLAT;查表;查表MOVMOV SQUBUFSQUBUF,AL AL ;存储结果;存储结果MOVMOV AHAH,4CH4CHINTINT 21H21HCODECODE ENDSENDS END STARTEND START第 5 章 基 本 汇 编 语 言 程 序 设 计5.2分支程序设计4.2 4.2 分支程序设计分支程序设计条件转移指令条件转移指令JccJcc和无条件转移指令和无条件转移指令JMPJMP
11、用于实现用于实现程序的分支结构,程序的分支结构,JMPJMP不测试条件,不测试条件,JccJcc可根据条件是可根据条件是否成立决定转移到指定位置或不转移而顺序执行后续否成立决定转移到指定位置或不转移而顺序执行后续指令。由于指令。由于JccJcc不支持条件表达式,而是以当前标志位不支持条件表达式,而是以当前标志位的状态为条件,故的状态为条件,故JccJcc之前一定要安排设置标志位的指之前一定要安排设置标志位的指令,如加减法、比较、测试等指令。令,如加减法、比较、测试等指令。基本分支类型分基本分支类型分为单分支和双分支为单分支和双分支。第 5 章 基 本 汇 编 语 言 程 序 设 计单分支1.
12、1. 单分支类型单分支类型 对同一个问题,根据选择的条件不同,单分支结对同一个问题,根据选择的条件不同,单分支结构的流程图有两种画法,对应的程序也有两种编法。构的流程图有两种画法,对应的程序也有两种编法。如如计算计算AXAX中的有符号数的绝对值。中的有符号数的绝对值。第 5 章 基 本 汇 编 语 言 程 序 设 计单分支 cmp ax,0 jge noneg neg axNoneg: mov result,ax cmp ax,0 jnge yesneg jmp doneyesneg: neg axDone: mov result,axAX0 AX0 ?求补指令求补指令YN保存结果保存结果AX
13、AX0 0?求补指令求补指令YN保存结果保存结果JMP第 5 章 基 本 汇 编 语 言 程 序 设 计双分支2.2.双分支程序双分支程序 两个分支都有语句两个分支都有语句体,如何选择条件不重体,如何选择条件不重要。要。流程图中分支体的流程图中分支体的位置就是程序的实际顺位置就是程序的实际顺序,故分支语句体最序,故分支语句体最后一定要有一条后一定要有一条指令,跳过语句体,指令,跳过语句体,转移到转移到“后续操作后续操作”。条件成立?条件成立?分支语句体分支语句体2YN分支语句体分支语句体1 后后 续续 操操 作作 第 5 章 基 本 汇 编 语 言 程 序 设 计双分支双分支举例:显示双分支举
14、例:显示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 . .分支程序的其他问题分支程序的其他问题有些双分支问题可以先假设一种情况,把双分有些双分支问题可以先假设一种情况,把双分支改成单分支问题。如上例,先假设支改成单分支问题。如上例,先
15、假设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 21h第 5 章 基 本 汇 编 语 言 程 序 设 计多分支分支的嵌套形成多分支,嵌套形式多种多样。分支的嵌套形成多分支,嵌套形式多种多样。例例1 1:求符号函数:求
16、符号函数 1 1 当当 X0X0Y=Y= 0 0 当当 X=0X=0 -1 -1 当当 X0XSTR2STR1STR2,FLAGFLAG为为1 1;如果;如果STR1STR2STR1STR2,FLAGFLAG为为FFHFFH。第 5 章 基 本 汇 编 语 言 程 序 设 计例5.9 剔除空格程序例例5.95.9:剔除以结尾的字符串中的空格。:剔除以结尾的字符串中的空格。 双重循环程序:外层循环负责搜索字符串中的双重循环程序:外层循环负责搜索字符串中的空格;内层循环负责剔除搜索到的空格(由于空格后空格;内层循环负责剔除搜索到的空格(由于空格后的字符要依次向前移动一个字节,因而也是一个循环的字符
17、要依次向前移动一个字节,因而也是一个循环结构)。结构)。 无论是外层循环,还是内层循环,循环次数都无论是外层循环,还是内层循环,循环次数都未知,只能用未知,只能用“条件判断条件判断”控制循环。控制循环。 外层循环采用外层循环采用“先判断、后循环先判断、后循环”结构;对内结构;对内层循环而言,由于搜索到空格才进入内循环,所以采层循环而言,由于搜索到空格才进入内循环,所以采用用“先循环、后判断先循环、后判断”结构。结构。第 5 章 基 本 汇 编 语 言 程 序 设 计例5.9/1例例5.95.9:现有一个以现有一个以$ $结尾的字符串,要求剔除其中的结尾的字符串,要求剔除其中的空格。空格。.da
18、ta.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 string第 5 章 基 本 汇 编 语 言 程 序 设 计例5.9/2o
19、utlp: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 ; ;取空格后的一个字符取空格后的一个字
20、符mov si-1,ah mov si-1,ah ;向前移动一个字节;向前移动一个字节cmp byte ptr si,$cmp byte ptr si,$; ;内循环,先循环后判内循环,先循环后判断断jnz inlpjnz inlp第 5 章 基 本 汇 编 语 言 程 序 设 计例5.9/3next:inc dinext:inc di ; ;继续对后续字符进行处理继续对后续字符进行处理 jmp outlpjmp outlpdone:mov dx,offset stringdone:mov dx,offset string mov ah,9 mov ah,9 int 21h int 21h ;
21、 ;显示处理后字符串显示处理后字符串 .exit 0.exit 0 ; ;结束结束 endend第 5 章 基 本 汇 编 语 言 程 序 设 计5.4 (目录)子程序设计 4.4 4.4 子程序设计子程序设计 把功能相对独立的程序段单独编写和调试,作为把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序。一个相对独立的模块供程序使用,就形成子程序。 使用子程序:简化源程序结构;提高编程效率。使用子程序:简化源程序结构;提高编程效率。 4.4.1 4.4.1 过程定义伪指令过程定义伪指令 4.4.2 4.4.2 子程序的参数传递子程序的参数传递 4.4.3 4.
22、4.3 子程序的嵌套递归重入子程序的嵌套递归重入 4.4.4 4.4.4 子程序的应用子程序的应用第 5 章 基 本 汇 编 语 言 程 序 设 计5.4.1 过程定义伪指令(1)4.4.1 4.4.1 过程定义伪指令过程定义伪指令过程名过程名 PROC NEAR|FARPROC NEAR|FAR 过程体过程体 RETRET(RET NRET N) 过程名过程名 ENDPENDP过程名:符合语法的标识符;同模块唯一性。过程名:符合语法的标识符;同模块唯一性。距离属性:可省略,由汇编程序判断。距离属性:可省略,由汇编程序判断。堆栈使用:平衡。才能保证堆栈使用:平衡。才能保证RETRET指令弹出的
23、是断指令弹出的是断点地址。点地址。保护现场与恢复现场:子程序用到的寄存器或保护现场与恢复现场:子程序用到的寄存器或存储单元,注意:后进先出。存储单元,注意:后进先出。注意子程序的规范和格式注意子程序的规范和格式PUSH AXPUSH AXPUSH BXPUSH BXPUSH CXPUSH CXPUSH DXPUSH DXPOP DXPOP DXPOP CXPOP CXPOP BXPOP BXPOP AXPOP AX第 5 章 基 本 汇 编 语 言 程 序 设 计 关于“距离属性” 关于关于“距离属性距离属性”vNEARNEAR属性(段内近调用)的过程只能被相同代码段属性(段内近调用)的过程只
24、能被相同代码段的其他程序调用的其他程序调用vFARFAR属性(段间远调用)的过程可以被相同或不同属性(段间远调用)的过程可以被相同或不同代码段的程序调用代码段的程序调用 对简化段定义格式,在微型、小型和紧凑存储模对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为式下,过程的缺省属性为nearnear;在中型、大型和巨型;在中型、大型和巨型存储模式下,过程的缺省属性为存储模式下,过程的缺省属性为farfar 对完整段定义格式,过程的缺省属性为对完整段定义格式,过程的缺省属性为nearnear用户可以在过程定义时用用户可以在过程定义时用nearnear或或farfar改变缺省属性改变
25、缺省属性第 5 章 基 本 汇 编 语 言 程 序 设 计 子程序规范子程序规范子程序规范 一个完整的子程序,特别是供其他编程人员使用一个完整的子程序,特别是供其他编程人员使用的子程序,必须附有一个详细说明:的子程序,必须附有一个详细说明:子程序名(过程名)子程序名(过程名)子程序功能介绍子程序功能介绍子程序的入口参数子程序的入口参数子程序的出口参数子程序的出口参数子程序内使用的寄存器(存储单元)子程序内使用的寄存器(存储单元)使用该子程序的范例使用该子程序的范例v子程序名:子程序名:DTOBv功能:完成两位十进制数转换成二进制数功能:完成两位十进制数转换成二进制数v入口参数:入口参数:AL存
26、放待转换的两位存放待转换的两位BCD码码v出口参数:出口参数:CL存放转换后的二进制数存放转换后的二进制数v占用寄存器:占用寄存器:BXv示例:输入示例:输入AL=01010110B (56H) 输出输出CL=00111000B (38H)某子程序的说明某子程序的说明第 5 章 基 本 汇 编 语 言 程 序 设 计 子程序的常见格式子程序的常见格式子程序的常见格式;子程序说明;子程序说明;子程序说明;子程序说明subnamesubname procproc; ;具有缺省属性的具有缺省属性的subnamesubname过程过程push axpush ax; ;保护寄存器:顺序压入堆栈保护寄存器
27、:顺序压入堆栈push bxpush bx;ax/bx/cx;ax/bx/cx仅是示例仅是示例push cxpush cx; ;过程体过程体pop cxpop cx; ;恢复寄存器:逆序弹出堆栈恢复寄存器:逆序弹出堆栈pop bxpop bxpop axpop axretret; ;过程返回过程返回subnamesubname endpendp; ;过程结束过程结束第 5 章 基 本 汇 编 语 言 程 序 设 计 简单子程序 简单子程序简单子程序; ;子程序功能:实现光标回车换行子程序功能:实现光标回车换行dpcrlfdpcrlfprocproc ; ;过程开始过程开始push axpush
28、 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 ; ;过程结束过程结束第 5 章 基 本 汇 编 语 言 程 序 设 计 例5.10:编写子
29、程序(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
30、,对,对A-FA-F加加37H37H,即,即+30H+07H+30H+07H先转换高先转换高4 4位二进制数,并显示;然后转换低位二进制数,并显示;然后转换低4 4位位并显示。并显示。第 5 章 基 本 汇 编 语 言 程 序 设 计5.4.2 子程序的参数传递 4.4.2 4.4.2 子程序的参数传递子程序的参数传递 主程序和子程序之间通常需要传递参数:主程序和子程序之间通常需要传递参数:v入口参数入口参数(输入参数):主程序提供给子程序(输入参数):主程序提供给子程序v出口参数出口参数(输出参数):子程序返回给主程序(输出参数):子程序返回给主程序v参数的形式参数的形式: 数据本身(传值)
31、数据本身(传值) 数据的地址(传址)数据的地址(传址)v传递的方法传递的方法: 寄存器寄存器 变量变量 堆栈堆栈第 5 章 基 本 汇 编 语 言 程 序 设 计参数传递方法 1.1.用寄存器传递参数用寄存器传递参数方便、简单、易行。须要传递的参数较多时不适方便、简单、易行。须要传递的参数较多时不适用。见例题用。见例题411a411a。2.2.用变量传递参数用变量传递参数就是用存储器传递参数,当主程序与子程序在同就是用存储器传递参数,当主程序与子程序在同一个模块时,即为共享数据段的变量;不在同一模块,一个模块时,即为共享数据段的变量;不在同一模块,需要用需要用PUBLIC/EXTERNPUBL
32、IC/EXTERN声明。声明。适用与参数较多情况。见例题适用与参数较多情况。见例题411b411b。3.3.用堆栈传递参数用堆栈传递参数常用方法。用常用方法。用BPBP访问堆栈段。须格外注意堆栈的访问堆栈段。须格外注意堆栈的平衡。平衡。( (堆栈示意图)堆栈示意图)第 5 章 基 本 汇 编 语 言 程 序 设 计 堆栈示意图堆栈示意图使用堆栈传递参数时堆栈示意图:使用堆栈传递参数时堆栈示意图: PUSH PUSH 参数参数1 1PUSH PUSH 参数参数2 2PUSH PUSH 参数参数3 3CALL SUBPROCALL SUBPRO .EXIT 0.EXIT 0SUBPRO PROCS
33、UBPRO 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主
34、程序平衡堆栈:主程序平衡堆栈: ADD SPADD SP,6 6例题例题411c411cSPSP第 5 章 基 本 汇 编 语 言 程 序 设 计例题例题5.11c/15.11c/1例题例题4.11c4.11c:计算累加和计算累加和;用堆栈传递参数;用堆栈传递参数;入口参数;入口参数: :数组首地址、数组元素个数数组首地址、数组元素个数;出口参数:;出口参数:AL AL 累加和累加和 .model small.model small .stack .stack .data .datacount equ 10count equ 10array db array db 12h,25h,0f0h,0
35、a3h,03,68h,71h,0cah,0ffh,90h12h,25h,0f0h,0a3h,03,68h,71h,0cah,0ffh,90hresult db ?result db ?第 5 章 基 本 汇 编 语 言 程 序 设 计例题例题5.11c/25.11c/2 .code .code .startup .startup mov ax,offset array mov ax,offset array push ax ; push ax ;首地址入栈首地址入栈 mov ax,countmov ax,count push ax push ax ;元素个数入栈;元素个数入栈 call che
36、cksumacall checksuma add sp,4 add sp,4 ;平衡两个参数占用的堆栈;平衡两个参数占用的堆栈 mov result,almov result,al .exit 0 .exit 0第 5 章 基 本 汇 编 语 言 程 序 设 计例题例题5.11c/35.11c/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,b
37、p+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 suma第 5 章 基 本 汇 编 语 言 程 序 设 计例题例题5.11c/45.11c/4 pop cx pop cx pop bx pop bx pop bp pop bp ret ret ;可以用;可以用RET 4RET 4checksuma endpchecksuma endp end end 第 5 章 基 本 汇 编 语 言 程 序 设 计 编写子程序时应注意的问题 编
38、写子程序时应注意的问题:编写子程序时应注意的问题: 使用简化的段定义格式时,过程定义在程序中使用简化的段定义格式时,过程定义在程序中的位置要注意,可以放在的位置要注意,可以放在1 1)主程序的最后,即)主程序的最后,即“.EXIT 0”.EXIT 0”之后,之后,ENDEND语句之前;语句之前;2 2)放在主程序之)放在主程序之前,即前,即“.CODE”.CODE”之后,之后,“.STARTUP”.STARTUP”之前。之前。 使用寄存器传递参数时,带有入口参数的寄存使用寄存器传递参数时,带有入口参数的寄存器可以保护,也可以不保护;带有出口参数的寄存器器可以保护,也可以不保护;带有出口参数的寄
39、存器则一定不可保护和恢复;其他与出口参数无关、而子则一定不可保护和恢复;其他与出口参数无关、而子程序中使用的寄存器,子程序开始处应该保护,子程程序中使用的寄存器,子程序开始处应该保护,子程序结束、返回主程序之前应该恢复。序结束、返回主程序之前应该恢复。第 5 章 基 本 汇 编 语 言 程 序 设 计5.4.3 子程序的嵌套递归重入4.4.3 4.4.3 子程序的嵌套、递归与重入子程序的嵌套、递归与重入1.1.子程序的嵌套子程序的嵌套子程序又调子程序称为子程序的嵌套,嵌套的层数取决子程序又调子程序称为子程序的嵌套,嵌套的层数取决于堆栈空间的大小。嵌套子程序的设计和一般子程序完全相同。于堆栈空间
40、的大小。嵌套子程序的设计和一般子程序完全相同。2.2.子程序的递归子程序的递归子程序直接或间接地嵌套调用自己,称为递归调用。含子程序直接或间接地嵌套调用自己,称为递归调用。含有递归调用的子程序称为递归子程序。有递归调用的子程序称为递归子程序。每次调用时不能破坏以前调用所用的参数及中间结果,每次调用时不能破坏以前调用所用的参数及中间结果,因此,调用参数及中间结果一般都放在堆栈中。不可放因此,调用参数及中间结果一般都放在堆栈中。不可放在固定的寄存器或存储单元中。在固定的寄存器或存储单元中。要控制递归的次数,避免陷入死循环。要控制递归的次数,避免陷入死循环。递归深度受堆栈空间的限制。递归深度受堆栈空
41、间的限制。第 5 章 基 本 汇 编 语 言 程 序 设 计 例题5.12例题例题4.12 4.12 用递归子程序求用递归子程序求N N的阶乘,设的阶乘,设N=3N=3。递归次数用递归次数用N N控制,由控制,由N=3N=3,子程序共运行,子程序共运行4 4次(主程次(主程序调用序调用1 1次,递归调用次,递归调用3 3次);入口参数及中间结果都次);入口参数及中间结果都用堆栈保存。用堆栈保存。注释:注释:1 1)在进入子程序过程中,不计算阶乘值,)在进入子程序过程中,不计算阶乘值,只求中间参数。第一次进入,求出中间参数只求中间参数。第一次进入,求出中间参数2 2;第二;第二次进入求出中间参数
42、次进入求出中间参数1 1;第三次进入求出中间参数;第三次进入求出中间参数0 0;第四次进入后,由于中间参数以为第四次进入后,由于中间参数以为0 0,开始执行返回,开始执行返回处理。处理。 2 2)在返回过程中计算阶乘:在过程)在返回过程中计算阶乘:在过程3 3中计算中计算1 1* *1=11=1,在过程在过程2 2中计算中计算1 1* *2=22=2,在过程,在过程1 1中计算中计算2 2* *3=63=6。 3 3)递归子程序可设计出效率较高的程序,但是编程)递归子程序可设计出效率较高的程序,但是编程较难,编出的程序易读性差,使用不多。较难,编出的程序易读性差,使用不多。第 5 章 基 本
43、汇 编 语 言 程 序 设 计 子程序的重入(e)3.3.子程序的重入子程序的重入子程序被中断后,又被中断服务程序所调用,称子程序被中断后,又被中断服务程序所调用,称为子程序的重入。能够重入的子程序称为可重入子程为子程序的重入。能够重入的子程序称为可重入子程序。当主机与外设采用中断方式交换信息时,外设的序。当主机与外设采用中断方式交换信息时,外设的驱动程序应按驱动程序应按“可重入原则可重入原则”设计。设计。虽然重入与递归的概念不同,但递归子程序就是虽然重入与递归的概念不同,但递归子程序就是可重入子程序。设计可重入子程序与设计递归子程序可重入子程序。设计可重入子程序与设计递归子程序的原则是相同的
44、,即参数、中间结果等都用堆栈保存,的原则是相同的,即参数、中间结果等都用堆栈保存,不能用固定的存储单元或寄存器保存。不能用固定的存储单元或寄存器保存。第 5 章 基 本 汇 编 语 言 程 序 设 计5.4.4 子程序的应用 4.4.4 4.4.4 子程序的应用子程序的应用1 1)例题例题4.154.15 计算有符号数的平均值。计算有符号数的平均值。 有时进行运算之前,需要符号扩展;对无符号数有时进行运算之前,需要符号扩展;对无符号数应进行应进行0 0扩展。扩展。 2 2)具有局部变量的子程序(截取教材)具有局部变量的子程序(截取教材P123P123部分程部分程序):当某些数据只有子程序自己使
45、用时,可在代码序):当某些数据只有子程序自己使用时,可在代码段子程序后面定义数据区。段子程序后面定义数据区。 3 3)具有多个出口的子程序:有的子程序具有多个)具有多个出口的子程序:有的子程序具有多个出口,根据条件的不同,从不同的出口返回主程序。出口,根据条件的不同,从不同的出口返回主程序。第 5 章 基 本 汇 编 语 言 程 序 设 计例5.15 计算平均值/1例例4.15 4.15 计算有符号数的平均值。计算有符号数的平均值。; ;入口参数用堆栈传递,出口参数用寄存器入口参数用堆栈传递,出口参数用寄存器AXAX传递。传递。; ;要计算要计算1616位有符号数的和,被加数一定要进行符号位有
46、符号数的和,被加数一定要进行符号扩展。扩展。 .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 ?第 5 章 基 本 汇 编 语 言 程 序 设 计 /2 .code .code .
47、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,axmov wmed,ax .exit 0 .exit 0第 5 章 基 本 汇 编 语 言 程 序 设 计 /3mean procmean proc push bp push bp mov bp,sp mov b
48、p,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+6mov cx,bp+6;取参数;取参数1 1:数据个数:数据个数 xor si,sixor si,si mov di,si mov di,si第 5 章 基 本 汇 编 语 言 程 序 设 计 /4mean1: mov ax,bxmean1: mov ax,bx cwd cwd add si,ax add si,ax
49、 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 dx.ax dx.ax + di.si + di.si di.si di.si第 5 章 基 本 汇 编 语 言 程 序 设 计 /5 idiv cx ; idiv cx ;求平均值,商在求平均值,商在AXAX,余数在,余数在DXDX pop di pop di pop si pop si pop dx pop dx pop c
50、x pop cx pop bx pop bx pop bp pop bp ret retmean endpmean endp end end 第 5 章 基 本 汇 编 语 言 程 序 设 计避免溢出的方法v为了避免有符号二进制数求和过程中溢出,被加数为了避免有符号二进制数求和过程中溢出,被加数要进行符号扩展,得到倍长数据(大小没有变化),要进行符号扩展,得到倍长数据(大小没有变化),然后求和然后求和v如数据采用如数据采用1616位二进制数表示,数据个数也采用位二进制数表示,数据个数也采用1616位二进制数表示,则最多为位二进制数表示,则最多为2 21616个数据。如将数据扩展个数据。如将数据
51、扩展到到3232位二进制数表示,求和时,就不会出现溢出。位二进制数表示,求和时,就不会出现溢出。v考虑极端情况:数据全是考虑极端情况:数据全是2 21515(-32768-32768),共有),共有2 21616个,求和结果是个,求和结果是2 23131,3232位数据仍然可以表达。位数据仍然可以表达。v对于无符号数,有时也需要得到倍长数据,应采用对于无符号数,有时也需要得到倍长数据,应采用“0 0扩展扩展”,即将高位置,即将高位置0 0,如,如“MOV DXMOV DX,0”0”。第 5 章 基 本 汇 编 语 言 程 序 设 计; ;将将ALAL低低4 4位表达的一位位表达的一位1616进
52、制数转换为进制数转换为ASCIIASCII码码H2ASCH2ASCprocprocpush bxpush bxmov bx,offset ASCIImov bx,offset ASCII ;BX;BX指向指向ASCIIASCII码表码表and al,0fhand al,0fh; ;取得一位取得一位1616进制数进制数xlat CS:ASCIIxlat CS:ASCII; ;换码:换码:ALCS:BXALCS:BXALAL,注意数据在代码段,注意数据在代码段CSCSpop bxpop bxretret; ;子程序返回子程序返回ASCIIASCIIdb 30h,31h,32h,33h,34h,35
53、h,36h,37hdb 30h,31h,32h,33h,34h,35h,36h,37hdb 38h,39h,41h,42h,43h,44h,45h,46hdb 38h,39h,41h,42h,43h,44h,45h,46hH2ASCH2ASCendpendp 因为数据区与子程序都在代码段,所以利用因为数据区与子程序都在代码段,所以利用了换码指令了换码指令XLATXLAT的另一种助记格式(写出指向的另一种助记格式(写出指向缓冲区的变量名,目的是便于指明段超越前缓冲区的变量名,目的是便于指明段超越前缀)。串操作缀)。串操作MOVSMOVS、LODSLODS和和CMPSCMPS指令也可以这指令也可以
54、这样使用,以便使用段超越前缀样使用,以便使用段超越前缀 除采用段超越方法外,子程序与主程序的数除采用段超越方法外,子程序与主程序的数据段不同时,我们还可以通过修改据段不同时,我们还可以通过修改DSDS值实现数值实现数据存取;但需要保护和恢复据存取;但需要保护和恢复DSDS寄存器寄存器第 5 章 基 本 汇 编 语 言 程 序 设 计HTOASCHTOASCprocproc; ;将将ALAL低低4 4位表达的一位位表达的一位1616进制数转换为进制数转换为ASCIIASCII码码and al,0fhand al,0fhcmp al,9cmp al,9jbe htoasc1jbe htoasc1a
55、dd al,37hadd al,37h; ;是是0AH0AH0FH0FH,加,加37H37Hretret ; ;子程序返回子程序返回htoasc1:htoasc1: add al,30hadd al,30h; ;是是0 09 9,加,加30H30Hretret ; ;子程序返回子程序返回HTOASCHTOASCendpendp第 5 章 基 本 汇 编 语 言 程 序 设 计例5.13例例4.13 4.13 编写子程序从键盘输入一个有符号十进制数;编写子程序从键盘输入一个有符号十进制数;并将输入的并将输入的ASCIIASCII码转换为二进制数。码转换为二进制数。v输入时,负数用输入时,负数用“
56、”引导,正数直接输入或用引导,正数直接输入或用“”引导引导v子程序用寄存器传递出口参数,主程序调用该子程子程序用寄存器传递出口参数,主程序调用该子程序输入序输入1010个数据个数据v将将ASCIIASCII码转换为二进制数的过程码转换为二进制数的过程 首先判断输入为正或负数,并用一个寄存器记录首先判断输入为正或负数,并用一个寄存器记录 接着输入接着输入0 09 9数字(数字(ASCIIASCII码),并减码),并减30H30H转换为二进制数转换为二进制数 然后将前面输入的数值乘然后将前面输入的数值乘1010,并与刚输入的数字相加得到,并与刚输入的数字相加得到新的数值新的数值 重复重复、步,直到
57、输入一个非数字字符结束步,直到输入一个非数字字符结束 负数进行求补,转换成补码;否则直接保存数值负数进行求补,转换成补码;否则直接保存数值第 5 章 基 本 汇 编 语 言 程 序 设 计输入和转换流程图输入和转换流程图:输入和转换流程图:A A负数求补,正数不变负数求补,正数不变出口参数出口参数AXAX返回返回1 1号调用输入字符号调用输入字符是是+?是是-?置负数标志置负数标志输入下一个输入下一个0-90-9之间之间变成二进制数变成二进制数BXBX* *10+ALBX10+ALBXY YN NN NA A输入非数字字输入非数字字符,结束输入符,结束输入第 5 章 基 本 汇 编 语 言 程
58、 序 设 计输入数字举例设从键盘输入数字设从键盘输入数字 258258:输入顺序:输入顺序:- 2 5 8- 2 5 8 CX -1 -1 -1 -1 CX -1 -1 -1 -1 BX 0 0002 0019H=25 0102H=258 BX 0 0002 0019H=25 0102H=258数字输入结束后,由于数字输入结束后,由于CXCX为负数标志,为负数标志,再对再对BXBX求补。求补。 第 5 章 基 本 汇 编 语 言 程 序 设 计程序/1.data.datacountcount= 10= 10arrayarraydw count dup(0)dw count dup(0); ;预
59、留数据存储空间预留数据存储空间.code.code.startup.startupmov cx,countmov cx,countmov bx,offset arraymov bx,offset arrayagain:call readagain:call read; ;调用子程序输入一个数据调用子程序输入一个数据mov bx,axmov bx,ax; ;将出口参数存放缓冲区将出口参数存放缓冲区inc bxinc bxinc bxinc bxcall dpcrlfcall dpcrlf ; ;调用子程序,光标回车换行以便输入下一个数据调用子程序,光标回车换行以便输入下一个数据loop agai
60、nloop again.exit 0.exit 0这是主程序这是主程序第 5 章 基 本 汇 编 语 言 程 序 设 计程序/2; ;输入有符号输入有符号1010进制数的通用子程序进制数的通用子程序; ;出口参数:出口参数:AXAX补码表示的二进制数值补码表示的二进制数值readread proc procpush bxpush bxpush cxpush cxpush dxpush dxxor bx,bxxor bx,bx;BX;BX保存结果保存结果xor cx,cxxor cx,cx;CX;CX为正负标志,为正负标志,0 0为正,为正,1 1为负为负mov ah,1mov ah,1 ; ;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 季节性库存管理的工作计划
- 运动技能竞技活动拓展计划
- 烟台大学《数据结构与算法课程设计》2022-2023学年第一学期期末试卷
- 年度班级工作任务计划方案
- 信阳师范大学《Java语言程序设计实验》2023-2024学年第一学期期末试卷
- 西南林业大学《固体物理学》2022-2023学年第一学期期末试卷
- 幼儿园应急事故培训
- 西京学院《外国文学》2021-2022学年第一学期期末试卷
- 西华大学《Java程序设计》2023-2024学年第一学期期末试卷
- 西北大学《人物素描写生》2021-2022学年第一学期期末试卷
- 思维导图在初中生物学教学中的应用研究
- 花道-插花技艺养成智慧树知到课后章节答案2023年下云南林业职业技术学院
- 公司年度培训计划完整版
- 水稻未来发展趋势报告PPT
- 2023年入伍50年战友聚会发言稿范文
- 15-汉密尔顿焦虑量表
- 成人教育文献学专题复习题及参考答案
- 火灾直接财产损失统计方法
- 应用PDCA提高入院宣教的知晓率
- 电梯产品合格证
- 智能检测技术课件
评论
0/150
提交评论