Learn EVM Opcodes VII
We dealt with MSTORE8, MLOAD and Return opcodes in this lesson.
MSTORE8
We use the MSTORE opcode for storing 32-byte value to write in the memory. However MSTORE8 opcode is used for storing 1-byte value to write in the memory.
We can write 32 bytes and 1 byte of data to memory, but reading is only valid for 32 bytes.
Ok.
This is new opcode block. You can try to execute in playground.
PUSH1 0xCC
PUSH1 0
MSTORE
PUSH1 0xDD
PUSH1 30
MSTORE8
How is memory shaped with this opcode block?
Via MSTORE8, we save the 0xdd value(1 byte sized)to the 30th byte in memory.
MLOAD
We pull the data from memory to the stack via MLOAD. Remember that we can pull it in sets of 32 bytes.
This is our opcode block.
PUSH1 0xCC
PUSH1 0
MSTORE
PUSH1 0xDD
PUSH1 30
MSTORE8
PUSH1 0
MLOAD
What is the result ? Please think twice.
PUSH1 0
MLOAD
It means that MLOAD takes the datas from the memory (0. byte to 31.byte)
The result is “ddcc”
This is our new opcode block.
PUSH1 0xCC
PUSH1 0
MSTORE
PUSH1 0xDD
PUSH1 30
MSTORE8
PUSH1 31
MLOAD
Yes. The result is changing.
The result is “cc”
RETURN
This opcode is used as follows.
offset: Starting from which byte the data will be copied from memory
size: How many bytes of data to copy
Here the return opcode does not throw the data to the stack, it returns it directly.
Let’s make an example.
PUSH3 0xAABBCC
PUSH1 0
MSTORE
We loaded 3 bytes of AABBCC data into the memory. Note that this data is on the far right because evm loads it as 32 bytes.
Now let’s return this data from memory with the help of the following codes.
PUSH1 3
PUSH1 29
RETURN
In short, return 3 bytes of data starting byte 29.
What do we see when we do a similar operation with MLOAD?
PUSH3 0xAABBCC
PUSH1 0
MSTORE
PUSH1 29
MLOAD
When we call the 29th byte with MLOAD, in addition to the 29th byte, we also call the following 31 bytes of data.
aabbcc0000000000000000000000000000000000000000000000000000000000
We also call this data to the stack.