Open4

Solidity assemblyの使い方

TABETABE

add(a,b)の関数

※remixでデバッグしています。

assembly {
        let addresult := add(100, 200)
}

この計算が意味することは

16進数で

100は64
200はC8

の値をStack領域に一旦書き込み
それを足して

012cは300

16進数なので二つずつ区切って考えると 01 | 2c 256 + 44 = 300 という計算になる。

よってStack領域に300が格納された状態
「addresult」の値はStack領域で保存されている

以下のコードをRemixでデバッグしてみるとわかる

assembly {
        let addresult := add(100, 200)
}
TABETABE

mstore

上記のaddの続きになります。

assembly {
        let addresult := add(100, 200) // stack上に 012c(300)が設定された状態
        mstore(0x40, addresult)
 }

mstoreはmemory領域に格納する関数

remixでDebugしているとStackとMemoryの状態が確認できます。

 mstore(0x40, addresult)

は0x40の領域に「012c」を格納する。
画像は既に格納された状態です。

TABETABE

mload関数

 assembly {
        let addresult := add(100, 200)
        mstore(0x40, addresult)
        let y := mload(0x40)
}

mloadは対象のmemory領域の値を呼び出す

0x40には012cが入っている為
yに012cが入る