assembly (YUL)为什么在非32个多存储器位置存储值会溢出到下一个位置?

kb5ga3dv  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(116)

以这一行为例(Yul):

mstore(0x24, 0x0443455243)

如果是mstore(0x20, 0x0443455243),则整个值将存储在位置0x20
但是,如果使用0x24,我希望值存储在0x24,但是只有第一个字节存储在0x20,而接下来的4个字节溢出并存储在位置0x40的末尾。

为什么会这样呢?

iklwldmw

iklwldmw1#

内存和存储中的数据保存方式略有不同。虽然内存被分配在32字节大小的缓冲区中,但内存中没有插槽,类似于存储。这就是为什么谈论位置X的结束或开始并不完全正确,因为位置是一个单字节的位置。Remix只是将内存表示拆分为块,以获得更好的视觉表示。
通过存储一个值(* 即〈= 32 bytes *),指定位置(index),EVM从该位置开始选取一个32 bytes大小的缓冲区,并将该值打包到该缓冲区的末尾。

  • mstore(0x20, 0x0443455243)采用索引32..63处的缓冲区范围(以小数表示)。
  • mstore(0x24, 0x0443455243)取缓冲区范围36..67/0x24..0x43

二进制(0x0443455243)占用5个字节 (字符串长度04,数据43 45 52 43,因此当我们将它们放入36..67范围时,它将占据该缓冲区范围的末尾,位置将为:63,64,65,66,67 .

  • 位置630x3f)在范围端0x20-0x3f
  • 位置64..67/(0x40..0x43)在范围开始0x40-0x5f

相关问题