




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、( (计算机接口技术计算机接口技术)3.6)3.6子子程序设计程序设计例例3.15 用显示器功能调用输出一个字符的子程序用显示器功能调用输出一个字符的子程序;主程序;主程序mov al,?;主程序提供显示字符;主程序提供显示字符call dpchar;调用子程序;调用子程序;子程序:显示;子程序:显示AL中的字符中的字符dpchar proc;过程定义,过程名为;过程定义,过程名为dpcharpush ax;顺序入栈,保护寄存器;顺序入栈,保护寄存器push bxmov bx,0mov ah,0eh ;显示器;显示器0EH号输出一个字符功能号输出一个字符功能int 10hpop bx;逆序出栈
2、,恢复寄存器;逆序出栈,恢复寄存器pop axret;子程序返回;子程序返回dpchar endp;过程结束;过程结束例例3.15源程序源程序;wj0315.asm.model small.stack.codestart:mov ax,datamov ds,axmov al,?;主程序提供显示字符;主程序提供显示字符call dpchar;调用子程序;调用子程序mov ax,4c00hint 21h主程序部分主程序部分本程序不需要数据段本程序不需要数据段例例3.15源程序(续)源程序(续)dpchar proc;过程定义,过程名为;过程定义,过程名为dpcharpush ax;顺序入栈,保护寄
3、存器;顺序入栈,保护寄存器push bxmov bx,0mov ah,0eh;显示器;显示器0EH号输出一个字符功能号输出一个字符功能int 10hpop bx;逆序出栈,恢复寄存器;逆序出栈,恢复寄存器pop axret;子程序返回;子程序返回dpchar endp;过程结束;过程结束end start子程序安排在主程序执行终止后的位置子程序安排在主程序执行终止后的位置子程序编写注意事项(续)子程序编写注意事项(续)子程序允许嵌套和递归子程序允许嵌套和递归子程序可以与主程序共用一个数据段,也可以使子程序可以与主程序共用一个数据段,也可以使用不同的数据段(注意修改用不同的数据段(注意修改DS)
4、,还可以在子程),还可以在子程序最后设置数据区(利用序最后设置数据区(利用CS寻址)寻址)子程序的编写可以很灵活,例如具有多个出口子程序的编写可以很灵活,例如具有多个出口(多个(多个RET指令)和入口,但一定要保证堆栈操指令)和入口,但一定要保证堆栈操作的正确性作的正确性处理好子程序与主程序间的参数传递问题处理好子程序与主程序间的参数传递问题提供必要的子程序说明信息提供必要的子程序说明信息例例3.16 显示以显示以“0”结尾字符串的嵌套子程序结尾字符串的嵌套子程序;数据段;数据段msgdb Well, I made it !,0;代码段(主程序);代码段(主程序)mov si,offset m
5、sg;主程序提供显示字符串;主程序提供显示字符串call dpstri;调用子程序;调用子程序例例3.16 子程序子程序;子程序;子程序dpstri:显示:显示DS:SI指向的字符串(以指向的字符串(以0结尾)结尾) dpstri procpush axdps1:mov al,si;取显示字符;取显示字符inc sicmp al,0;是结尾,则显示结束;是结尾,则显示结束jz dps2call dpchar;调用字符显示子程序;调用字符显示子程序jmp dps1dps2:pop axretdpstri endp;子程序;子程序dpchar:显示:显示AL中的字符(同例题中的字符(同例题3.15
6、)含数据区的子程序含数据区的子程序;子程序;子程序HTOASC:十六进制数转换为:十六进制数转换为ASCII码码 HTOASC procpush bxmov bx,offset ASCIIand al,0fhxlat CS:ASCII ;换码:;换码:ALCS:BXALpop bxret;数据区;数据区ASCIIdb 30h,31h,32h,33h,34h,35h,36h,37h,38h,39hdb 41h,42h,43h,44h,45h,46hHTOASC endp多出口子程序多出口子程序;子程序;子程序HTOASC:十六进制数转换为:十六进制数转换为ASCII码码 HTOASCprocan
7、d al,0fhcmp al,9jbe htoasc1add al,37h;是;是A F,加,加37Hret;子程序返回;子程序返回htoasc1:add,30h;是;是0 9,加,加30Hret;子程序返回;子程序返回HTOASCendp参数传递参数传递主程序与子程序间一个主要问题是参数传递主程序与子程序间一个主要问题是参数传递入口参数(输入参数)入口参数(输入参数) :主程序调用子程序时,提:主程序调用子程序时,提供给子程序的参数供给子程序的参数出口参数(输出参数)出口参数(输出参数) :子程序执行结束返回给主:子程序执行结束返回给主程序的参数程序的参数参数的具体内容参数的具体内容传数值:
8、传送数据本身传数值:传送数据本身传地址:传送数据的主存地址传地址:传送数据的主存地址常用的参数传递方法常用的参数传递方法寄存器寄存器共享变量共享变量堆栈堆栈3.6.2 用寄存器传递参数用寄存器传递参数最简单和常用的参数传递方法是通过寄存器,只最简单和常用的参数传递方法是通过寄存器,只要把参数存于约定的寄存器中就可以了要把参数存于约定的寄存器中就可以了由于通用寄存器个数有限,这种方法对少量数据由于通用寄存器个数有限,这种方法对少量数据可以直接传递数值,而对大量数据只能传递地址可以直接传递数值,而对大量数据只能传递地址采用寄存器传递参数,注意带有出口参数的寄存采用寄存器传递参数,注意带有出口参数的
9、寄存器不能保护和恢复,带有入口参数的寄存器可以器不能保护和恢复,带有入口参数的寄存器可以保护、也可以不保护,但最好能够保持一致保护、也可以不保护,但最好能够保持一致dpchardpstriHTOASC例例3.17 用寄存器传递参数显示用寄存器传递参数显示0结尾字符串结尾字符串;数据段;数据段msgdb Well, I made it !,0;代码段(主程序);代码段(主程序)mov si,offset msg;SI寄存器传递参数:字符串地址寄存器传递参数:字符串地址call dpstri;调用子程序调用子程序例例3.17 用寄存器传递参数显示用寄存器传递参数显示0结尾字符串(续)结尾字符串(续
10、);代码段(子程序);代码段(子程序)dpstri proc;显示以显示以0结尾的字符处结尾的字符处push ax;入口参数:入口参数:SI字符串地址字符串地址push dxdps1: mov dl,si;通过通过SI使用参数使用参数cmp dl,0 jz dps2mov ah,2int 21hinc sijmp dps1dps2: pop dxpop axretdpstri endp例例3.18 从键盘输入有符号十进制数从键盘输入有符号十进制数;数据段;数据段count= 10arraydw count dup(0);代码段(主程序);代码段(主程序)mov cx,countmov bx,o
11、ffset arrayagain:call read;调用子程序,输入一个数据调用子程序,输入一个数据mov bx,ax;存放出口参数存放出口参数inc bxinc bxcall dpcrlf;调用子程序:光标回车调用子程序:光标回车loop again将将ASCII码转换为二进制数的算法码转换为二进制数的算法 首先判断输入正数还是负数,并用一个寄存器首先判断输入正数还是负数,并用一个寄存器记录下来;记录下来; 接着输入接着输入0 9数字(数字(ASCII码),并减码),并减30H转换转换为二进制数;为二进制数; 然后将前面输入的数值乘然后将前面输入的数值乘10,并与刚输入的数,并与刚输入的数
12、字相加得到新的数值;字相加得到新的数值; 重复重复、步,直到输入一个非数字字符结束;步,直到输入一个非数字字符结束; 如果是负数进行求补,转换成补码;否则直接如果是负数进行求补,转换成补码;否则直接将数值保存。将数值保存。例例3.18 从键盘输入有符号十进制数(续从键盘输入有符号十进制数(续1)readproc;输入有符号十进制数输入有符号十进制数push bx;出口参数:出口参数:AXpush cx;说明:负数用说明:负数用“”引导引导push dxxor bx,bx;BX保存结果保存结果xor cx,cx;CX为正负标志,为正负标志,0为正,为正,1为负为负mov ah,1;输入一个字符输
13、入一个字符int 21hcmp al,+;是是“”,继续输入字符,继续输入字符jz read1cmp al,-;是是“”,设置,设置1标志标志jnz read2mov cx,-1例例3.18 从键盘输入有符号十进制数(续从键盘输入有符号十进制数(续2)read1: mov ah,1;继续输入字符继续输入字符int 21hread2: cmp al,0 ;不是不是09之间的字符,输入结束之间的字符,输入结束jb read3cmp al,9ja read3sub al,30h;是是09之间的字符,转换为二进制数之间的字符,转换为二进制数;利用移位指令,实现数值乘利用移位指令,实现数值乘10:BXB
14、X10shl bx,1mov dx,bxshl bx,1shl bx,1add bx,dx例例3.18 从键盘输入有符号十进制数(续从键盘输入有符号十进制数(续3)mov ah,0add bx,ax;已输入数值乘已输入数值乘10后,与新输入数值相加后,与新输入数值相加jmp read1;继续输入字符继续输入字符read3: cmp cx,0;是负数,进行求补是负数,进行求补jz read4neg bxread4: mov ax,bx;设置出口参数设置出口参数pop dxpop cxpop bxret;子程序返回子程序返回readendp例例3.18 从键盘输入有符号十进制数(续从键盘输入有符号
15、十进制数(续4)dpcrlfproc;使光标回车换行的子程序使光标回车换行的子程序push axpush dxmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlfendp3.6.3 用共享变量传递参数用共享变量传递参数子程序和主程序使用同一个变量名存取数据就是子程序和主程序使用同一个变量名存取数据就是利用共享变量(全局变量)进行参数传递利用共享变量(全局变量)进行参数传递如果变量定义和使用不在同一个源程序中,需要如果变量定义和使用不在同一个源程序中,需要利用利用PUBLIC、EXTREN声明声明如果主程序
16、还要利用原来的变量值,则需要保护如果主程序还要利用原来的变量值,则需要保护和恢复和恢复利用共享变量传递参数,子程序的通用性较差,利用共享变量传递参数,子程序的通用性较差,但特别适合在多个程序段间、尤其在不同的程序但特别适合在多个程序段间、尤其在不同的程序模块间传递数据模块间传递数据例例3.19 用共享变量传递参数显示字符串用共享变量传递参数显示字符串;数据段;数据段msgdb Well, I made it !,0tempdw ?;*共享变量共享变量;代码段(主程序);代码段(主程序)mov si,offset msg mov temp,si;*共享变量传递参数共享变量传递参数call dps
17、tri;调用子程序调用子程序例例3.19 用共享变量传递参数显示字符串(续)用共享变量传递参数显示字符串(续);代码段(子程序);代码段(子程序)dpstri proc;显示以显示以0结尾的字符处结尾的字符处push ax;入口参数:入口参数:temp字符串地址字符串地址push dxmov si,temp;*通过通过temp获得参数获得参数;后同例后同例3.16A程序程序例例3.20 向显示器输出有符号十进制数向显示器输出有符号十进制数 ;数据段;数据段count= 10arraydw 1234,-1234,0 wtempdw ?;代码段(主程序);代码段(主程序)mov cx,countm
18、ov bx,offset arrayagain:mov ax,bxmov wtemp,ax;将入口参数存放到共享变量将入口参数存放到共享变量call write;调用子程序,显示一个数据调用子程序,显示一个数据inc bxinc bxcall dpcrlf;光标回车换行光标回车换行loop again将二进制数转换为将二进制数转换为ASCII码的算法码的算法 首先判断数据是零、正数或负数,是零显示首先判断数据是零、正数或负数,是零显示“0”退出;退出; 是负数,显示是负数,显示“”,求数据的绝对值;,求数据的绝对值; 接着数据除以接着数据除以10,余数加,余数加30H转换为转换为ASCII码压
19、码压入堆栈;入堆栈; 重复重复步,直到商为步,直到商为0结束;结束; 依次从堆栈弹出各位数字,进行显示。依次从堆栈弹出各位数字,进行显示。例例3.20 向显示器输出有符号十进制数(续向显示器输出有符号十进制数(续1)writeproc;显示有符号显示有符号10进制数的通用子程序进制数的通用子程序push ax;入口参数:共享变量入口参数:共享变量wtemppush bxpush dxmov ax,wtemp;取出显示数据取出显示数据test ax,ax;判断数据是零、正数或负数判断数据是零、正数或负数jnz write1mov dl,0;是零,显示是零,显示“0”后退出后退出mov ah,2i
20、nt 21hjmp write5例例3.20 向显示器输出有符号十进制数(续向显示器输出有符号十进制数(续2)write1: jns write2;是负数,显示是负数,显示“”mov bx,ax;AX数据暂存于数据暂存于BXmov dl,-mov ah,2int 21hmov ax,bxneg ax;数据求补(绝对值)数据求补(绝对值)write2: mov bx,10push bx;10压入堆栈,作为退出标志压入堆栈,作为退出标志例例3.20 向显示器输出有符号十进制数(续向显示器输出有符号十进制数(续3)write3: cmp ax,0;数据(商)为零,转向显示数据(商)为零,转向显示jz
21、 write4sub dx,dx;扩展被除数扩展被除数DX.AXdiv bx;数据除以数据除以10:DX.AX10add dl,30h;余数(余数(0 9)转换为)转换为ASCII码码push dx;数据各位先低位后高位压入堆栈数据各位先低位后高位压入堆栈jmp write3write4: pop dx;数据各位先高位后低位弹出堆栈数据各位先高位后低位弹出堆栈cmp dl,10;是结束标志是结束标志10,则退出,则退出je write5例例3.20 向显示器输出有符号十进制数(续向显示器输出有符号十进制数(续4)mov ah,2;进行显示进行显示int 21hjmp write4write5:
22、 pop dxpop bxpop axret;子程序返回子程序返回writeendp3.6.4 用堆栈传递参数用堆栈传递参数参数传递还可以通过参数传递还可以通过堆栈堆栈这个临时存储区。主程这个临时存储区。主程序将入口参数压入堆栈,子程序从堆栈中取出参序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们栈取得它们采用堆栈传递参数是程式化的,它是编译程序处采用堆栈传递参数是程式化的,它是编译程序处理参数传递、以及汇编语言与高级语言混合编程理参数传递、以及汇编语言与高级语言混合编程时的常规方法时的常规方法例例3.21
23、 用堆栈传递参数显示字符串用堆栈传递参数显示字符串;数据段;数据段msgdb Well, I made it !,0;代码段(主程序);代码段(主程序)mov si,offset msg push si;*入口参数压入堆栈入口参数压入堆栈call dpstri;调用子程序调用子程序add sp,2;*平衡堆栈平衡堆栈例例3.21 用堆栈传递参数显示字符串(续)用堆栈传递参数显示字符串(续)dpstriproc;显示以显示以0结尾的字符处结尾的字符处push bp;*入口参数:堆栈字符串地址入口参数:堆栈字符串地址mov bp,sp;*通过通过BP获得堆栈内的参数获得堆栈内的参数push axp
24、ush dxmov si,bp+4;*通过通过BP指针获得参数指针获得参数dps2:pop dxpop axpop bp;*恢复恢复BP寄存器寄存器retdpstriendp例例3.22 计算有符号数平均值计算有符号数平均值 ;数据段;数据段count= 10arraydw 1234,-1234,0 wmeddw ?;代码段(主程序);代码段(主程序)mov ax,countpush ax;压入数据个数压入数据个数mov ax,offset arraypush ax;压入数据缓冲区的偏移地址压入数据缓冲区的偏移地址call mean;调用子程序,求平均值调用子程序,求平均值add sp,4;平
25、衡堆栈平衡堆栈mov wmed,ax;保存出口参数保存出口参数例例3.22 计算有符号数平均值(续计算有符号数平均值(续1)meanproc;计算计算16位有符号数平均值子程序位有符号数平均值子程序;入口参数:顺序压入数据个数和数据缓冲区偏移地址入口参数:顺序压入数据个数和数据缓冲区偏移地址push bp;出口参数:出口参数:AX平均值平均值mov bp,sppush bxpush cxpush dxpush sipush dimov bx,bp+4;从堆栈中取出缓冲区偏移地址从堆栈中取出缓冲区偏移地址BXmov cx,bp+6;从堆栈中数据个数从堆栈中数据个数CX例例3.22 计算有符号数平均值(续计算有符号数平均值(续2)xor si,si;SI保存求和的低保存求和的低16位值位值mov di,si;DI保存求和的高保存求和的高16位值位值mean1: mov ax,bx;取出一个数据取出一个数据AXcwd;符号扩展符号扩展DXadd si,ax;求和低求和低16位位adc di,dx;求和高求和高16位位inc bx;指向下一个数据指向下一个数据inc bxloop mean1;循环循环例例3.22 计算有符号数平均值(续计算有符号数平均值(续3)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 光电子材料涂覆工艺考核试卷及答案
- 生物基纤维生物降解酶解裂解技术考核试卷及答案
- 航空电源考试题库及答案
- 2025年焊工中级模拟试题及答案
- 毕向东Java课件教学课件
- 2025年焊工操作证考试题库(含答案)
- 绝缘材料粘合工艺考核试卷及答案
- 机器人液压控制系统集成工艺考核试卷及答案
- 特气系统基础知识培训课件
- 糖料种植农业生态系统构建工艺考核试卷及答案
- 郑州市第四中学新初一分班(摸底)语文模拟试题(5套带答案)
- 2-第二章-各向异性材料的应力-应变关系
- 医院防爆反恐应急预案
- 云南省安全员C证考试题库及答案
- 死亡待遇申请表
- 集中供热管网系统一次网的调节方法
- 无线充电技术在汽车上的应用
- 马工程《刑法学(下册)》教学课件 第17章 危害国家安全罪
- 11科室临床路径、单病种管理目录
- 《廉洁从业》企业文化培训课件
- 综合性文稿写作名师优质课赛课一等奖市公开课获奖课件
评论
0/150
提交评论