坚固性 - 装配


Solidity 提供了使用汇编语言在 Solidity 源代码中编写内联汇编的选项。我们还可以编写独立的汇编代码,然后将其转换为字节码。Standalone Assembly 是 Solidity 编译器的中间语言,它将 Solidity 代码转换为 Standalone Assembly,然后转换为字节码。我们可以使用内联汇编中使用的相同语言在独立汇编中编写代码。

内联组装

内联汇编代码可以在 Solidity 代码库中交错,以便对 EVM 进行更细粒度的控制,特别是在编写库函数时使用。

汇编代码写在assembly { ... }块下。

例子

尝试以下代码来了解库在 Solidity 中的工作原理。

pragma solidity ^0.5.0;

library Sum {   
   function sumUsingInlineAssembly(uint[] memory _data) public pure returns (uint o_sum) {
      for (uint i = 0; i < _data.length; ++i) {
         assembly {
            o_sum := add(o_sum, mload(add(add(_data, 0x20), mul(i, 0x20))))
         }
      }
   }
}
contract Test {
   uint[] data;
   
   constructor() public {
      data.push(1);
      data.push(2);
      data.push(3);
      data.push(4);
      data.push(5);
   }
   function sum() external view returns(uint){      
      return Sum.sumUsingInlineAssembly(data);
   }
}

使用Solidity First Application章节中提供的步骤运行上述程序。

注意- 在单击部署按钮之前从下拉列表中选择测试。

输出

0: uint256: 15