指令碼是一種簡單的指令碼語言,也是位元幣交易處理的核心。如果你曾經寫過彙編**,你會發現這篇文章很容易理解,而且可能是有趣的;否則它可能是特別具挑戰性的。所以請保持專注!
指令碼是電腦程式,作為程式設計師,你當然知道程式是什麼。程式接受輸入,執行一段時間,然後返回輸出。程式語言是我們編寫計算機能理解的程式的工具,因為大多數語言都帶有編譯器,可以將人性化的**對映到cpu來操作,所以也稱為操作碼。
操作碼操作碼包括記憶體操作,數學,迴圈,函式呼叫以及在程式程式語言(如c)中找到的所有內容。它們構成cpu的口語,即所謂的機器碼。由於位元組是計算機的首選習慣用法,因此操作碼也是位元組。結果就是,機器碼表示要在cpu上執行的操作的位元組串。
在像c這樣的高階程式語言中考慮這段**:
現在假設你要在假設的小尾數的cpu上編譯和執行此**,該cpu具有16位記憶體(暫存器)的單個單元和以下操作碼集:x = 0x23;
x += 0x4b;
x *= 0x1e;
opcode
encoding
vset(v)
ab v
16-bit
add(v)
ac v
16-bit
mul(v)
ad v
16-bit
操作碼解釋如下:
這種cpu的編譯器將生成這9個位元組的機器**:
ab 23 00 ac 4b 00 ad 1e 00
以下是它的解釋方式:
暫存器儲存最終結果,即ce4。
大多數情況下,我們需要使用變數跟蹤複雜的程式狀態。在c中,根據變數是靜態分配還是使用malloc分配,它儲存在不同排列的記憶體中。雖然malloc-ed資料像乙個非常大的陣列中的元素一樣被訪問,但靜態變數被推送到一堆名為stack的專案中並從中彈出。堆疊以lifo方式執行(後進先出),這意味著你推送的最後乙個專案將是第乙個彈出的專案。
考慮這個虛函式:
int foo()
堆疊最初是空的(1):
然後,推送三個變數(2):
第四個變數被賦予其他變數的總和並被推入堆疊(3):[12]
[12, a4 00]
[12, a4 00, e7 a5 02 00]
[12, a4 00, e7 a5 02 00, 9d a6 02 00]
堆疊的尖端是返回值,並通過其他方式傳送回函式呼叫者。每個臨時堆疊變數都會在塊(4)的末尾彈出,因為必須平衡推push/彈pop操作,以便堆疊始終返回其初始狀態:
同樣,位元幣核心有自己的「虛擬處理器」來解釋指令碼機器碼。指令碼具有豐富的操作碼,但與英特爾等完全成熟的cpu相比卻非常有限。關於指令碼的一些關鍵事實:[12, a4 00, e7 a5 02 00]
[12, a4 00]
[12]
實際上,第1點也意味著第2點。第3點意味著在script中沒有像命名變數這樣的東西,你只需在堆疊上進行計算。通常,你推送的堆疊項成為後續操作碼的運算元。在指令碼的末尾,頂部堆疊項是返回值。
在介紹現實世界的指令碼之前,讓我們先列舉一些操作碼。如需全套,請檢視位元官方維基頁面。
以下操作碼將數字0-16推入堆疊:
opcode
encoding
op_0
00op_1-op_16
51-60
按照慣例,op_0
和op_1
也表示布林值op_false
(零)和op_true
(非零)。
例:
54 57 00 60
或者:
op_4 op_7 op_0 op_16
這是堆疊如何發展:
返回值是最高項,因此指令碼返回16。我知道,這是毫無意義的,但這是乙個開始。
[4][4, 7]
[4, 7, 0]
[4, 7, 0, 16]
提供了幾個操作碼來推送自定義資料。它們的運算元大小不同:
opcode
encoding
l (length)
d (data)
op_pushdata1
4c l d
8-bit
l bytes
op_pushdata2
4d l d
16-bit
l bytes
op_pushdata4
4e l d
32-bit
l bytes
例如,如果你的資料長度可以儲存為8位數字,那麼op_pushdata1
是你的最佳選擇。看這個:
第乙個位元組顯然是4c 14 11 06 03 55 04 8a
0c 70 3e 63 2e 31 26 30
24 06 6c 95 20 30
op_pushdata1
操作碼,後面是1位元組長度14,即十進位制20.因此,接下來會有20個位元組的資料。這條指令的作用是將這些資料壓入堆疊:
實際上,與varints一樣,對於非常短的資料有一種特殊的編碼。如果操作碼位於01和4b(包括)之間,則它是乙個推送資料操作,其中操作碼本身是以位元組為單位的長度:[11 06 03 55 04 8a 0c 70
3e 63 2e 31 26 30 24 06
6c 95 20 30]
opcode
encoding
l (length)
d (data)
ll d
01-4b
l bytes
例如,在字串中:
07 8f 49 b2 e2 ec 7c 44
操作碼07意味著要推送7個位元組的資料:
[8f 49 b2 e2 ec 7c 44]
區塊鏈中的下乙個塊呢?
你學到了一些關於機器**和操作碼的知識。指令碼是礦工軟體理解的簡單低階語言。使用堆疊記憶體跟蹤指令碼狀態。
指令碼語言 shell指令碼
指令碼語言的特徵 指令碼語言 於批處理命令語言,但更接近於程式語言。與批處理命令語言的差別是,指令碼語言有變數和豐富的控制語句 與一般程式語言的差別是 指令碼語言變數的值主要是字串,語言的基本單位是命令 而程式語言變數主要是數值,語言的基本單位是表示式 指令碼語言一般是解釋執行的,速度低,但開發成本...
使用指令碼語言
dim myvar myvar hello world myvar 在這個例子中,option explicit語句強制所有的變數必須專門宣告。dim語句宣告了變數myvar。如果在使用變數前沒有宣告變數,vbscript就會給出執行時錯誤資訊 variable is undefined myvar...
shell指令碼語言
現在流行的指令碼語言有很多,例如php perl python shell等等,這些指令碼語言都有自己的牛x的地方。shell指令碼語言在unix linux系統上用途廣泛,它的優勢在於處理作業系統底層的業務,它利用大量的命令和函式來實現強大的功能,例如一鍵安裝 報警等等。1 在編寫指令碼語言的時候...