6.1 子例程机制电子课件_第1页
6.1 子例程机制电子课件_第2页
6.1 子例程机制电子课件_第3页
6.1 子例程机制电子课件_第4页
6.1 子例程机制电子课件_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

子例程子程序现代程序设计语言的灵魂提供了抽象的能力将一个组件的功能与其实现的细节分隔开来程序员只需理解组件的结构,不需要考虑其实现的细节,就能够把该组件作为一个程序块使用子程序使程序员能够以模块化的方式写程序,提高了构建复杂系统的能力子例程在一个程序中,多次执行某个程序片段在程序内,不必每次给出这个程序片段通过多次调用该程序片段实现子例程(Subroutine)/函数(Function,C语言)子例程机制调用/返回机制程序片段A示例程序片段A:做乘法运算的指令序列x9=x10*x11 andi x9,x9,0 #x9,积 loop: ...... #省略x9=x10*x11的实现细节 j loop exit: ...... #下一个任务调用/返回机制调用机制计算子例程的起始地址,加载到PC,并保存返回地址返回机制将返回地址加载到PC中JAL和JALR指令使用无条件跳转指令,实现了调用/返回机制JAL:JumpandLink“PC-相对”寻址模式,计算子例程的起始地址JALR:JumpandLinkRegister“基址+偏移量”寻址模式,计算子例程的起始地址通常设置目标寄存器为x1,保存返回地址/链接JALPC

PC+SEXT(imm[20:0])x1PC+4地址311211760x0040000000000000110000000000000011101111

imm[20|10:1|11|19:12]x1jalJAL指令汇编格式JAL x1,LABELLABEL,标识JAL指令的目标例如,jalx1,Multiply下一条被执行的指令被Multiply标识的指令并且,在x1中保存返回地址Multiply子例程Multiply: andi x9,x9,0 #x9,积loop: ...... #省略x9=x10*x11的实现细节 j loopexit: jalr x0,0(x1)

#返回使用jalrx0,0(x1)结束子例程JALRPC

(rs1)+SEXT(imm[11:0])x1

PC+4jalr指令的汇编指令格式为jalr x1,imm12(rs1)或jalr x1,rs1,imm12地址31201915141211760x0040000011111111110000101000000011100111

imm[11:0]x5jalrx1I-类型跳转问题:什么是JALR指令能够提供的而JAL指令无法提供的重要特点?jal指令计算出的地址被限制于内存的一定范围之内偏移范围为-220到220-1jalr指令对于下一条被执行的指令位于何处没有限制伪指令call使用JALR指令,调用子例程:如何计算子例程的起始地址,将其赋值给rs1?对于汇编程序员来说,可以使用伪指令,简化编程工作callLabel汇编器将其翻译为jalr指令callLabel汇编器按照内存分配的规则1、计算出标记相对于PC的偏移量offset(32位)2、将32位的offset拆分成高20位和低12位3、将伪指令call翻译为:auipc rd,offsetHi

#offsetHi是offset的高20位jalr x1,offsetLo(rd) #offsetLo是offset的低12位子例程相关的伪指令伪指令基本指令含义callLabelauipc rd,offsetHijalr x1,offsetLo(rd)调用子例程retjalrx0,0(x1)从子例程返回(Return,ret)示例:乘法运算计算两个二进制补码整数的乘法,采用与十进制乘法相同的算法以3

(-2)为例,采用4位二进制补码表示

0011(3)×

1110(-2)

0000

(0)011

(00)11

+(001)1

1010(-6)从右向左依次计算,将被乘数与0或1相乘,结果是0或保持不变Multiply子例程02行:如果乘数为0,计算任务结束03行和04行:判断乘数最右边一位是否为1如果是1,05行指令将被乘数加到积上06行:乘数逻辑右移1位07行:被乘数左移1位01 Multiply: andi x9,x9,0 #x9,积02 Mloop: beqz x11,Mexit #x11,乘数03 andi x8,x11,104 beqz x8,Mnext05 add x9,x9,x10 #x10,被乘数06 Mnext: srli x11,x11,107 slli x10,x10,108 j Mloop09 Mexit: ret #jalrx0,0(x1)问题:调用Multiply子例程的程序,如果使用寄存器x8存储了一个数值x在执行callMultiply指令返回后,再次使用x8做运算,会发生什么情况?x8:在子例程中已被改为0或101 addi x10,x0,3 #x10

3,被乘数02 addi x11,x0,-2 #x11

-2,乘数03 call Multiply04 ...... #使用x8做计算05 ...... #下一个任务callee-save(被调用者保存)在子例程中完成寄存器的保存/恢复工作03行:使用数据区的4个存储单元作为保存寄存器的空间01 .data02 .align 203 SaveReg1: .word 0

#保存寄存器的空间04#05 .text06 .align 207 #省略代码,x8

x 08 addi x10,x0,3 #x10

3,被乘数09 addi x11,x0,-2 #x11

-2,乘数0A call Multiply0B ...... #使用x8做计算0C ...... #下一个任务0E和0F行:将x8的值x保存到预留的空间中18行:将x8的值恢复0D #

0E Multiply: la x5,SaveReg10F sw x8,0(x5)

#callee-save10 andi x9,x9,0 #x9,积11 Mloop: beqz x11,Mexit #x11,乘数12 andi x8,x11,113 beqz x8,Mnext14 add x9,x9,x10 #x10,被乘数15 Mnext: srli x11,x11,116 slli x10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论