RISC-V ISA手册

本手册分为两卷，上卷讲用户级指令，下卷讲特权级指令。

### 一些待解决的问题

1. riscv里的ecall指令与x86里的int指令的异同。

   ecall是用来触发异常的，而int是用来触发中断的，感觉它们用的地方也很相似，那么它们之间有什么异同呢？

2. 为什么即有LW指令也有LWU指令，而只有SW指令没有SWU指令呢？

   如果无符号数的宽度小于寄存器的宽度，执行普通的LW指令就会有问题，因为它会进行符号扩展，这就需要LWU指令把高位全都填充为0。而把数保存到寄存器中就不存在这样的问题，因为数的大小和占用的内存大小是完全一致的。

3. 为什么有算术右移而没有算术左移呢？



### 寄存器

#### 通用寄存器

#### 控制和状态寄存器CSR

##### medeleg

如果不设置这个寄存器，所有的异常都会放在M模式来处理。如果设置了这个寄存器，则当较低特权级(S,U)的异常产生时，授权给S模式来处理(M特权级的异常依然在M模式下处理)。medeleg寄存器里的每一位对应一个异常，位的索引和异常的值是相等的，例如8位对应着8号异常(U模式的环境调用)。

##### mideleg

### 指令

#### ecall

```assembly
ecall	# 触发当前特权级下的一个环境调用
```

环境调用属于一种异常，所以它在哪处理取决于medeleg寄存器里相应的位是否被设置。对于Unix类的操作系统来说，会设置U模式的异常在S特权级处理。