RISC-V汇编总结
- 一、risc-v汇编格式
- 二、risc-v常用汇编伪指令
- 三、risc-v汇编编程示例
- 四、GCC内联汇编
一、risc-v汇编格式
GNU汇编语法中定义的伪操作、操作符、标签等语法规则均可以在RISC-V汇编语言中使用。一个完整的RISC-V汇编程序由RISC-V指令和GNU汇编规则定义的伪操作、操作符、标签等组成。
典型的RISC-V汇编语句由4部分组成,包含如下字段:
【label:】 opcode 【operands】 【;comment】
【标签:】 操作码 【操作数】 【;注释】
- 标签:表示当前指令的位置标记,请参见第1.5.1节了解具体使用实例 。
- 操作码:操作码可以是如下任意一种:
- RISC-V指令的指令名称,如addi指令、lw指令等。
- 汇编语言的伪操作。
- 用户自定义的宏。
- 操作数:操作数是操作码所需的参数,与操作码之间以空格分开;可以是符号、常量、或者由符号和常量组成的表达式。
- 注释:注释即为了使的程序代码便于理解而添加的信息,注释并不发挥实际功能,仅仅起到注解作用。注释是可选的,如果添加注释,需要以“;”或者“#”作为分隔号,以分隔号开始的本行之后部分到本行结束都会被当做注释。或者使用类似C语言的注释语法//和/* */对单行或者大段程序进行注释。
二、risc-v常用汇编伪指令
在汇编语言中,有一些特殊的操作助记符,这些操作的助记符通常被称为伪操作(Pseudo Ops),伪操作在汇编程序中的作用是指导汇编器处理汇编程序的行为,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就此结束。
以GCC工具链为例,一般的GNU汇编语法中定义的伪操作均可在RISC-V汇编语言中使用。经过不断的增加,目前GNU汇编中定义的伪操作数目众多,本节将仅简介若干常见的伪操作。
- .file filename
.file伪操作用指示汇编器该汇编程序的逻辑文件名。
- .global symbol_name或者.globl symbol_name
.global和.globl伪操作用于定义一个全局的符号,使得链接器能够全局识别它,即一个程序文件中定义的符号能够被所有其他程序文件可见。
- .local symbol_name
.local伪操作用于定义局部符号,使得此符号不能够被其他程序文件可见。
- .weak symbol_name
在汇编程序中,符号的默认属性为强(strong),.weak伪操作则用于设置符号的属性为弱(weak),如果此符号之前没有定义过,则同时创建此符号并定义其属性为weak。
如果符号的属性为weak,那么它无需定义具体的内容。在链接的过程中,另外一个属性为strong的同名符号可以将此weak符号的内容强制覆盖。利用此特性,.weak伪操作常用于预先预留一个空符号,使得其能够通过汇编器语法检查,但是在后续的程序中定义符号的真正实体,并且在链接阶段将空符号覆盖并链接。
- .type name , type description
.type伪操作用于定义符号的类型。譬如“.type symbol,@function”即将名为symbol的符号定义为一个函数(function)。
- .align integer
.align伪操作用于将当前PC地址推进到“2的integer次方个字节”对齐的位置。譬如“.align 3”即表示将当前PC地址推进到8个字节对齐的位置处。
- .balign integer
.balign伪操作用于将当前PC地址推进到“integer个字节”对齐的位置。
- .zero integer
.zero伪操作将从当前PC地址处开始分配integer个字节空间并且用0值填充。譬如“.zero 3”即表示分配三个字节的0值。
- .byte expression [, expression]*
.byte伪操作将从当前PC地址处开始分配若干个字节(byte)的空间,每个字节填充的值由分号分隔开的expression指定。
- .2byte expression [, expression]*
.2byte伪操作将从当前PC地址处开始分配若干个双字节(2 bytes)的空间,每个双字节填充的值由分号分隔开的expression指定。空间分配的地址可以与双字节非对齐。
- .4byte expression [, expression]*
.4byte伪操作将从当前PC地址处开始分配若干个四字节(4 bytes)的空间,每个四字节填充的值由分号分隔开的expression指定。空间分配的地址可以与四字节非对齐。
- .8byte expression [, expression]*
.8byte伪操作将从当前PC地址处开始分配若干个八字节(8 bytes)的空间,每个八字节填充的值由分号分隔开的expression指定。空间分配的地址可以与八字节非对齐。
- .half expression [, expression]*
.half伪操作将从当前PC地址处开始分配若干个半字