Solidity
這個彙編程式碼的返回值是多少?
取自這個儲存庫
/// @notice Generate number function asmbl() public view returns (uint8 b) { assembly { let c := add(27, 16) mstore(0x80, c) { let d := add(sload(c), 255) b := d } b := add(b, c) } }
我的理解是:
- 讓 c := 添加 (27, 16)。c 現在儲存值 42
- mstore(0x80,c)。c 儲存在地址 0x80 的記憶體中。可能是沒有效果的 useles 語句。因為之後就不用記憶體了。
- 讓 d := 添加 (sload(c), 255)。
負載(c)。載入 c 的長度???對此不確定,但我在某處讀到,在沒有偏移量的情況下載入變數會返回它的長度。但如果為真,則 sload(c) 值可能是 256,因為 int256
add(sload(c), 255) 與 add(256, 255) = 511 相同。d = 511
- b := d。這很簡單。d 的值分配給 b。
- b := 添加(b, c)。b 是 511 + 42 = 553
- 函式返回553
這個對嗎?
let c := add(27, 16) // 43 -> c mstore(0x80, c) // stores uint256(43) at memory[0x80..0xa0] { let d := add(sload(c), 255) // sload(c) -> 0 (*) // 255 -> d b := d // 255 -> b } b := add(b, c) // 255 + 43 = 298 = 42 -> b (**)
(*) 合約有 12 個變數,每個變數佔用一個槽。因此,大多數大於 13 的槽都未初始化,它們將返回 0。一些字元串已初始化,但它們很短(小於 32),因此沒有使用更高的槽。
(**) b 是 uint8,所以我們不能儲存 298,它的高位被截斷了。
我相信 sload(c) 載入儲存在鍵 c 的值。鍵是 c,儲存值是 42。你提到的長度是針對動態數組的,但我認為它不適用於這裡的這個片段。因此,d = 42 + 255 = 297,b = 297 + 42 = 339,這是函式返回的值。
看: