// Author: simon // Author: ynwdlxm@163.com // Date: 2024/4/14 15:44 // Desc: 指令解码 package vm const MAXARG_Bx = 1<<18 - 1 // 2^18 - 1 = 262143 const MAXARG_sBx = MAXARG_Bx >> 1 type Instruction uint32 // Opcode 提取操作码,后 6 位 func (i Instruction) Opcode() int { return int(i & 0X3F) } // ABC 从 iABC 模式指令中提取参数 func (i Instruction) ABC() (a, b, c int) { a = int(i >> 6 & 0XFF) b = int(i >> 14 & 0X1FF) c = int(i >> 23 & 0x1FF) return } // ABx 从 iABx 模式指令中提取参数 func (i Instruction) ABx() (a, bx int) { a = int(i >> 6 & 0XFF) bx = int(i >> 14) return } // AsBx 从 iAsBx 模式指令中提取参数 func (i Instruction) AsBx() (a, sbx int) { a, bx := i.ABx() // sbx 有符号数 return a, bx - MAXARG_sBx } // Ax 从 iAx 模式指令中提取参数 func (i Instruction) Ax() int { return int(i >> 6) } func (i Instruction) OpName() string { return opcodes[i.Opcode()].name } func (i Instruction) OpMode() byte { return opcodes[i.Opcode()].opMode } func (i Instruction) BMode() byte { return opcodes[i.Opcode()].argBMode } func (i Instruction) CMode() byte { return opcodes[i.Opcode()].argCMode }