已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十四章子例程,子例程,通常,在一个程序中会多次执行某个程序片段,在程序内可以不必在每次需要时均说明其源程序段的全部细节,而是通过多次调用该程序片段来实现这样的程序片段被称为子例程,在C中被称为函数,子例程,益处还在于:可以由不同的程序员分别实现需要程序片段的程序和程序片段也可能由厂商或某个独立的软件供应商提供通常,提供的程序片段的集合被称作库例如数学库,包括执行诸如平方根、正弦、余切等函数的片段实现子例程的机制被称为调用/返回机制,示例,IN服务例程起始于符号地址L1、L2、L4和L5的4个6条指令的序列,都做了如下工作:lwr5,DSR(r0)LABEL:lwr3,0(r5);测试输出寄存器是否就绪andir3,r3,#1beqzr3,LABEL;循环直到显示器就绪lwr5,DDR(r0)sw0(r5),Rx调用/返回机制允许把这个6条指令的序列作为一个子例程,在程序中只需包括该子例程一次,就可以多次执行这个指令序列,调用/返回机制,调用机制计算子例程的起始地址,加载到PC,保存返回地址,以便返回调用程序的下一条指令返回机制使用返回地址加载PC,(b)使用子例程,调用/返回机制,与TRAP指令相似二者都是将PC加载为程序片段的起始地址,同时R31被加载为需要返回到调用程序的地址程序片段的最后一条指令,都是JRR31指令,和服务例程的区别,TRAP指令服务例程包括操作系统资源,需要访问计算机的底层硬件的特权;由管理计算机资源的系统程序员编写子例程由写包含了调用指令的程序的相同程序员所写,或由某个同事所写,或者是某个库的一部分,JAL和JALR指令,两个调用子例程的指令分别使用2种方法,计算子例程的起始地址PC+4+偏移量寄存器这两条指令做两件事:在R31中保存返回地址返回地址是增加了4的PC计算子例程的起始地址并加载到PC,JAL,通过将指令的26位的偏移量(25:0位)做符号扩展,并与增加了4的PC相加,计算出子例程的目标地址计算方法与J指令相同不同的是JAL指令在R31中保存了返回地址,JALR指令,由指令的25:21位说明的寄存器中的内容,得到子例程的目标地址方法与JR指令相同不同的是JALR指令在R31中保存了返回地址,改进IN服务例程,子例程WriteChar注意:寄存器的保存与恢复WriteChar:swSaveR3(r0),r3swSaveR5(r0),r5lwr5,DSR(r0)L1:lwr3,0(r5)andir3,r3,#1beqzr3,L1lwr5,DDR(r0)sw0(r5),r2lwr3,SaveR3(r0)lwr5,SaveR5(r0)jrr31,子例程ReadChar,ReadChar:swSaveR3(r0),r3swSaveR5(r0),r5lwr5,KBSR(r0)L3:lwr3,0(r5)andir3,r3,#1beqzr3,L3;轮询直到一个字符被键入lwr5,KBDR(r0)lwr4,0(r5);将输入的字符加载到R4lwr3,SaveR3(r0)lwr5,SaveR5(r0)jrr31;结束子例程,寄存器的保存,.datax00003000SaveR1.space4;保存寄存器的存储单元SaveR2.space4SaveR3.space4SaveR5.space4SaveR31.space4Newline.bytex0A;新行的ASCII码.textx00003100swSaveR1(r0),r1;保存此程序需要的寄存器swSaveR2(r0),r2swSaveR31(r0),r31,jalWriteChar,;输出新行lbr2,Newline(r0)jalWriteChar;输出提示符addir1,r0,Prompt;提示符字符串的起始地址LOOP:lbr2,0(r1);输出提示符beqzr2,Input;提示符字符串结束jalWriteCharaddir1,r1,#1;提示符的指针加1jLOOP;获取下一个提示符字符,jalReadChar,;Input:jalReadChar;把字符送给R2准备回显到显示器addir2,r4,#0,jalWriteChar,jalWriteChar;lbr2,Newline(r0)jalWriteChar,寄存器恢复,lwr1,SaveR1(r0);将寄存器恢复为原先的值lwr2,SaveR2(r0)lwr31,SaveR31(r0)jrr31;从TRAP返回,示例:两个多位整数加法,要点:两个多位整数是通过键盘输入的,且结果需要显示到显示器上,两个一位整数的加法,trapx09;从键盘输入addir1,r4,#0;为下一次输入预留空间trapx09;输入另一个字符addr1,r1,r4;将两次输入相加trapx07;在显示器上显示结果trapx00;停机假设从键盘输入的第一个数字是2,第二个是3。当程序终止前,在显示器上将会显示什么?答案是:e,数据类型转换,数据类型无符号整数二进制补码整数浮点数与输入输出设备交互的ASCII码高级语言混合类型表达式A=R+I,其中R(浮点数)和I(二进制补码整数)把数值I从它的原始数据类型(二进制补码整数)转换为该运算所需的数据类型(浮点数),ASCII码到二进制,一个ASCII码字符序列被存储在从ASCIIBUFF开始的连续的DLX存储单元中R1包含这个数的位数,3位数,数据区,.dataASCIIBUFF:.space4LookUp10:.word0,10,20,30,40,50,60,70,80,90LookUp100:.word0,100,200,300,400,500,600,700,800,900SaveR1:.space4SaveR2:.space4SaveR3:.space4SaveR4:.space4SaveR5:.space4,保存寄存器,;将一个三位的十进制数的ASCII码字符串转换成二进制数。;R2用来存储结果。;R1记录还有多少位数未被处理。;ASCIIBUFF中存储的是这个ASCII码字符串中的最高位。;ASCIItoBinary:swSaveR1(r0),r1;保存寄存器swSaveR3(r0),r3swSaveR4(r0),r4swSaveR5(r0),r5addir2,r0,#0;R2用于存储结果beqzr1,DoneAtoB;没有位数需要处理,个位,;addir4,r0,ASCIIBUFFaddr4,r4,r1subir4,r4,#1;R4指向个位;lbr3,0(r4);R3个位subir3,r3,x30;减去ASCII码模板addr2,r2,r3;加上个位数的贡献;subir1,r1,#1beqzr1,DoneAtoB;原数字只有一位,十位,subir4,r4,#1;R4现在指向十位;lbr3,0(r4);R3十位subir3,r3,x30;减去ASCII码模板addir5,r0,LookUp10;LookUp10是十位数的基数sllir3,r3,#2;R3R3*4addr5,r5,r3;R5指向真正的十位数的值lwr3,0(r5)addr2,r2,r3;将十位数的贡献加入总和;subir1,r1,#1beqzr1,DoneAtoB;原数只有两位,百位,subir4,r4,#1;R4现在指向百位;lbr3,0(r4);R3百位subir3,r3,x30;减去ASCII码模板addir5,r0,LookUp100;LookUp100是百位数的基数sllir3,r3,#2;R3R3*4addr5,r5,r3;R5指向真正的百位数的值lwr3,0(r5)addr2,r2,r3;将百位数的贡献加入总和,恢复寄存器,;DoneAtoB:lwr1,SaveR1(r0);恢复寄存器lwr3,SaveR3(r0)lwr4,SaveR4(r0)lwr5,SaveR5(r0)ret;JRR31,二进制到ASCII码,;这个算法将一个有符号的范围在0到+999之间;的二进制补码整数转换为一个包括符号位和;后面的三个十进制数位组成的ASCII码字符串。;R2里包含的是最初要转换的数。;BinarytoASCII:swSaveR1(r0),r1;保存寄存器swSaveR2(r0),r2swSaveR3(r0),r3swSaveR4(r0),r4addir4,r0,ASCIIBUFF;R4指向即将生成的字符串,百位数,;判断百位数Begin100:addir1,r0,x30;为百位数准备Loop100:sltir3,r2,#100bnezr3,End100addir1,r1,#1subir2,r2,#100jLoop100;End100:sb0(r4),r1;存储百位数的ASCII码,十位数,;判断十位数Begin10:addir1,r0,x30;为十位数准备Loop10:sltir3,r2,#10bnezr3,End10addir1,r1,#1subir2,r2,#10jLoop10;End10:sb1(r4),r1;存储十位数的ASCII码,个位数,Begin1:addir1,r2,x30;个位数sb2(r4),r1lwr1,SaveR1(r0);恢复寄存器lwr2,SaveR2(r0)lwr3,SaveR3(r0)lwr4,SaveR4(r0)ret,main,;取得用户输入的两个十进制数的ASCII码序列,;通过调用ASCIItoBinary子例程,将其转换为两个二进制数值,;执行加法运算,;将结果调用BinarytoASCII子例程,转换为ASCII码序列,并显示在显示器上。;.dataPromptMsg1:.asciizEnterthefirstnumber:PromptMsg2:.asciizEnterthesecondnumber:TooManyDigits:.asciizToomanydigits.;.align2,输出提示,.text.globalmainmain:addir3,r0,#2;输入两个整数addir4,r0,x0Atrapx07;OUTaddir4,r0,PromptMsg1trapx08;PUTS,输入一个整数,PushValue:trapx06;GETCtrapx07;OUTaddir1,r0,ASCIIBUFF;R1指向生成的字符串addir2,r0,#3;最多为3位数;ValueLoop:seqir5,r4,x0A;测试是否输入回车bnezr5,GoodInputbeqzr2,TooLargeInputsubir2,r2,#1;仍然有空间输入更多位数sb0(r1),r4;存储最近读入的字符addir1,r1,#1trapx06;GETCtrapx07;OUT,回显jValueLoop,jalASCIItoBinary,GoodInput:subir1,r1,ASCIIBUFF;R1现在包含字符的个数jalASCIItoBinarysubir3,r3,#1;完成一个数的转换seqir5,r3,#0bnezr5,AddOpaddir6,r2,#0;R6保存第一个整数;addir4,r0,x0Atrapx07;OUTaddir4,r0,PromptMsg2trapx08;PUTSjPushValue,TooLargeInput,TooLargeInput:trapx06;GETC,循环,直到输入回车trapx07;OUTseqir3,r4,x0Abeqzr3,TooLargeInputaddir4,r0,x0Atrapx07;OUTaddir4,r0,TooManyDigitstrapx08;PUTSjExit,jalBinarytoASCII,AddOp:addr2,r2,r6;加法运算jalBinarytoASCIIaddir1,r0,ASCIIBUFFlbr4,0(r1)trapx07;OUTlbr4,1(r1)trapx07;OUTlbr4,2(r1)trapx07;OUTlbr4,3(r1)trapx07;OUTExit:trapx00;HALT,传给子例程的值和返回值,传给子例程的值OUT服务例程(R4)、PUTS服务例程(R4)ASCIItoBinary(R1)、BinarytoASCII(R2)返回值(ReturnValues)从子例程传出的值GETC服务例程(R4)ASCIItoBinary(R2),使用子例程,必须知道地址(或标记)功能不需要知道如何实现传给子例程的值返回值,寄存器的保存和恢复,通常使用被调用者保存(callee-save)策略,返回值除外注意:R31的保存,库例程,用户程序能够调用通常作为计算机系统一部分的库子例程用户程序员不需要了解其内部细节也可以使用它们例如,计算平方根(简写为SQRT),计算直角三角形斜边长,01.data02Side1:.space403Side2:.space404Hypot:.space405.text06lwr1,Side1(r0)07jalSQUARE08addir2,r1,#009lwr1,Side2(r0)0AjalSQUARE0Baddr1,r1,r2,jalSQRT,0CjalSQRT0DswHypot(r0),r10EJNEXT_TASK0F10SQUARE:addir3,r1,#011addir4,r1,#012AGAIN:subir3,r3,#113beqzr3,DONE14addr1,r1,r415jAGAIN16DONE:jrr3117;18SQRT:.;R1SQRT(R1).;如何写这个子例程?19jrr31,数学库,数学库提供了许多子例程(包括SQRT)用户程序员需要知道的是实现平方根功能的库例程的目标地址,在哪里输入数值x,在哪里可以得到结果可以非常方便的从数学库附带的文档中获得,SQRT,如果库程序起始于地址SQRT,提供给库程序的数值x在R1中,库程序的结果也在R1中01.data02Side1:.space403Side2:.space404Hypot:.space405.text06.externSQRT,jalSQRT,07lwr1,Side1(r0)08jalSQUARE09addir2,r1,#00Alwr1,Side2(r0)0BjalSQUARE0Caddr1,r1,r20DjalSQRT0EswHypot(r0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 邢台2025年河北邢台宁晋县事业单位招聘教师350人笔试历年参考题库附带答案详解
- 职业健康与心理健康的协同管理框架
- 福建2025年福建三明医学科技职业学院招聘19人笔试历年参考题库附带答案详解
- 湘潭2025年湖南湘潭市医疗器械审评核查中心招聘笔试历年参考题库附带答案详解
- 河北2025年河北公安警察职业学院选聘11人笔试历年参考题库附带答案详解
- 成都2025年四川成都市温江区“三员合一”全职党建指导员招聘12人笔试历年参考题库附带答案详解
- 广元2025年四川广元苍溪县机关事业单位考调66人笔试历年参考题库附带答案详解
- 宣城2025年安徽宣城市教学研究室选聘教研员笔试历年参考题库附带答案详解
- 天津2025年天津市和平区事业单位面向会宁籍未就业高校毕业生招聘笔试历年参考题库附带答案详解
- 合肥2025年安徽合肥长丰县水湖镇招聘村(社区)后备干部12人笔试历年参考题库附带答案详解
- 传统米醋制作工艺流程介绍
- 2025年住院医师规范化培训考试(肾脏内科)历年参考题库含答案详解(5卷)
- 血液小学生课件
- 森林消防安全知识课件
- T-CRHA 089-2024 成人床旁心电监测护理规程
- 燃气管道缺陷修复技术-深度研究
- 刑事诉讼法学全套课件
- DBJ51-T 040-2021 四川省工程建设项目招标代理操作规程
- 青鸟消防JBF62E-T1型测温式电气火灾监控探测器使用说明书
- 武汉市江岸区2022-2023学年七年级上学期期末地理试题【带答案】
- 自动驾驶系统关键技术
评论
0/150
提交评论