satgo1546​/​satisfied

截图
不能运行很高兴的屑
可以运行也很高兴的屑
支持生草
支持Windows 11和Windows Terminal
现已加入操作系统启动扇区
虚拟机(废弃)

32位,小端序。

寄存器

0 常量0
1 常量1
2 立即数
3 常量−1
4~F 通用寄存器
标志 进位、零、溢出、符号标志

寄存器0~3只能作为源寄存器使用;标志寄存器不能作为源寄存器或目标寄存器直接使用。

指令编码

适用的操作码 指令类型 字节
0 1 2 3 4 5
[00, 07] 无参 操作码
[08, 1F] ∪ [30, 5F] 常规 操作码 操作数
76543210
目标寄存器 源寄存器
(立即数)
[20, 2F] 移位 操作码 操作数
76543210
目标寄存器 源寄存器
(立即数)
[60, 6F] 近跳转 操作码 偏移量
[70, 7F] 远跳转 操作码 偏移量

跳转类指令的偏移量皆是相对于之后一条指令,故十六进制编码为71 00000000的指令相当于什么都没做,而61 FE则为死循环。

指令集

  0 1 2 3 4 5 6 7 8 9 A B C D E F
00 停机 返回     清进位 置进位 空操作 进位取反 入栈 出栈 带进位循环右移 交换端序 位反转 位计数 前导零计数 尾缀零计数
10   位与 位异或 位或           测试            
20 左移 右移 算术右移 带符号扩展 循环左移 循环右移                    
30 加法 带进位加法 减法 带退位减法 反向减法 带退位反向减法     比较负   比较          
40   乘法 无符号除法 带符号除法 无符号取余 带符号取余     装入8 装入16 装入32   保存8 保存16 保存32  
50 交换 传送 无符号<则传送 无符号≥则传送 =则传送 ≠则传送 无符号≤则传送 无符号>则传送 带符号<则传送 带符号≥则传送     带符号≤则传送 带符号>则传送 溢出则传送 不溢出则传送
60 近调用 近跳转 无符号<则近跳转 无符号≥则近跳转 =则近跳转 ≠则近跳转 无符号≤则近跳转 无符号>则近跳转 带符号<则近跳转 带符号≥则近跳转     带符号≤则近跳转 带符号>则近跳转 溢出则近跳转 不溢出则近跳转
70 远调用 远跳转 无符号<则远跳转 无符号≥则远跳转 =则远跳转 ≠则远跳转 无符号≤则远跳转 无符号>则远跳转 带符号<则远跳转 带符号≥则远跳转     带符号≤则远跳转 带符号>则远跳转 溢出则远跳转 不溢出则远跳转
80                                
90                                
A0                                
B0                                
C0                                
D0                                
E0                                
F0                               无效

条件码

0
1
2 无符号< 进位标志
3 无符号≥ ¬进位标志
4 = 零标志
5 ¬零标志
6 无符号≤ 进位标志 ∨ 零标志
7 无符号> ¬进位标志 ∧ ¬零标志
8 带符号< 符号标志 ⊕ 溢出标志
9 带符号≥ ¬(符号标志 ⊕ 溢出标志)
A  
B  
C 带符号≤ 零标志 ∨ (符号标志 ⊕ 溢出标志)
D 带符号> ¬零标志 ∧ ¬(符号标志 ⊕ 溢出标志)
E 溢出 溢出标志
F 不溢出 ¬溢出标志

常见问题

中间表示(暂定)

原理

常见问题

源代码的标准格式

原理

自JSON直接读入树结构,内存表示同样无环,故引用定义不以指针,而是凭借整数标识符和相对层级。为免去JSON不允许尾随逗号之烦,不用行末逗号,而用行首逗号。缩进干扰版本控制系统的判断,故也不缩进。一段简短的程序写作JSON看起来甚至比S-表达式都长太多,其实只是常用算术记号太精简带来的错觉。

编译器的Go实现使用内置的JSON库直接解析到对象。参数列表对应切片(语言中的标准列表类型),最是方便。若要以其他语言实现,也请活用内置JSON库的惯例。

常见问题