19.3.4. ASL 宏
ASL 编译器支持内建宏,以协助完成各种 ASL 编码操作。这些宏没有对应的 AML 操作码,而是完全由编译器自身处理,并且可能会生成用于其他 ASL/AML 运算符的 AML 操作码。下表列出了一些受支持的指令及其功能说明。
ASL 语言提供了多种数据类型和用于操作数据的运算符。它还提供了在与 ASL 运算符一起使用时,数据类型之间进行显式和隐式转换的机制。
下面描述每一种可用的 ASL 宏。
EISAID (TextID)
将 7 个字符的文本参数转换并压缩为其对应的 4 字节数值 EISA ID 编码(Integer)。这可用于在声明设备 ID 为 EISA ID 的设备时使用。
用于转换 TextID 的算法如以下示例所示:
> 从一个七字符输入字符串“PNP0303”开始,我们希望创建一个 DWordConst。该字符串包含一个三字符制造商代码“PNP”、一个三字符十六进制产品标识符“030”,以及一个单字符修订标识符“3”。 > > 压缩后的制造商代码创建如下: > > 1. 查找每个字母的十六进制 ASCII 值 > > 2. 从每个 ASCII 值中减去 40h > > 3. 对每个字母保留最低有效的 5 位,并丢弃其余的 0: > > 字节 0: > > 位 7:保留(0) > > 位 6-2:压缩制造商代码的第 1 个字符“P” > > 位 1-0:制造商代码第 2 个字符“N”的高 2 位 > > 字节 1: > > 位 7-5:制造商代码第 2 个字符“N”的低 3 位 > > 位 4-0:第 3 个字符“P” > > 字节 2: > > 位 7-4:产品编号的第 1 个十六进制数字“0” > > 位 3-0:产品编号的第 2 个十六进制数字“3” > > 字节 3: > > 位 7-4:产品编号的第 3 个十六进制数字“0” > > 位 3-0:产品编号的第 4 个十六进制数字“3” > >
For(初始化、谓词、更新){TermList}
> 通过将 For() 参数和 TermList 转换为 AML While 循环,实现标准的 For() 循环。
Fprintf(Target、FormatString、FormatArgs)
> 将格式字符串转换为一系列字符串连接操作,并将结果存储到一个命名对象(Target)中。
Printf(FormatString、FormatArgs)
> 将格式字符串转换为一系列字符串连接操作,并自动将结果存储到调试对象中。
ResourceTemplate()
> 用于以人类可读的形式提供即插即用资源描述符信息,然后将其转换为 Resource Template Buffer 对象中适当的二进制即插即用资源描述符编码。有关资源描述符编码的更多信息,(参见:ACPI 的资源数据类型)。
ToPLD(PLDKeywordList)
> 将 PLD(设备的物理位置)关键字列表转换为 _PLD Buffer 对象。
ToUUID(AsciiString)
> 将 ASCII UUID 或 GUID 字符串转换为编码后的 128 位 Buffer 对象。
Unicode(StringData)
> 将标准 ASCII 字符串转换为在 Buffer 对象中返回的 Unicode 字符串。