Evm

EVM SIGNEXTEND 操作碼說明

  • November 29, 2018

我正在嘗試開發自己的小型 EVM。這是我了解更多有關字節級別的好方法。我對大多數說明沒有任何問題,但有一些我只是不明白。SIGNEXTEND 就是其中之一……

黃皮書是這樣描述操作碼的: 在此處輸入圖像描述

我試圖理解並弄清楚這裡發生了什麼以及這個操作碼是如何工作的。我找不到合適的範例,也找不到我可能需要此操作碼的情況。

你們中有人對此操作碼有任何範例或解釋嗎?

提前致謝。

在與 gitter/yellowpaper 的一些人交談後,我現在可以解釋SIGNEXTEND操作了。

我的錯誤是認為 μ_s 處的 LSB

$$ 1 $$位置為 0。MSB 的位置為 0,LSB 的位置為 255。 此外,無論值本身俱有何種大小,evm 總是將所有內容擴展到字長。

只是一個讓這個操作更清楚的例子:

假設我們有-2,它是1111 1110二進制的。由於 evm 中的所有內容都有字長,0因此二進製字元串中的 255 位置。要獲得簽名位,μ_s

$$ 0 $$有價值0。這意味著tt = 256 - 8(0 + 1) = 256 - 8 = 248

使用它,它擴展了1111 1110to 1111 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 操作碼的情況下我將如何做到這一點:

  1. 位遮罩以獲取最左邊的位
  2. 檢查最左邊的值
  3. 追加最左邊的位的值

正因為如此,而且因為它使用得足夠頻繁,開發人員一定認為有必要為它創建一個特殊的操作碼。

我們為什麼要使用它?這是一個有根據的猜測,但可以使用它在不同大小的寄存器之間移動數據,正如本文所建議的那樣。

如果您覺得這有幫助,請告訴我!😃

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