Skip to content
fxyanPublic

About

自制的编译器与虚拟机 运行我自制的汇编用来深入理解语言背后的原理

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AXE 16 位指令集

操作数格式

符号 含义 编码长度
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 + a2

w 是否表示数值或地址由指令决定:set2 中是数值,load2、save2 和跳转指令中是地址。@4096 是地址 4096;@loop 是标签地址,由汇编器解析。

间接寻址表示“先从寄存器取出地址,再访问这个地址的内存”:

set2 a1 4096
load_from_register2 a1 a2  ; a2 = 内存地址 4096 处的 16 位值
save_from_register2 a2 a1  ; 将 a2 写回内存地址 4096

16 位值占相邻两个字节。例如 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 导入汇编源文件

About

自制的编译器与虚拟机 运行我自制的汇编用来深入理解语言背后的原理

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages