欢迎订阅专栏:3分钟Solidity--智能合约--Web3区块链技术必学
如需获取本内容的最新版本,请参见 Cyfrin.io 上的“Assembly Conditional Statements (Code Example)”
Yul 的设计试图实现几个目标:
- 用Yul编写的程序应该是可读的,即使代码是由Solidity或其他高级语言的编译器生成的。
- 控制流应易于理解,以帮助人工检查、形式化验证和优化。
- 从Yul到字节码的翻译应该尽可能的简单明了。
- 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 尝试一下
END