snow/docs/SnowVM-OpCode/SnowVM-OpCode.md
Luke a86fb4826d docs: 更新操作码文档结构和内容
- 添加新的 Reference Control 分类
- 更新各分类的名称和描述,使其更加清晰
2025-07-24 13:31:34 +08:00

233 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SnowVM-OpCode
## Type Control (0x0000-0x00BF)
### Byte8 (0x0000-0x001F)
| 指令名 | 十六进制 | 说明 |
|----------|--------|----------------|
| B\_ADD | 0x0000 | byte8 加法 |
| B\_SUB | 0x0001 | byte8 减法 |
| B\_MUL | 0x0002 | byte8 乘法 |
| B\_DIV | 0x0003 | byte8 除法 |
| B\_MOD | 0x0004 | byte8 取余 |
| B\_NEG | 0x0005 | byte8 取负 |
| B\_INC | 0x0006 | byte8 自增 |
| B\_AND | 0x0007 | byte8 按位与 |
| B\_OR | 0x0008 | byte8 按位或 |
| B\_XOR | 0x0009 | byte8 按位异或 |
| B\_PUSH | 0x000A | byte8 入栈 |
| B\_LOAD | 0x000B | byte8 本地变量加载 |
| B\_STORE | 0x000C | byte8 本地变量存储 |
| B\_CE | 0x000D | byte8 等于条件判断 |
| B\_CNE | 0x000E | byte8 不等于条件判断 |
| B\_CG | 0x000F | byte8 大于条件判断 |
| B\_CGE | 0x0010 | byte8 大于等于条件判断 |
| B\_CL | 0x0011 | byte8 小于条件判断 |
| B\_CLE | 0x0012 | byte8 小于等于条件判断 |
---
### Short16 (0x0020-0x003F)
| 指令名 | 十六进制 | 说明 |
|----------|--------|------------------|
| S\_ADD | 0x0020 | short16 加法 |
| S\_SUB | 0x0021 | short16 减法 |
| S\_MUL | 0x0022 | short16 乘法 |
| S\_DIV | 0x0023 | short16 除法 |
| S\_MOD | 0x0024 | short16 取余 |
| S\_NEG | 0x0025 | short16 取负 |
| S\_INC | 0x0026 | short16 自增 |
| S\_AND | 0x0027 | short16 按位与 |
| S\_OR | 0x0028 | short16 按位或 |
| S\_XOR | 0x0029 | short16 按位异或 |
| S\_PUSH | 0x002A | short16 入栈 |
| S\_LOAD | 0x002B | short16 本地变量加载 |
| S\_STORE | 0x002C | short16 本地变量存储 |
| S\_CE | 0x002D | short16 等于条件判断 |
| S\_CNE | 0x002E | short16 不等于条件判断 |
| S\_CG | 0x002F | short16 大于条件判断 |
| S\_CGE | 0x0030 | short16 大于等于条件判断 |
| S\_CL | 0x0031 | short16 小于条件判断 |
| S\_CLE | 0x0032 | short16 小于等于条件判断 |
---
### Int32 (0x0040-0x005F)
| 指令名 | 十六进制 | 说明 |
|----------|--------|----------------|
| I\_ADD | 0x0040 | int32 加法 |
| I\_SUB | 0x0041 | int32 减法 |
| I\_MUL | 0x0042 | int32 乘法 |
| I\_DIV | 0x0043 | int32 除法 |
| I\_MOD | 0x0044 | int32 取余 |
| I\_NEG | 0x0045 | int32 取负 |
| I\_INC | 0x0046 | int32 自增 |
| I\_AND | 0x0047 | int32 按位与 |
| I\_OR | 0x0048 | int32 按位或 |
| I\_XOR | 0x0049 | int32 按位异或 |
| I\_PUSH | 0x004A | int32 入栈 |
| I\_LOAD | 0x004B | int32 本地变量加载 |
| I\_STORE | 0x004C | int32 本地变量存储 |
| I\_CE | 0x004D | int32 等于条件判断 |
| I\_CNE | 0x004E | int32 不等于条件判断 |
| I\_CG | 0x004F | int32 大于条件判断 |
| I\_CGE | 0x0050 | int32 大于等于条件判断 |
| I\_CL | 0x0051 | int32 小于条件判断 |
| I\_CLE | 0x0052 | int32 小于等于条件判断 |
---
### Long64 区域0x0060-0x007F
| 指令名 | 十六进制 | 说明 |
|----------|--------|-----------------|
| L\_ADD | 0x0060 | long64 加法 |
| L\_SUB | 0x0061 | long64 减法 |
| L\_MUL | 0x0062 | long64 乘法 |
| L\_DIV | 0x0063 | long64 除法 |
| L\_MOD | 0x0064 | long64 取余 |
| L\_NEG | 0x0065 | long64 取负 |
| L\_INC | 0x0066 | long64 自增 |
| L\_AND | 0x0067 | long64 按位与 |
| L\_OR | 0x0068 | long64 按位或 |
| L\_XOR | 0x0069 | long64 按位异或 |
| L\_PUSH | 0x006A | long64 入栈 |
| L\_LOAD | 0x006B | long64 本地变量加载 |
| L\_STORE | 0x006C | long64 本地变量存储 |
| L\_CE | 0x006D | long64 等于条件判断 |
| L\_CNE | 0x006E | long64 不等于条件判断 |
| L\_CG | 0x006F | long64 大于条件判断 |
| L\_CGE | 0x0070 | long64 大于等于条件判断 |
| L\_CL | 0x0071 | long64 小于条件判断 |
| L\_CLE | 0x0072 | long64 小于等于条件判断 |
---
### Float32 区域0x0080-0x009F
| 指令名 | 十六进制 | 说明 |
|----------|--------|------------------|
| F\_ADD | 0x0080 | float32 加法 |
| F\_SUB | 0x0081 | float32 减法 |
| F\_MUL | 0x0082 | float32 乘法 |
| F\_DIV | 0x0083 | float32 除法 |
| F\_MOD | 0x0084 | float32 取余 |
| F\_NEG | 0x0085 | float32 取负 |
| F\_INC | 0x0086 | float32 自增 |
| F\_PUSH | 0x0087 | float32 入栈 |
| F\_LOAD | 0x0088 | float32 本地变量加载 |
| F\_STORE | 0x0089 | float32 本地变量存储 |
| F\_CE | 0x008A | float32 等于条件判断 |
| F\_CNE | 0x008B | float32 不等于条件判断 |
| F\_CG | 0x008C | float32 大于条件判断 |
| F\_CGE | 0x008D | float32 大于等于条件判断 |
| F\_CL | 0x008E | float32 小于条件判断 |
| F\_CLE | 0x008F | float32 小于等于条件判断 |
---
### Double64 区域0x00A0-0x00BF
| 指令名 | 十六进制 | 说明 |
|----------|--------|-------------------|
| D\_ADD | 0x00A0 | double64 加法 |
| D\_SUB | 0x00A1 | double64 减法 |
| D\_MUL | 0x00A2 | double64 乘法 |
| D\_DIV | 0x00A3 | double64 除法 |
| D\_MOD | 0x00A4 | double64 取余 |
| D\_NEG | 0x00A5 | double64 取负 |
| D\_INC | 0x00A6 | double64 自增 |
| D\_PUSH | 0x00A7 | double64 入栈 |
| D\_LOAD | 0x00A8 | double64 本地变量加载 |
| D\_STORE | 0x00A9 | double64 本地变量存储 |
| D\_CE | 0x00AA | double64 等于条件判断 |
| D\_CNE | 0x00AB | double64 不等于条件判断 |
| D\_CG | 0x00AC | double64 大于条件判断 |
| D\_CGE | 0x00AD | double64 大于等于条件判断 |
| D\_CL | 0x00AE | double64 小于条件判断 |
| D\_CLE | 0x00AF | double64 小于等于条件判断 |
---
## Type Conversion (0x00C0-0x00DF)
| 指令名 | 十六进制 | 说明 |
|-----|--------|--------------------|
| B2S | 0x00C0 | byte8 转 short16 |
| B2I | 0x00C1 | byte8 转 int32 |
| B2L | 0x00C2 | byte8 转 long64 |
| B2F | 0x00C3 | byte8 转 float32 |
| B2D | 0x00C4 | byte8 转 double64 |
| S2B | 0x00C5 | short16 转 byte8 |
| S2I | 0x00C6 | short16 转 int32 |
| S2L | 0x00C7 | short16 转 long64 |
| S2F | 0x00C8 | short16 转 float32 |
| S2D | 0x00C9 | short16 转 double64 |
| I2B | 0x00CA | int32 转 byte8 |
| I2S | 0x00CB | int32 转 short16 |
| I2L | 0x00CC | int32 转 long64 |
| I2F | 0x00CD | int32 转 float32 |
| I2D | 0x00CE | int32 转 double64 |
| L2B | 0x00CF | long64 转 byte8 |
| L2S | 0x00D0 | long64 转 short16 |
| L2I | 0x00D1 | long64 转 int32 |
| L2F | 0x00D2 | long64 转 float32 |
| L2D | 0x00D3 | long64 转 double64 |
| F2B | 0x00D4 | float32 转 byte8 |
| F2S | 0x00D5 | float32 转 short16 |
| F2I | 0x00D6 | float32 转 int32 |
| F2L | 0x00D7 | float32 转 long64 |
| F2D | 0x00D8 | float32 转 double64 |
| D2B | 0x00D9 | double64 转 byte8 |
| D2S | 0x00DA | double64 转 short16 |
| D2I | 0x00DB | double64 转 int32 |
| D2L | 0x00DC | double64 转 long64 |
| D2F | 0x00DD | double64 转 float32 |
---
## Reference Control (0x00E0-0x00EF)
| 指令名 | 十六进制 | 说明 |
|----------|--------|---------------------------|
| R\_PUSH | 0x00E0 | 将对象引用压入操作数栈 |
| R\_LOAD | 0x00E1 | 从本地变量表加载对象引用并压入操作数栈 |
| R\_STORE | 0x00E2 | 将操作数栈顶的对象引用弹出并存入本地变量表指定槽位 |
## Stack Control (0x0100-0x01FF)
| 指令名 | 十六进制 | 说明 |
|------|--------|----------|
| POP | 0x0100 | 弹出栈顶元素 |
| DUP | 0x0101 | 复制栈顶元素 |
| SWAP | 0x0102 | 交换栈顶前两元素 |
---
## Flow Control (0x0200-0x02FF)
| 指令名 | 十六进制/十进制 | 说明 |
|------|----------|-------|
| JUMP | 0x0200 | 无条件跳转 |
| CALL | 0x0201 | 子程序调用 |
| RET | 0x0202 | 子程序返回 |
---
## Register Control (0x0300-0x03FF)
| 指令名 | 十六进制 | 说明 |
|-----|--------|---------|
| MOV | 0x0300 | 局部变量间赋值 |
---
## System Control (0x0400-0x04FF)
| 指令名 | 十六进制 | 说明 |
|-------------|--------|------|
| HALT | 0x0400 | 程序终止 |
| SYSCALL | 0x0401 | 系统调用 |
| DEBUG\_TRAP | 0x0402 | 调试断点 |