Opcode
乙太坊操作碼:前幾條指令的含義?
查看操作碼級別,任何智能合約的前幾條指令都是這樣開始的:
push1 80 push1 40 mstore
我知道這會將 0x80 保存到地址 0x40,但這一切是為了什麼?我查看了乙太坊黃皮書,但它從未在任何地方提及這一點。
謝謝。
solidity 文件說明了以下內容:
“Solidity 以一種非常簡單的方式管理記憶體:在記憶體中的 0x40 位置有一個“空閒記憶體指針”。如果要分配記憶體,只需從該點開始使用記憶體並相應地更新指針。”
參考:https ://solidity.readthedocs.io/en/v0.4.21/assembly.html
編輯
文件中的範例:
mstore(0x40, 0x60) // store the "free memory pointer" // ... // memory allocator function $allocate(size) -> pos { pos := mload(0x40) mstore(0x40, add(pos, size)) }
首先,它使用 mstore(adr, value) 將地址 0x60 儲存為目前記憶體指針,儲存 32 個字節。然後它創建一個函式,allocate(size)。函式 allocate(size) 以下列方式執行:給定參數大小,函式呼叫者可以指定程序需要多少記憶體。然後該函式在地址 0x40(在這種情況下第一次呼叫此函式之前為 0x60)載入目前的“空閒記憶體指針”並為其添加大小。在此之後,函式返回新的“空閒記憶體指針”,程序員可以簡單地使用程序分配的大小字節。
編輯2:具體範例
我在為 EVM 編寫彙編程式碼方面非常缺乏經驗,因此請注意以下範例可能是錯誤的。我將嘗試給出一個範例,說明如何為變數分配空間(32 字節)、儲存值、讀取值並最終釋放記憶體。
// prepare our variables // x = variable used to store the contents of the allocated memory // p = current "free memory pointer" let x := 0 let p := mload(0x40) // allocate 32 bytes of space mstore(0x40, add(p, 0x20)) // store up to 32 bytes in the allocated space mstore(p, 0xDEADBEEF) // load the value we just stored x := mload(p) // We don't need the allocated space anymore. Free it. mstore(0x40, p)