版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从C程序到RISC-V示例:判断数组中是否包含5假设整数数组x,有10个元素,i和result都是int类型变量result=0;for(i=0;i<10;i++){ if(x[i]==5){ result=1; break; }}RISC-V计算机基本类型变量寄存器数组内存的一段连续存储单元 .data .align 2 numbers: .word ...... #数组中的10个整数 # .text .align 2 .globl main main: la x5,numbers #x5,数组起始地址 addi x9,x0,0 #x9,result
addi x8,x0,0 #x8,计数器i addi x6,x0,5 #x6,整数5 addi x28,x0,10 #x28,整数10 again: bge x8,x28,exit #i<10? lw x7,0(x5) #x[i] bne x7,x6,next #x[i]==5? addi x9,x0,1 #result=1; j exit #break; next: addi x8,x8,1 #i++; addi x5,x5,4 #x5,跟踪下一个整数地址 j again exit: ...... #下一个任务假设:计数器i:寄存器x8;result:寄存器x9数组:存储单元0x10000000~0x10000027高级语言的一条语句可以表示为ISA上的几条指令if(x[i]==5) ...... main: la x5,numbers #x5,数组起始地址 ...... addi x6,x0,5 #x6,整数5 ...... lw x7,0(x5) #x[i] bne x7,x6,next #x[i]==5? ......如果对数组中的元素进行运算,必须先将其加载到寄存器中RISC-V计算机的整数运算指令,只能对寄存器和立即数进行运算 ...... main: la x5,numbers #x5,数组起始地址 ......
lw x7,0(x5)
#x[i] ...... addi x5,x5,4 #x5,跟踪下一个整数地址for语句、if语句和break语句,都是通过条件分支和无条件跳转实现的again: bge x8,x28,exit
#for(i=0;i<10;i++) ......
bne x7,x6,next
#if(x[i]==5) ......
j exit #break; ......
j again
#for(i=0;i<10;i++)示例:找一个整数的位组合中的第一个“1”假设整数是xresult=31;if(x==0){ result=-1;}else{ while(x>=0){ x=x<<1; result--; }}假设x被分配给寄存器x8,result被分配给寄存器x9while语句和if-else语句,通过条件分支和无条件跳转实现 addi x9,x0,31 #x9,result
beqz x8,zeroL
#if(x==0) again: bltz x8,exit
#while(x>=0) slli x8,x8,1 #x=x<<1; addi x9,x9,-1 #result--;
j again
zeroL:
addi x9,x0,-1 #result=-1; exit: ...... #下一个任务switch语句的底层实现switch语句,是否和级联的if-else语句等价?intresult=0;switch(x){case1: result+=1; break;case2: result+=2;case3: result+=3; break;case4:case5: result+=5; break;default: result=0;}假设x和result分别被分配给寄存器x8和x901 .data02 .align 203 Addr: .word Default,L1,L2,L3,L4,L5 #6个起始地址04 #05 .text06 .align 207 .globl main08 main: ...... #省略代码09 addi x9,x0,0 #result=0;0A addi x5,x0,60B bge x8,x5,Default #x>50C blt x8,x0,Default #x<00D la x5,Addr0E slli x6,x8,2 #x*40F add x5,x5,x6 10 lw x5,0(x5) #起始地址11 jr x512 L1: addi x9,x9,1 #result+=1;13 j exit #break;14 L2: addi x9,x9,2 #result+=2;15 L3: addi x9,x9,3 #result+=3;16 j exit #break;17 L4:18 L5: addi x9,x9,5 #result+=5;19 j exit #break;1A Default: addi x9,x0,0 #result=0;1B exit: ......对于switch语句,并不需要进行多次条件判断首先,将每个case和default的起始地址,存储到数据区(03行)如果x的值大于5或小于0,直接跳转到Default执行(0A到0C行)Addr: .word Default,L1,L2,L3,L4,L5
#6个起始地址addi x5,x0,6bge x8,x5,Default
#x>5,即x>=6blt x8,x0,Default
#x<0否则,就通过switch表达式的值,在数据区查找到相应的起始地址(0D到10行)然后,跳转到这个地址执行(11行) la x5,Addr slli x6,x8,2
#x*4 add x5,x5,x6 lw x5,0(x5) #起始地址 jr x5问题1、为什么switch表达式的值必须是整型,并且case后的值必须是常量?因为编译器无法通过变量或非整型数实现以上过程问题2、break语句的含义跳出switch语句如果省略break语句,则直接进入下一个case执行,为什么?省略无条件跳转指令(例:13、16和19行的伪指令jexit),则直接执行下一条指令12 L1: addi x9,x9,1 #result+=1;13 j exit
#break;14 L2: addi x9,x9,2 #resul
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城中村防洪排涝工程设计
- 2026年电子档案管理试题及答案
- 施工现场光污染控制方案
- 人防设施安全标识设置方案
- 消毒供应室卫生管理制度
- 企业职能部门协同方案
- (新)2025年药品洁净区管理规范试题题库及答案
- 永嘉房屋审批制度
- 汽车金融审批制度
- 消防验收与审批制度
- 眼镜定配技术说课
- 55m集散两用船船体结构规范设计
- 电厂集控全能运行值班员应知应会(终结版)
- 团队沙漠求生游戏
- 山西省建设工程计价依据
- 车辆伤害应急预案演练记录(简单)
- GB/T 26610.2-2022承压设备系统基于风险的检验实施导则第2部分:基于风险的检验策略
- JJG 141-2000工作用贵金属热电偶
- 小学音乐四分音符-八分音符-课件-(2)ppt
- GB/T 13234-2018用能单位节能量计算方法
- 护理三基三严测试题库含答案
评论
0/150
提交评论