3分钟Solidity: 7.3 汇编循环语句

29 阅读1分钟

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

如需获取本内容的最新版本,请参见 Cyfrin.io 上的汇编循环(代码示例)

Yul支持for循环,它由一个包含初始化部分的头,一个条件,一个后迭代部分和一个主体组成。

条件必须是一个表达式,而其他三个是代码块。

如果初始化部分在顶层声明了任何变量,这些变量的范围将延伸到循环的所有其他部分。

break 和 continue 语句可以在主体中使用,分别用于退出循环或跳到后部分。

下面的例子是计算内存中一个代码区域的总和。

{
    let x := 0
    for { let i := 0 } lt(i, 0x100) { i := add(i, 0x20) } {
        x := add(x, mload(i))
    }
}

For循环也可以作为while循环的替代: 只需将初始化和后迭代部分留为空即可。

{
    let x := 0
    let i := 0
    for { } lt(i, 0x100) { } {     // while(i < 0x100)
        x := add(x, mload(i))
        i := add(i, 0x20)
    }
}

汇编中的循环示例

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

contract AssemblyLoop {
    function yul_for_loop() public pure returns (uint256 z) {
        assembly {
            for { let i := 0 } lt(i, 10) { i := add(i, 1) } { z := add(z, 1) }
        }
    }

    function yul_while_loop() public pure returns (uint256 z) {
        assembly {
            let i := 0
            for {} lt(i, 5) {} {
                i := add(i, 1)
                z := add(z, 1)
            }
        }
    }
}

Remix Lite 尝试一下

solidity-assembly_loop


END