跳至內容

核心戰爭/Redcode

來自華夏公益教科書,開放的書籍,開放的世界

核心戰爭程式是用一種名為 Redcode 的程式語言編寫的。Redcode 無法訪問直接輸入或輸出。

操作碼

[編輯 | 編輯原始碼]

Corewar 中的每個操作碼都包含三個部分:指令、暫存器 A 和暫存器 B。在核心程式中,每個記憶體部分都包含一個操作碼,並且不提供獨立的數字。

暫存器 A 和 B 是相對地址,在下面的定址模式中描述。

操作碼 描述
DAT A,B 資料;執行此指令會殺死任務。
MOV #A,B 如果一個是立即數,則將立即數複製到 B。
MOV A,B 將 A 處的指令移動到 B。但是,如果 A 是立即數,則將立即數複製到 B。
ADD A,B 將 A 加到 B。
SUB A,B 從 B 中減去 A。
MUL A,B 將 A 和 B 相乘以產生結果。
DIV A,B 將 B 除以 A。除以零會殺死程序。
MOD A,B A 中 B 的模數。除以零會殺死程序。
JMP A,B 跳轉到 A。
JMZ A B 如果 *B 為 0,則跳轉到 A。
JMN A,B 如果 *B 不為 0,則跳轉到 A。
DJN A,B 減少 *b。如果非零,則跳轉到 A。
CMP A,B 如果 *a == *B(或者如果是立即數,#A == *B),則跳過一條指令。
SPL A,B 建立一個新任務,該任務從 B 開始。新任務首先啟動。
SEQ A,B 如果 A 和 B 相等,則跳過下一條指令。
SNE A,B 如果 A 和 B 不相等,則跳過下一條指令。
SLT A,B 如果 *A < *B,則跳過(僅限 88)。
XCH A,B 在 A 處,交換 A 和 B。(僅限擴充套件)。
PCT A,B 在 A 處,保護運算元免於更改,直到將指令寫入該地址。
NOP A,B 沒有特殊效果(儘管運算元仍在評估)。
STP A,B 將 A 儲存到 B 指定位置的 P空間。
LDP A,B 從 B 指定位置的 P空間中檢索資料到 A。

定址模式

[編輯 | 編輯原始碼]

上面列出的每個操作碼都包含兩個暫存器。這些暫存器由數字和定址模式組成。

# 立即數。數字直接在操作碼中。
$(或無) 直接。操作碼指向相對於當前單元格的單元格。
@ 間接。操作碼指向相對於當前單元格的單元格。該單元格的 B 值將新增到間接指標中,以提供目標。
< 間接,但在使用之前減少中間暫存器。
> 間接,在使用之後增加中間暫存器。
* A 欄位間接。操作碼指向相對於當前單元格的單元格。該單元格的 A 值將新增到間接指標中,以提供目標。
{ A 欄位間接,但在使用之前減少中間暫存器。
} A 欄位間接,在使用之後增加中間暫存器。

特殊指令

[編輯 | 編輯原始碼]
END 停止編譯,後面的行將被視為註釋。
ORG 接受一個引數,該引數標識起始位置。
PIN 指定 P 空間識別符號。如果相等,則這兩個程式共享 P 空間。
<label> EQU <A> 將 <label> 的所有例項替換為 <A>。

指令修飾符

[編輯 | 編輯原始碼]
.A A -> A
.B B -> B
.AB A -> B
.BA B -> A
.F A->A 和 B->B
.X A->B 和 B->A
.I 整個指令。

P空間是程式在程式的多次執行中使用的私有儲存,對手無法直接訪問它。但是,程式的攻擊可能會欺騙其他程式破壞 P 空間區域。

在上面的操作碼列表中,有兩個指令可以讀寫 P空間:STP 和 LDP。

華夏公益教科書