Solidity - การประกอบ

Solidity มีตัวเลือกในการใช้ภาษาแอสเซมบลีเพื่อเขียนแอสเซมบลีแบบอินไลน์ภายในซอร์สโค้ด Solidity นอกจากนี้เรายังสามารถเขียนโค้ดแอสเซมบลีแบบสแตนด์อโลนซึ่งจะถูกแปลงเป็นไบต์โค้ด Standalone Assembly เป็นภาษากลางสำหรับคอมไพเลอร์ Solidity และจะแปลงรหัส Solidity เป็น Standalone Assembly จากนั้นเป็นรหัสไบต์ เราสามารถใช้ภาษาเดียวกับที่ใช้ใน Inline 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

Note - เลือกทดสอบจากเมนูแบบเลื่อนลงก่อนคลิกปุ่มปรับใช้

เอาต์พุต

0: uint256: 15