RISC-V汇编总结

一、risc-v汇编格式

GNU汇编语法中定义的伪操作、操作符、标签等语法规则均可以在RISC-V汇编语言中使用。一个完整的RISC-V汇编程序由RISC-V指令和GNU汇编规则定义的伪操作、操作符、标签等组成。

典型的RISC-V汇编语句由4部分组成,包含如下字段:

【label:】 opcode 【operands】 【;comment】

【标签:】 操作码 【操作数】 【;注释】

  • 标签:表示当前指令的位置标记,请参见第1.5.1节了解具体使用实例 。
  • 操作码:操作码可以是如下任意一种:
  1. RISC-V指令的指令名称,如addi指令、lw指令等。
  2. 汇编语言的伪操作。
  3. 用户自定义的宏。
  • 操作数:操作数是操作码所需的参数,与操作码之间以空格分开;可以是符号、常量、或者由符号和常量组成的表达式。
  • 注释:注释即为了使的程序代码便于理解而添加的信息,注释并不发挥实际功能,仅仅起到注解作用。注释是可选的,如果添加注释,需要以“;”或者“#”作为分隔号,以分隔号开始的本行之后部分到本行结束都会被当做注释。或者使用类似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地址处开始分配若干个半字

相关推荐

  1. RISC-V汇编总结

    2024-06-16 14:52:04       10 阅读
  2. RISC-V和ARM

    2024-06-16 14:52:04       35 阅读
  3. RISC-V 指令学习

    2024-06-16 14:52:04       12 阅读
  4. risc-v】arm和riscv有什么关系或者联系?

    2024-06-16 14:52:04       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 14:52:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 14:52:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 14:52:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 14:52:04       20 阅读

热门阅读

  1. 【LVGL v8.3】修改 ARC 控件指针图片风格

    2024-06-16 14:52:04       8 阅读
  2. 【机器学习】基于NeRF的3D动画渲染

    2024-06-16 14:52:04       6 阅读
  3. C#面:C#支持多重继承么?

    2024-06-16 14:52:04       5 阅读
  4. 简单游戏制作——飞行棋

    2024-06-16 14:52:04       8 阅读
  5. FPGA NET

    FPGA NET

    2024-06-16 14:52:04      8 阅读
  6. mac m芯片安装win11遇坑

    2024-06-16 14:52:04       7 阅读
  7. Spring Cloud应用框架

    2024-06-16 14:52:04       8 阅读