EVM SIGNEXTEND 操作碼說明
我正在嘗試開發自己的小型 EVM。這是我了解更多有關字節級別的好方法。我對大多數說明沒有任何問題,但有一些我只是不明白。SIGNEXTEND 就是其中之一……
我試圖理解並弄清楚這裡發生了什麼以及這個操作碼是如何工作的。我找不到合適的範例,也找不到我可能需要此操作碼的情況。
你們中有人對此操作碼有任何範例或解釋嗎?
提前致謝。
在與 gitter/yellowpaper 的一些人交談後,我現在可以解釋
SIGNEXTEND
操作了。我的錯誤是認為 μ_s 處的 LSB
$$ 1 $$位置為 0。MSB 的位置為 0,LSB 的位置為 255。 此外,無論值本身俱有何種大小,evm 總是將所有內容擴展到字長。
只是一個讓這個操作更清楚的例子:
假設我們有-2,它是
1111 1110
二進制的。由於 evm 中的所有內容都有字長,0
因此二進製字元串中的 255 位置。要獲得簽名位,μ_s$$ 0 $$有價值
0
。這意味著t
:t = 256 - 8(0 + 1) = 256 - 8 = 248
使用它,它擴展了
1111 1110
to1111 1111 ... 1111 1110
,在那裡又1111 1111
出現了 31 次 :)希望能幫助到你。
驚人的!這是了解 EVM 的好方法。答案可能很冗長,但會很完整。
二進制補碼
二進制補碼是一種用二進製表示整數的方法。它使我們能夠輕鬆簡單地表示有符號整數(為方便起見粘貼;有關更多詳細資訊,請參見原始碼):
假設我們正在處理 8 位數量(為簡單起見),並假設我們想要找到 -28 將如何以二進制補碼表示法表示。首先,我們以二進制形式寫出 28。
00011100
然後我們反轉數字。0變成1,1變成0。
11100011
然後我們加1。
11100100
這就是將 -28 寫入 8 位二進製文件的方式。
擴展有符號整數的長度
擴展無符號整數長度的概念相當簡單,例如:
以數字01010101為例。它的長度為 1 個字節。
假設我們要將其表示為 2 個字節。我們需要做的就是向我們的數字添加八個 0,如下所示:00000000 01010101。現在是 2 個字節。
但是,有符號整數的最左邊是符號位,在擴展有符號整數時必須注意包含符號位,否則我們將更改它的原始值。假設我想在二進制11100100中擴展我們在 -28 以上使用的數字,就像我們擴展無符號整數一樣,如下所示:
00000000 11100100
現在我們的有符號整數不再是 -28 而是 228。因此,我們需要一種機制來擴展有符號整數同時保留符號位。實際上並不是這樣,我們需要做的不是附加八個 0,而是附加八個符號位。在這種情況下,符號位是 1。所以我們將附加八個 1 的 1,如下所示:
11111111 11100100
現在我們有值 -28 以兩個字節而不是 1 表示。
有關更多詳細資訊,請參見原始碼。
所以為什麼??
為什麼有一個特殊的操作碼呢?這可能會非常快地達到低級,但是擴展有符號整數的符號的過程需要幾個操作碼。我將簡要解釋在沒有 SIGNEXTEND 操作碼的情況下我將如何做到這一點:
- 位遮罩以獲取最左邊的位
- 檢查最左邊的值
- 追加最左邊的位的值
正因為如此,而且因為它使用得足夠頻繁,開發人員一定認為有必要為它創建一個特殊的操作碼。
我們為什麼要使用它?這是一個有根據的猜測,但可以使用它在不同大小的寄存器之間移動數據,正如本文所建議的那樣。
如果您覺得這有幫助,請告訴我!😃