instruction.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // Author: simon
  2. // Author: ynwdlxm@163.com
  3. // Date: 2024/4/14 15:44
  4. // Desc: 指令解码
  5. package vm
  6. const MAXARG_Bx = 1<<18 - 1 // 2^18 - 1 = 262143
  7. const MAXARG_sBx = MAXARG_Bx >> 1
  8. type Instruction uint32
  9. // Opcode 提取操作码,后 6 位
  10. func (i Instruction) Opcode() int {
  11. return int(i & 0X3F)
  12. }
  13. // ABC 从 iABC 模式指令中提取参数
  14. func (i Instruction) ABC() (a, b, c int) {
  15. a = int(i >> 6 & 0XFF)
  16. b = int(i >> 14 & 0X1FF)
  17. c = int(i >> 23 & 0x1FF)
  18. return
  19. }
  20. // ABx 从 iABx 模式指令中提取参数
  21. func (i Instruction) ABx() (a, bx int) {
  22. a = int(i >> 6 & 0XFF)
  23. bx = int(i >> 14)
  24. return
  25. }
  26. // AsBx 从 iAsBx 模式指令中提取参数
  27. func (i Instruction) AsBx() (a, sbx int) {
  28. a, bx := i.ABx()
  29. // sbx 有符号数
  30. return a, bx - MAXARG_sBx
  31. }
  32. // Ax 从 iAx 模式指令中提取参数
  33. func (i Instruction) Ax() int {
  34. return int(i >> 6)
  35. }
  36. func (i Instruction) OpName() string {
  37. return opcodes[i.Opcode()].name
  38. }
  39. func (i Instruction) OpMode() byte {
  40. return opcodes[i.Opcode()].opMode
  41. }
  42. func (i Instruction) BMode() byte {
  43. return opcodes[i.Opcode()].argBMode
  44. }
  45. func (i Instruction) CMode() byte {
  46. return opcodes[i.Opcode()].argCMode
  47. }