摘要:
目录MCU如何使用fopen fread fwrite fclose等函数?1 读写文件改为读写数组2 文件操作函数2.1 fopen()2.2 fclose()2.3 fread()2.4 fwrite()2.5 fgetc()2.6 fgets()2.7 fputc()2.8 fputs()2. 阅读全文
摘要:
目录1 内嵌汇编示例2 内嵌汇编样式2.1 模版关键字2.2 汇编指令列表2.3 输出操作数2.4 输入操作数2.5 破坏描述部分3 内嵌汇编使用示例 内嵌汇编(Inline Assembly),允许在高级语言(c或c++)中嵌入汇编语言,从而实现汇编语言和高级语言混合编程。 我之前的一篇学习笔记讲 阅读全文
摘要:
目录1 常用的汇编器指令1.1 定义字符串变量1.2 定义整数变量1.3 定义一个函数2 其它汇编器指令2.1 条件编译与文件引用2.2 宏定义2.3 循环展开2.4 本地标签和程序跳转2 汇编源程序例子 了解了RISC-V的基础指令集以及ABI接口,我们就可以动手写汇编程序了,编写汇编程序有两种常 阅读全文
摘要:
目录1 RISC-V 寄存器使用约定2 Caller-saved 与 Callee-saved2.1 对比几种不同的寄存器保存方式2.2 为什么要分caller-saved与callee-saved?2.3 caller-saved与callee-saved寄存器的灵活使用 寄存器使用约定告诉我们函 阅读全文
摘要:
这一节讲解RISC-V中的栈帧。 1 C语言中的{}的秘密 函数执行的底层其实是操作寄存器,CPU的寄存器是有限的,为什么我们进行一系列函数调用后还能正确运行,这些函数之间是怎么协调使用寄存器的? 答案是:栈 函数之间能随意调用,还能顺利恢复现场,这个就是栈的功劳。为什么我们在代码中并没有操作栈呢? 阅读全文
摘要:
目录1 RISC-V ABI接口2 RISC-V 函数调用约定2.1 入参的传递2.2 返回值的传递 1 RISC-V ABI接口 ABI(Application Binary Interface)为应用程序二进制接口,它定义了应用程序之间或应用程序和操作系统之间进行二进制级交互时必须遵循的规则和约 阅读全文
摘要:
一起学RISC-V汇编第8讲之RISC-V寻址方式及内存访问方式 1 RISC-V的寻址方式 计算机常用的寻址方式有3种: 1.1 立即数寻址 指令中直接给出相应的操作数(立即数),比如RISC-V中的短立即数指令,因为操作码直接包含立即数中,所以立即数寻址对立即数的大小有限制,在RV32I指令集中 阅读全文
摘要:
一起学RISC-V汇编第7讲之自定义指令 为了方便用户对RISC-V进行扩展,RISC-V支持自定义指令。 自定义指令通常需要硬件与软件协同开发。 1 硬件实现 确定了自定义指令的功能后,需要设计指令编码,然后硬件逻辑实现。 1.1 确定opcode RV32指令架构中定义了4种custom指令类型 阅读全文
摘要:
一起学RISC-V汇编第6讲之伪指令 伪指令是方便程序员使用,相当于为实际指令取的别名,编程时可以直接使用伪指令。 上一章已经列出了RISC-V中的伪指令,只是比较分散,这一章以另一个视角重新整理一下伪指令,表格来源于《RISC-V 开放架构设计之道 1.0.0》 1 RISC-V伪指令列表 伪指令 阅读全文
摘要:
一起学RISC-V汇编第5讲之常用指令及伪指令列表 目录一起学RISC-V汇编第5讲之常用指令及伪指令列表1 RISC-V指令命名2 RVI指令集2.1 内存操作指令2.2 算术指令2.3 移位指令2.4 逻辑指令2.5 比较-置位指令2.6 分支指令2.7 跳转指令2.8 同步指令2.9 环境指令 阅读全文