Open4
Solidity assemblyの使い方

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

圧縮だったり、assemblyの使い方については
これが最強らしい
この方のリポジトリみるとマジで魔法です。。。(自分が実力不足なだけかもしれないですが)

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」を格納する。
画像は既に格納された状態です。

mload関数
assembly {
let addresult := add(100, 200)
mstore(0x40, addresult)
let y := mload(0x40)
}
mloadは対象のmemory領域の値を呼び出す
0x40には012cが入っている為
yに012cが入る