Guest User

Memory Operations Demo

a guest
Nov 8th, 2018
36
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. contract MemoryOperationsDemo {
  2.     function normalSumOfArray(uint[] arr) public view returns (uint sum) {
  3.         for (uint i = 0; i < arr.length; i++) {
  4.             sum = arr[i] + sum;
  5.         }
  6.     }
  7.    
  8.     function asmSumOfArray(uint[] arr) public view returns (uint sum) {
  9.         assembly {
  10.             let len := mload(arr)
  11.             let elAddress := add(arr, 0x20)
  12.             let i := 0
  13.            
  14.             loop:
  15.                 sum := add(sum, mload(elAddress))
  16.                 elAddress := add(elAddress, 0x20)
  17.                
  18.                 i := add(i, 1)
  19.                 jumpi(loop, lt(i, len))
  20.         }
  21.     }
  22.    
  23.     function normalScaleArray(uint[] arr) public view returns (uint[] result) {
  24.         for (uint i = 0; i < arr.length; i++) {
  25.             arr[i] = arr[i] * 2;
  26.         }
  27.        
  28.         return arr;
  29.     }
  30.    
  31.     function asmScaleArray(uint[] arr) public view returns (uint[] result) {
  32.         assembly {
  33.             let len := mload(arr)
  34.             let elAddress := add(arr, 0x20)
  35.             let i := 0
  36.             let element := 0
  37.            
  38.             let offset := add(msize, 1)
  39.             mstore(offset, 0x20) // store the data type in mem[0]. 0x20 means one-dimensional dynamic array
  40.             mstore(add(offset, 0x20), len) // store the length in mem[1]
  41.            
  42.             loop:
  43.                 element := mload(elAddress)
  44.                 element := mul(element, 2)
  45.                
  46.                 // store element i in mem[2 + i]
  47.                 mstore(add(add(offset, 0x40), mul(i, 0x20)), element)
  48.                
  49.                 elAddress := add(elAddress, 0x20)
  50.                
  51.                 i := add(i, 1)
  52.                 jumpi(loop, lt(i, len))
  53.                    
  54.             // return mem[0..len+2]
  55.             return(offset, add(add(offset, 0x40), mul(len, 0x20)))
  56.         }
  57.     }
  58. }
RAW Paste Data