> For the complete documentation index, see [llms.txt](https://koshizuow.gitbook.io/compilerbook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://koshizuow.gitbook.io/compilerbook/function_local_variable/step9/load_value_from_any_address.md).

# 從任意的記憶體位址取得其值

目前為止的指令生成器只能取得堆疊頂端的記憶體位址，但是區域變數則需要能存取堆疊裡的任意位置。這節我們來說存取記憶體的方法。

CPU 不只能存取堆疊頂端，而是可以從記憶體的任意位址存取值。

從記憶體中讀取值的時候，我們使用`mov dst, [src]`。這段指令的意義為：「把`src`暫存器的值視為記憶體位址，並從中讀取值存入`dst`中。」舉例來說，假如是`mov rdi, [rax]`，就會從 RAX 內存放的記憶體位址讀取值並放在 RDI 暫存器中。

想要存入的時候，使用`mov [dst], src`。這個指令代表：「把`dst`暫存器的值視為記憶體位址，把`src`暫存器的值存入其位置。」舉例來說，`mov [rdi], rax`這段指令會把 RAX 的值放到 RDI 中存放的記憶體位址上。

`push`或`pop`會默默把 RSP 視為記憶體位址並存取，其實這些指令我們也可以用普通的記憶體位址存取指令改寫成複數行指令。也就是說，`pop rax`和：

```
mov rax, [rsp]
add rsp, 8
```

這兩條指令是一樣的，而`push rax`和：

```
sub rsp, 8
mov [rsp], rax
```

這兩條指令相同。
