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

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

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

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

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

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

mov rax, [rsp]
add rsp, 8

這兩條指令是一樣的,而push rax和:

sub rsp, 8
mov [rsp], rax

這兩條指令相同。

Last updated