20

I am learning the inline assembly in solidity, i ve found the function mload(0x40) i am confused whith what this function does? did it reserve 4 Slot/word in memory or did it load the data stored in the address 0X40 or what?

16

mload(0xAB) Loads the word (32byte) located at the memory address 0xAB. e.g mload(0x60) loads the word located at 0x60 memory address.

let's code to understand more :

 function f ()  
    {

        assembly {
            let freemem_pointer := mload(0x40)
            mstore(add(freemem_pointer,0x00),"36e5236fcd4c61044949678014f0d085")
            mstore(add(freemem_pointer,0x20),"36e5236fcd4c61044949678014f0d086")
            let arr1:= mload(freemem_pointer) //read first string 
            mstore(add(freemem_pointer,0x40),arr1)


        }
    }

this results in the flowing memory state :

enter image description here

This previous code stores tow strings (two memory words 32bytes each) in the free memory space. The destinations memory addresses are obtained by adding an offset of 0bytes for the first and of 0x20 for the second to the free memory pointer address(located in the memory address 0x40).
in the EVM The 6 first words in the memory are reserved and the 0x40-0x50 memory words are allocated to the free memory pointer.

Details : mload and mstore are defined in details in the yellow paper :

enter image description here

[a...b) signifies the bytes of memory starting at position a up to (excluding) position b. however b] means b included

  • 2
    You really shouldn't just write to memory without checking the 0x40 pointer first. – Tjaden Hess Oct 26 '16 at 11:34
  • What are the first 4 words used for, if the last 2 are for the free memory pointer and the length of the dynamic array? – Paul Razvan Berg Sep 27 '18 at 18:23
19

As others have stated, the x m:=mload(0x40) instruction reads the 32 bytes of memory starting at position 0x40.

In solidity, the 0x40 slot in memory is special: it contains the "free memory pointer" which points to the end of the currently allocated memory.

When you use inline assembly, you should load the data stored at 0x40 and then only write to addresses after the result. When you're done, if you want to keep that memory allocated, you should overwrite 0x40 with the new value of the free memory pointer.

  • 3
    Thanks for that very insightful remark. I have always been wondering why almost any contract starts with PUSH1 60 PUSH1 40 MSTORE, but now it makes sense, 60 is the free memory pointer. – Validity Labs - Sebastian May 4 '17 at 10:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.