Evm

為什麼在 PUSH1 操作碼中 EVM 程序計數器不加一而是加二?

  • September 4, 2021

在本教程中,對於PUSH1操作碼,程序計數器增加 2。然後對於其他操作碼它增加 1。為什麼是這樣?它與記憶體中的操作碼大小有關嗎?它們不都是256位的嗎?

PC: 11 STACK: [32] MEM: [], STORAGE: {}

PC: 13 STACK: [2020202020] MEM: [], STORAGE: {}

PC: 14 STACK: [2020202020, 0] MEM: [], STORAGE: {}

PC: 16 STACK: [2020202020, 54] MEM: [], STORAGE: {}

PC: 17 STACK: [] MEM: [], STORAGE: {54: 2020202020}

如範常式式碼所示

PUSH1 0 CALLDATALOAD SLOAD NOT PUSH1 9 JUMPI STOP JUMPDEST PUSH1 32 CALLDATALOAD PUSH1 0 CALLDATALOAD SSTORE

索引排列為;

0 -> PUSH1

1 -> 0

2 -> 呼叫數據載入

3 -> 載入 ……

在程序 0 中,它引用 PUSH1 並將 1 處的值壓入堆棧,並執行 2 處的下一條指令。因此 PC 變為 2。

EVM 將所有操作碼的程序計數器 (PC) 增加 1,但PUSH 及其衍生版本*除外。*根據Source Mappings上的文件:

這些元素中的每一個都對應一條指令,即您不能使用字節偏移量,但必須使用指令偏移量**(推送指令比單個字節長)**。

因此,當 EVM 看到這一點時:

PUSH1 0

它將PC增加2,因為首先是PUSH1操作碼,然後是0壓入堆棧的值。

引用自:https://ethereum.stackexchange.com/questions/25409