持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
简介
这一篇文章主要什么是类型2操作码的编码以及杂项对象的编码方法。
一、术语对象编码
在上一篇中主要是对“术语对象编码”中的“命名空间修改器对象编码”,这里我们来看看什么是“类型2操作码的编码”。
类型2操作码的编码
下面是类型2操作码编码的程序示例:
Type2Opcode := DefAcquire | DefAdd | DefAnd | DefBuffer | DefConcat |
DefConcatRes | DefCondRefOf | DefCopyObject | DefDecrement |
DefDerefOf | DefDivide | DefFindSetLeftBit | DefFindSetRightBit |
DefFromBCD | DefIncrement | DefIndex | DefLAnd | DefLEqual |
DefLGreater | DefLGreaterEqual | DefLLess | DefLLessEqual | DefMid |
DefLNot | DefLNotEqual | DefLoadTable | DefLOr | DefMatch | DefMod |
DefMultiply | DefNAnd | DefNOr | DefNot | DefObjectType | DefOr |
DefPackage | DefVarPackage | DefRefOf | DefShiftLeft | DefShiftRight |
DefSizeOf | DefStore | DefSubtract | DefTimer | DefToBCD | DefToBuffer |
DefToDecimalString | DefToHexString | DefToInteger | DefToString |
DefWait | DefXOr | UserTermObj
Type6Opcode := DefRefOf | DefDerefOf | DefIndex | UserTermObj
DefAcquire := AcquireOp MutexObject Timeout
AcquireOp := ExtOpPrefix 0x23
Timeout := WordData
DefAdd := AddOp Operand Operand Target
AddOp := 0x72
Operand := TermArg => Integer
DefAnd := AndOp Operand Operand Target
AndOp := 0x7B
DefBuffer := BufferOp PkgLength BufferSize ByteList
BufferOp := 0x11
BufferSize := TermArg => Integer
DefConcat := ConcatOp Data Data Target
ConcatOp := 0x73
Data := TermArg => ComputationalData
DefConcatRes := ConcatResOp BufData BufData Target
ConcatResOp := 0x84
BufData := TermArg => Buffer
DefCondRefOf := CondRefOfOp SuperName Target
CondRefOfOp := ExtOpPrefix 0x12
DefCopyObject := CopyObjectOp TermArg SimpleName
CopyObjectOp := 0x9D
DefDecrement := DecrementOp SuperName
DecrementOp := 0x76
DefDerefOf := DerefOfOp ObjReference
DerefOfOp := 0x83
ObjReference := TermArg => ObjectReference | String
DefDivide := DivideOp Dividend Divisor Remainder Quotient
DivideOp := 0x78
Dividend := TermArg => Integer
Divisor := TermArg => Integer
Remainder := Target
Quotient := Target
DefFindSetLeftBit := FindSetLeftBitOp Operand Target
FindSetLeftBitOp := 0x81
DefFindSetRightBit := FindSetRightBitOp Operand Target
FindSetRightBitOp := 0x82
DefFromBCD := FromBCDOp BCDValue Target
FromBCDOp := ExtOpPrefix 0x28
BCDValue := TermArg => Integer
DefIncrement := IncrementOp SuperName
IncrementOp := 0x75
DefIndex := IndexOp BuffPkgStrObj IndexValue Target
IndexOp := 0x88
BuffPkgStrObj := TermArg => Buffer, Package or String
IndexValue := TermArg => Integer
DefLAnd := LandOp Operand Operand
LandOp := 0x90
DefLEqual := LequalOp Operand Operand
LequalOp := 0x93
DefLGreater := LgreaterOp Operand Operand
LgreaterOp := 0x94
DefLGreaterEqual := LgreaterEqualOp Operand Operand
LgreaterEqualOp := LnotOp LlessOp
DefLLess := LlessOp Operand Operand
LlessOp := 0x95
DefLLessEqual := LlessEqualOp Operand Operand
LlessEqualOp := LnotOp LgreaterOp
DefLNot := LnotOp Operand
LnotOp := 0x92
DefLNotEqual := LnotEqualOp Operand Operand
LnotEqualOp := LnotOp LequalOp
DefLoadTable := LoadTableOp TermArg TermArg TermArg TermArg TermArg TermArg
LoadTableOp := ExtOpPrefix 0x1F
DefLOr := LorOp Operand Operand
LorOp := 0x91
DefMatch := MatchOp SearchPkg MatchOpcode Operand MatchOpcode Operand StartIndex
MatchOp := 0x89
SearchPkg := TermArg => Package
MatchOpcode := ByteData
StartIndex := TermArg => Integer
DefMid := MidOp MidObj TermArg TermArg Target
MidOp := 0x9E
MidObj := TermArg => Buffer | String
DefMod := ModOp Dividend Divisor Target
ModOp := 0x85
DefMultiply := MultiplyOp Operand Operand Target
MultiplyOp := 0x77
DefNAnd := NandOp Operand Operand Target
NandOp := 0x7C
DefNOr := NorOp Operand Operand Target
NorOp := 0x7E
DefNot := NotOp Operand Target
NotOp := 0x80
DefObjectType := ObjectTypeOp SuperName
ObjectTypeOp := 0x8E
DefOr := OrOp Operand Operand Target
OrOp := 0x7D
DefPackage := PackageOp PkgLength NumElements PackageElementList
PackageOp := 0x12
DefVarPackage := VarPackageOp PkgLength VarNumElements PackageElementList
VarPackageOp := 0x13
NumElements := ByteData
二、杂项对象的编码
一般杂项对象包括以下三种:
- Arg对象
- 本地对象
- 调试对象
Arg 对象
下面是Arg对象编码的代码示例:
ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op | Arg5Op | Arg6Op
Arg0Op := 0x68
Arg1Op := 0x69
Arg2Op := 0x6A
Arg3Op := 0x6B
Arg4Op := 0x6C
Arg5Op := 0x6D
Arg6Op := 0x6E
本地对象的编码
下面是本地对象编码的代码示例与方法:
LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op
Local0Op := 0x60
Local1Op := 0x61
Local2Op := 0x62
Local3Op := 0x63
Local4Op := 0x64
Local5Op := 0x65
Local6Op := 0x66
Local7Op := 0x67
调试对象的编码
该编码这样使用:
DebugObj := DebugOp
DebugOp := ExtOpPrefix 0x31
三、完结 本章结束,撒花。