加载/保存 指令集
最后更新于:2022-04-02 04:23:14
[TOC]
## 加载/保存(读取/写入)
* 如果要访问内存,不好意思,你只能用**load**或者**store**指令
* 其他的只能都一律是寄存器操作
```
//从内存中 复制 RAM_source 的内容到 对应的寄存器中(lw中的'w'意为'word',即该数据大小为4个字节)
lw register_destination, RAM_source
//同上, lb 意为 load byte
lb register_destination, RAM_source
//将指定寄存器中的数据 写入 到指定的内存中
sw register_source, RAM_destination
// 同上, b 为 byte
sb register_source, RAM_destination
//这里的 li 意为 load immediate
li register_destination, value
```
## 立即与间接寻址
直接给地址
```
// 将var1的内存地址复制到寄存器$t0中
la $t0, var1
```
地址是寄存器的内容(可以理解为指针)
```
// 将包含在$t0中的内存地址的字加载到$t2中
lw $t2, ($t0)
// 将寄存器$t2中的字存储到内存中$t0中包含的地址
sw $t2, ($t0)
```
偏移量
```
// 将内存地址($t0+4)的字加载到寄存器$t2中
lw $t2, 4($t0)
// 将寄存器$t2中的字存储到内存中的地址($t0 - 12)
sw $t2, -12($t0)
```
* 要用到偏移量的寻址,基本上使用最多的场景无非两种:数组,栈
实例
```
.data
array1: .space 12 # declare 12 bytes of storage to hold array of 3 integers
# 定义一个 12字节 长度的数组 array1, 容纳 3个整型
.text
__start: la $t0, array1 # load base address of array into register $t0
# 让 $t0 = 数组首地址
li $t1, 5 # $t1 = 5 ("load immediate")
sw $t1, ($t0) # first array element set to 5; indirect addressing
# 对于 数组第一个元素赋值 array[0] = $1 = 5
li $t1, 13 # $t1 = 13
sw $t1, 4($t0) # second array element set to 13
# 对于 数组第二个元素赋值 array[1] = $1 = 13
# (该数组中每个元素地址相距长度就是自身数据类型长度,即4字节, 所以对于array+4就是array[1])
li $t1, -7 # $t1 = -7
sw $t1, 8($t0) # third array element set to -7
# 同上, array+8 = (address[array[0])+4)+ 4 = address(array[1]) + 4 = address(array[2])
done
```
';