先加點限制:
變數為區域性變數,即函式內部的"auto"變數
地址2001不正常,對於普通32位系統,地址應32位對齊,此處改為2004
假設CPU為32位ARM
下面是稍加限制後的程式碼:
少數變數儲存在暫存器中;過多的變數儲存在堆疊頂部。
在彙編指令中用堆疊指標+偏移量即可訪問。
下面假設a儲存在暫存器R1。
常量5很小,不需儲存到資料段中。
a=5對應如下:
一條指令即可裝入。
我們假設常量不是5,而是0xdeadbeef這樣的大數,那就應儲存在資料段中,即:
data+2004 (data + 0x7d4)
偏移量2004將被編譯到程式碼中,由於此偏移量較大,需使用兩條指令將偏移量為2004的地址裝入暫存器R2,如下:
如果偏移量較小(204),則可以這樣:
先加點限制:
變數為區域性變數,即函式內部的"auto"變數
地址2001不正常,對於普通32位系統,地址應32位對齊,此處改為2004
假設CPU為32位ARM
下面是稍加限制後的程式碼:
void test(){ int a; a=5; ......}變數a的儲存少數變數儲存在暫存器中;過多的變數儲存在堆疊頂部。
在彙編指令中用堆疊指標+偏移量即可訪問。
下面假設a儲存在暫存器R1。
常量5的儲存常量5很小,不需儲存到資料段中。
a=5對應如下:
LDR R1, #5一條指令即可裝入。
我們假設常量不是5,而是0xdeadbeef這樣的大數,那就應儲存在資料段中,即:
data+2004 (data + 0x7d4)
地址偏移量2004如何獲得偏移量2004將被編譯到程式碼中,由於此偏移量較大,需使用兩條指令將偏移量為2004的地址裝入暫存器R2,如下:
ADD R2, Rdata, #2000LDR R1, [R2,#4]如果偏移量較小(204),則可以這樣:
LDR R1, [Rx,#204]