Solidity

這個彙編程式碼的返回值是多少?

  • November 22, 2022

取自這個儲存庫

   /// @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) }
   }

我的理解是:

  1. 讓 c := 添加 (27, 16)。c 現在儲存值 42
  2. mstore(0x80,c)。c 儲存在地址 0x80 的記憶體中。可能是沒有效果的 useles 語句。因為之後就不用記憶體了。
  3. 讓 d := 添加 (sload(c), 255)。

負載(c)。載入 c 的長度???對此不確定,但我在某處讀到,在沒有偏移量的情況下載入變數會返回它的長度。但如果為真,則 sload(c) 值可能是 256,因為 int256

add(sload(c), 255) 與 add(256, 255) = 511 相同。d = 511

  1. b := d。這很簡單。d 的值分配給 b。
  2. b := 添加(b, c)。b 是 511 + 42 = 553
  3. 函式返回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,這是函式返回的值。

看:

https://www.evm.codes/#54

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