1 个不稳定版本
0.1.0 | 2024年3月3日 |
---|
#50 in #asm
1MB
447 代码行
包含 (ELF 可执行文件/库, 4MB) stack_machine
概念
纯栈机。指令数量少。目前有20条指令。
用法
cargo build --release
cp target/release/stack_machine stack_machine
./stack_machine <path>
指令
代码 | 指令 | Pop | Top | Push | 描述 |
---|---|---|---|---|---|
0 | load |
- | - | value |
加载文字值 value |
1 | add |
a , b |
- | 结果 |
result = a + b |
2 | sub |
b , a |
- | 结果 |
result = a - b |
3 | mul |
a , b |
- | 结果 |
result = a * b |
4 | div |
b , a |
- | 结果 |
result = a / b |
5 | read |
mode |
- | input |
从 stdin 读取字符 (mode = 0 ) 或字符串 (mode = 1 ) |
6 | put |
format |
value |
- | 将 value 打印到 stdout 作为数字 (format = 0 )、字符 (format = 1 ) 或位 (format = 2 ) |
7 | and |
a , b |
- | 结果 |
result = a & b |
8 | or |
a , b |
- | 结果 |
result = a | b |
9 | xor |
a , b |
- | 结果 |
result = a ^ b |
10 | not |
value |
- | 结果 |
result = !value |
11 | cmp |
b |
a |
结果 |
如果 a > b : result = 1 否则如果 a < b : result = 2 否则 result = 0 |
12 | jmp |
- | - | - | jumps to #label |
13 | jeq |
value |
- | - | jumps to #label if value = 0 |
14 | jne |
value |
- | - | jumps to #label if value != 0 |
15 | jgr |
value |
- | - | jumps to #label if value = 1 |
16 | jle |
value |
- | - | jumps to #label if value = 2 |
17 | copy |
- | value |
value |
创建 value 的副本 |
18 | 丢弃 |
value |
- | - | 仅丢弃 value |
19 | 停止 |
- | - | - | 停止执行 |
示例
2 + 2
#start ; '#start' label is required
load 2 ; stack = [2]
load 2 ; stack = [2, 2]
add ; stack = [4]
2 + 2 + 2
#start
load 2 ; stack = [2]
load 2 ; stack = [2, 2]
add ; stack = [4]
load 2 ; stack = [4, 2]
add ; stack = [6]
无限循环
#start
jmp #start
条件
#equal
load "e"
load 1
put
halt
#notequal
load "n"
load 1
put
halt
#start ; program starts here!
load 2
load 1
cmp
jeq #equal
jmp #notequal ; jumps to '#notequal' because 2 != 1
待办事项
添加更多指令。