跳至内容

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

华夏公益教科书