核心戰爭/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。