AML语法(二)

158 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

一、主要分类

AML的编码主要有表和表头编码、名称对象编码、数据对象编码、包长度编码等等。这次分享包长度编码以及术语对象编码的部分。

二、包长度编码

包长度编码的示例如下:


PkgLength := PkgLeadByte |
<PkgLeadByte ByteData> |
<PkgLeadByte ByteData ByteData> |
<PkgLeadByte ByteData ByteData ByteData>
PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)>
<bit 5-4: Only used if PkgLength < 63>
<bit 3-0: Least significant package length nybble>


注意:第一个字节的高2位显示了PkgLength中有多少个后续字节。如果PkgLength只有一个字节,那么第0到5位将用于编码包的长度(换句话说,值为0-63)。如果包的长度值超过63,则必须使用一个以上的字节进行编码。在这种情况下,PkgLeadByte的第4位和第5位是保留的,必须为零。如果使用多字节编码,PkgLeadByte的第0-3位将成为包装长度中最不重要的4位。 PkgLeadByte的第0-3位将成为软件包长度值中最不重要的4位。下一个ByteData将成为下一个所得值中最不重要的8位,以此类推,最多三个ByteData字节。因此,最大的包长度为2**28。

三、术语对象编码

术语对象编码示例如下:

TermObj := NameSpaceModifierObj | NamedObj | Type1Opcode | Type2Opcode
TermList := Nothing | <TermObj TermList>
TermArg := Type2Opcode | DataObject | ArgObj | LocalObj
UserTermObj := NameString TermArgList
TermArgList := Nothing | <TermArg TermArgList>
ObjectList := Nothing | <Object ObjectList>
Object := NameSpaceModifierObj | NamedObj

术语对象编码以下四种:分别为已命名空间修改器对象编码,已命名对象编码,类型1操作码编码,类型2操作码编码。这里先示例一个命名空间修改器对象编码,其余三种请看下文。

3.1 命名空间修改器对象的编码

NameSpaceModifierObj := DefAlias | DefName | DefScope
DefAlias := AliasOp NameString NameString
AliasOp := 0x06
DefName := NameOp NameString DataRefObject
NameOp := 0x08
DefScope := ScopeOp PkgLength NameString TermList
ScopeOp := 0x10

四、完结

本章未完,待续,。