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?
3 Answers
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 :
This previous code stores two 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 :
[a...b) signifies the bytes of memory starting at position a up to (excluding) position b. however b] means b included
-
3You really shouldn't just write to memory without checking the
0x40
pointer first. Oct 26, 2016 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? Sep 27, 2018 at 18:23
-
1
-
1Thanks @AntonCheng. For posterity: go read the Layout in Memory docs. They helped me understand this. Aug 30, 2021 at 16:22
-
What tool are you using to display the memory pane? Looking for some visual tools to help me grasp the concepts of evm. Nov 27, 2021 at 12:50
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.
-
4Thanks 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. May 4, 2017 at 10:54 -
1
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.
-
Is that picture from remix? If so, how did you generate it? Is that some sort of plugin? Thanks a lot!– Kuly14Jul 18, 2022 at 13:27
-
Hi, no plugin. When the transaction is created, use debug option and it will show you. remix-ide.readthedocs.io/en/latest/tutorial_debug.html– EmrahJul 18, 2022 at 13:32