RISC-V 汇编指令学习 -- 基于启动文件startup.S / startup.s

本文主要是基于启动文件startup.S / startup.s对RISC-V汇编指令进行学习分析。

Note:在剑池CDK 中,启动文件startup.S 和startup.s 文件有区别

一、以 . 开头一般是伪汇编 / 操作指令,形如:

.section 伪操作来定义一个段,形如:
.section .testsection // 定义一个testsection段
汇编系统预定义了一些段名:
.text:代码段
.data:初始化数据段
.bss:未初始化数据段
.rodata:只读数据段

.global:定义一个全局符号,通常是为 ld 使用。例子如下:

.global _start
_start:      
ldr r0, =0x12 @r0=0x12

① _start 符号,汇编器在翻译汇编程序时会计算每个 数据对象 和 每条指令 的 地址,当看到这样一个符号 定义时,就把它后面一条指令的地址作为这个符号所代表的地址
② .global 是伪操作,表示_start 是一个全局标号且是一个符号(Symbol),符号在汇编程序中代表一个地址,可以用在指令中,汇编程序经过汇编器的处理之后,所有的符号都被替换成它所代表的地址值

注:" : " 前的为标号

1.1、常见的伪操作

.byte 定义单字节数据,比如 .byte 0x12。
.short 定义双字节数据,比如 .short 0x1234。
.long 定义一个 4 字节数据,比如 .long 0x12345678。
.equ 赋值语句,格式为:.equ 变量名,表达式,比如 .equ num, 0x12,表示 num=0x12。//相当于#define num 0x12
.align 数据字节对齐,比如:.align 4 表示 4 字节对齐。
.end 表示源文件结束。
.global 定义一个全局符号,格式为:.global symbol,比如:.global _start。
.if … .else … .endif 条件预编译
.abort 停止汇编
.include 指定的头文件, 可以把一个汇编常量定义放在头文件中,比如:.include “file”
__Vectors: 创建一个容器,类似于C 语言中的定义一个结构体

注:伪指令不是真正的指令,并没有与之对应的的机器码,不会被执行。伪指令所起的作用主要是对汇编过程进行控制,只用于汇编过程中为汇编程序提供汇编信息。

二、指令

csrw csr, csr1: 读rs1寄存器的值,然后写到csr 寄存器中,csr = csr1;
csrw mtvec, a0:mtvec - Machine Trap Vector 它保存发生异常 / 中断时处理器需要跳转到的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值