3分钟Solidity: 7.2 汇编条件语句

37 阅读1分钟

欢迎订阅专栏3分钟Solidity--智能合约--Web3区块链技术必学

如需获取本内容的最新版本,请参见 Cyfrin.io 上的“Assembly Conditional Statements (Code Example)”

Yul 的设计试图实现几个目标:

  1. 用Yul编写的程序应该是可读的,即使代码是由Solidity或其他高级语言的编译器生成的。
  2. 控制流应易于理解,以帮助人工检查、形式化验证和优化。
  3. 从Yul到字节码的翻译应该尽可能的简单明了。
  4. Yul应该适用于整个程序的优化。

为了实现第一个和第二个目标,Yul提供了高级别的结构,如 for 循环, if 和 switch 语句和函数调用。 这些应该足以充分代表汇编程序的控制流。 因此,没有提供 SWAP, DUP, JUMPDEST, JUMP 和 JUMPI 的明确语句, 因为前两者混淆了数据流,后两者混淆了控制流。此外, mul(add(x, y), 7) 形式的函数语句比 7 y x add mul 这样的纯操作码语句更受欢迎, 因为在第一种形式中,更容易看到哪个操作数用于哪个操作码。

汇编中的条件语句示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract AssemblyIf {
    function yul_if(uint256 x) public pure returns (uint256 z) {
        assembly {
            // if condition = 1 { code }
            // no else
            // if 0 { z := 99 }
            // if 1 { z := 99 }
            if lt(x, 10) { z := 99 }
        }
    }

    function yul_switch(uint256 x) public pure returns (uint256 z) {
        assembly {
            switch x
            case 1 { z := 10 }
            case 2 { z := 20 }
            default { z := 0 }
        }
    }
}

Remix Lite 尝试一下

solidity-assembly_if

END