| 符号 | 含义 | 编码长度 |
|---|---|---|
r |
寄存器编号,如 a1 |
1 字节 |
b |
8 位无符号立即数 | 1 字节 |
w |
16 位无符号立即数或地址 | 2 字节,小端序(低字节在前) |
格式按操作数顺序排列:rw 表示“寄存器 + 16 位数”,wr 表示“16 位地址 + 寄存器”,rrr 表示三个寄存器。rb 表示“寄存器 + 8 位数”;下表的 16 位指令不使用这一格式。
r 的 1 字节只用于标识寄存器,并不表示寄存器只能保存 8 位值。每条机器指令还包含 1 字节操作码,例如 set2 a1 1000 的格式是 rw,总长度为 1 + 1 + 2 = 4 字节。
| 指令 | 操作数格式 | 用途 |
|---|---|---|
set2 |
rw |
将 16 位立即数写入寄存器 |
load2 |
wr |
从指定内存地址读取 16 位值 |
save2 |
rw |
将 16 位值写入指定内存地址 |
load_from_register2 |
rr |
第一个寄存器保存地址,读取该地址的 16 位值到第二个寄存器 |
save_from_register2 |
rr |
第一个寄存器保存待写入的值,第二个寄存器保存目标地址 |
add2 |
rrr |
前两个寄存器是输入,第三个保存结果:目标 = a + b |
subtract2 |
rrr |
前两个寄存器是输入,第三个保存结果:目标 = a - b |
multiply2 |
rrr |
前两个寄存器是输入,第三个保存结果:目标 = a × b |
shift_right |
rrr |
前两个寄存器是输入,第三个保存结果:目标 = a >> b |
and |
rrr |
前两个寄存器是输入,第三个保存结果:目标 = a & b |
compare |
rr |
比较第一个与第二个寄存器:小于、等于、大于分别将 c1 设为 0、1、2 |
jump |
w |
跳转到指定地址 |
jump_from_register |
r |
跳转到寄存器保存的地址 |
jump_if_less |
w |
比较结果为小于时跳转 |
jump_if_equal |
w |
比较结果为等于时跳转 |
halt |
无 |
停止执行 |
操作数顺序示例:
set2 a1 1000 ; rw:a1 = 1000
load2 @4096 a1 ; wr:从地址 4096 读取到 a1
save2 a1 @4096 ; rw:将 a1 写入地址 4096
add2 a1 a2 a3 ; rrr:a3 = a1 + a2w 是否表示数值或地址由指令决定:set2 中是数值,load2、save2 和跳转指令中是地址。@4096 是地址 4096;@loop 是标签地址,由汇编器解析。
间接寻址表示“先从寄存器取出地址,再访问这个地址的内存”:
set2 a1 4096
load_from_register2 a1 a2 ; a2 = 内存地址 4096 处的 16 位值
save_from_register2 a2 a1 ; 将 a2 写回内存地址 409616 位值占相邻两个字节。例如 0x1234 存入地址 4096 时,地址 4096 保存 0x34,地址 4097 保存 0x12。
伪指令是汇编器处理的源码语法,没有独立的 VM 操作码;它们会被展开为机器指令,或在汇编时完成定位、导入等工作。下面列出原 AXE 扩展语法。
| 指令 | 用途 |
|---|---|
.memory |
指定后续代码的内存位置 |
.var2 |
声明 16 位变量 |
.var-string |
声明字符串 |
.add2 |
对变量执行加法 |
.subtract2 |
对变量执行减法 |
.multiply2 |
对变量执行乘法 |
.function |
定义函数及参数 |
.function_end |
标记函数定义结束 |
.call |
调用函数 |
.return |
从函数返回 |
.return_value |
将返回值保存到变量 |
.if |
条件分支 |
.endif |
结束条件分支 |
.while |
条件循环 |
.print |
将变量值写入约定的输出地址 |
.log |
将寄存器值写入约定的日志地址 |
.import |
导入汇编源文件 |