Evm
為什麼在 PUSH1 操作碼中 EVM 程序計數器不加一而是加二?
在本教程中,對於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
壓入堆棧的值。