35

I am learning the inline assembly in solidity, I have found the function mload(0x40) I am confused with 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?

Yilmaz
  • 1,580
  • 10
  • 24
Sig Touri
  • 1,090
  • 2
  • 14
  • 23

3 Answers3

34

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.

Tjaden Hess
  • 37,046
  • 10
  • 91
  • 118
27

mload(0xAB) loads the word (32 bytes long) located at the memory address 0xAB. e.g mload(0x60) loads the word located at the 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)
            }
        }

After execution, f() generates the following memory state: enter image description here

The code above stores two strings (two memory words of 32 bytes each) in the free memory space. The destination memory addresses are obtained by adding offsets of 0x00 and 0x20 (for the first and second strings respectively) to the free memory pointer address (located at the memory address 0x40 and pointing to the 0x60 address).

In the EVM, the first 4 words in the memory are reserved and the 0x40-0x50 memory words are allocated to the free memory pointer.

MLOAD and MSTORE are defined in detail in the Ethereum Yellow Paper:

enter image description here

[a...b) refers to the bytes of memory starting at position a up to (but excluding) position b. However, b] means "b included".

Iaroslav
  • 301
  • 1
  • 2
  • 19
Badr Bellaj
  • 18,780
  • 4
  • 58
  • 75
2

Those who might be confused from the picture posted by @Badr, although I am not sure why, the memory doesn't look like it currently (version ^0.8.0). As others pointed out, the mload(0x40) returns where the pointer addresses that you can start using it. (free-pointer)

The first four 32 bytes (128) are always reserved when your smart contract is deployed. This is the reason your mload(0x40) returns 80. 80 is represented in hex format. It is 128 in decimal, which is where you can start writing in memory! This is how the memory looks like currently.

enter image description here

Emrah
  • 1,654
  • 2
  • 9
  • 24
  • Is that picture from remix? If so, how did you generate it? Is that some sort of plugin? Thanks a lot! – Kuly14 Jul 18 '22 at 13:27
  • Hi, no plugin. When the transaction is created, use debug option and it will show you. https://remix-ide.readthedocs.io/en/latest/tutorial_debug.html – Emrah Jul 18 '22 at 13:32