汇编语言概念介绍

  • 一种低级语言,只是把机器语言改造了一下。抽象层次低。抽象层次高意味着更接近人的思维。汇编语言与机器思维类似
  • 缺点:难读,难写,难移植
    • 难写:高级语言对应的一条需要写很多条
    • 难移植:汇编语言与机器码一一对应
  • 优点:灵活,强大
    • 灵活:优化过程 编译器来完成当翻译高级语言时;运用机器的特性。绕开编译器去优化。高级语言用c语言编写库
    • 强大:底层对硬件控制,做更深入的优化
  • 应用:
    • 需要直接访问底层硬件的地方
    • 需要对性能执行极致优化

汇编语言语法介绍

  • gnu汇编器
  • 大写S:包含预处理的东西小写s:纯粹的汇编指令
  • .s文件有多条语句组成statement
    • 每一条语句由三部分组成 [label:][operation][comment]方括号表示可选,全为方括号可选 。注释
  • label:给指令加了一个地址,通过地址引用
  • operation可以有多种类型:
    • 指令
    • 伪指令:非原生,为了提高写代码的效率;起了一个别名,多条指令集合。指令组合的别名。
    • directive:指示/伪操作。以小点开头。汇编器的东西 .text告诉汇编器放到text的一个section中
    • 宏:macro
  • 注释

risc-v汇编指令操作对象:寄存器与内存

寄存器:32个通用寄存器x0~x31

  • hart 处理器最小单元,在执行算术逻辑运算时所操作的数据必须直接来自寄存器* 内存:
  • 读写操作使用字节为基本单位
  • rv32最多可访问2^32个字节内存空间

汇编指令编码格式

  • 指令长度:4字节
  • 指令对齐:加载到内存的地址,4的倍数
  • 32个bit划分为不同的域field
  • func3/7和opcode一起决定最终的指令类型
  • 最低两位都为11
  • rs1 rs2 rd5位 32个寄存器
  • 指令在内存中按照小端序排列

逻辑运算指令

  • 与或非操作。二进制底层操作。
  • 没有直接提供非的操作,但提供了xor.
  • 非的操作通过异或来实现。和-1进行异或操作。

移位运算指令

逻辑移位

  • 补的是0sll( shift left logical)

算术移位

  • 只有算术右移;按照符号位补足*

内存读写指令load and store

  • lb(u),lh(u)符号扩展,zero扩展;一个字节,两个字节;lw;
  • sb,sh,sw;

条件分支指令

  • b type
  • 立即数不是放在一起的,分布在两块地方,非连续
  • 跳转的目标地址的计算方法:立即数*2,考虑压缩指令?指令最小对齐方式。两个字节。?符号扩展后和pc值相加,-4096的由来
  • imm没有0位
  • 具体编程时用标号代替,标号label地址,由编译器来决定Imm
  • 变量看成是寄存器;
int i =0
while(i<5)i++;
  • while 循环条件判断;li 构成大数麻烦
  • 这段代码两个寄存器
li x5,0
li x6,5
loop:
addi x5,x5,
bne x5,x6,loop

无条件跳转指令

jal 函数调用的地方

jalr 将目标地址放到寄存器中

  • auipc扩展大数
  • x0不返回地址的跳转