核心战争/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。