Opcode

乙太坊操作碼:前幾條指令的含義?

  • August 19, 2018

查看操作碼級別,任何智能合約的前幾條指令都是這樣開始的:

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)

引用自:https://ethereum.stackexchange.com/questions/56824