ACPI 中文文档ACPI 中文文档
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
  • 第 19 章

    • 总览
    • 19.1. ASL 2.0 符号运算符和表达式
    • 19.2. ASL 语言语法
      • 19.2.1. ASL 语法表示法
      • 19.2.2. ASL 名称和路径名项
      • 19.2.3. ASL 根项和次级项
      • 19.2.4. ASL 数据和常量项
      • 19.2.5. ASL 操作码项
      • 19.2.6. ASL 基本(终结)项
        • 19.2.6. ASL 基本(终结)项
        • 19.2.6. ASL 基本(终结)项(续 2)
      • 19.2.7. ASL 参数关键字项
      • 19.2.8. ASL 资源模板项
    • 19.3. ASL 概念
      • 19.3.1. ASL 名称
      • 19.3.2. ASL 字面常量
      • 19.3.3. ASL 资源模板
      • 19.3.4. ASL 宏
      • 19.3.5. ASL 数据类型
    • 19.4. ASL 运算符摘要
    • 19.5. 按类型划分的 ASL 操作符摘要
    • 19.6. ASL 运算符参考
      • 19.6.1. AccessAs(更改字段单元访问)
      • 19.6.2. Acquire(获取互斥量)
      • 19.6.3. Add(整数加法)
      • 19.6.4. Alias(声明名称别名)
      • 19.6.5. And(整数按位与)
      • 19.6.6. Argx(方法参数数据对象)
      • 19.6.7. BankField(声明 Bank/Data 字段)
      • 19.6.8. Break(从 While 中中断)
      • 19.6.9. BreakPoint(执行断点)
      • 19.6.10. Buffer(声明缓冲区对象)
      • 19.6.11. Case(用于条件执行的情况表达式)
      • 19.6.12. Concatenate(连接数据)
      • 19.6.13. ConcatenateResTemplate(连接资源模板)
      • 19.6.14. CondRefOf(有条件地创建对象引用)
      • 19.6.15. Connection(声明字段连接属性)
      • 19.6.16. Continue(继续最内层外围 While)
      • 19.6.17. CopyObject(复制并存储对象)
      • 19.6.18. CreateBitField(创建 1 位缓冲区字段)
      • 19.6.19. CreateByteField(创建 8 位缓冲区字段)
      • 19.6.20. CreateDWordField(创建 32 位缓冲区字段)
      • 19.6.21. CreateField(创建任意长度缓冲区字段)
      • 19.6.22. CreateQWordField(创建 64 位缓冲区字段)
      • 19.6.23. CreateWordField(创建 16 位缓冲区字段)
      • 19.6.24. CSI2Bus(CSI-2 串行总线连接资源描述符宏)
      • 19.6.25. DataTableRegion(创建数据表操作区域)
      • 19.6.26. Debug(调试器输出)
      • 19.6.27. Decrement(整数递减)
      • 19.6.28. Default(Switch 中的默认执行路径)
      • 19.6.29. DefinitionBlock(声明定义块)
      • 19.6.30. DerefOf(解引用对象引用)
      • 19.6.31. Device(声明设备包)
      • 19.6.32. Divide(整数除法)
      • 19.6.33. DMA(DMA 资源描述符宏)
      • 19.6.34. DWordIO(DWord I/O 资源描述符宏)
      • 19.6.35. DWordMemory(DWord 内存资源描述符宏)
      • 19.6.36. DWordSpace(DWord 空间资源描述符宏)
      • 19.6.37. EISAID(EISA ID 字符串到整数转换宏)
      • 19.6.38. Else(替代执行)
      • 19.6.39. ElseIf(替代/条件执行)
      • 19.6.40. EndDependentFn(结束依赖功能资源描述符宏)
      • 19.6.41. Event(声明事件同步对象)
      • 19.6.42. ExtendedIO(扩展 IO 资源描述符宏)
      • 19.6.43. ExtendedMemory(扩展 Memory 资源描述符宏)
      • 19.6.44. ExtendedSpace(扩展地址空间资源描述符宏)
      • 19.6.45. External(声明外部对象)
      • 19.6.46. Fatal(致命错误检查)
      • 19.6.47. Field(声明字段对象)
      • 19.6.48. 查找最左侧置位位
      • 19.6.49. 查找最右侧置位位
      • 19.6.50. FixedDMA(DMA 资源描述符宏)
      • 19.6.51. FixedIO(固定 IO 资源描述符宏)
      • 19.6.52. For(条件循环)
      • 19.6.53. Fprintf(创建并存储格式化字符串)
      • 19.6.54. FromBCD(将 BCD 转换为 Integer)
      • 19.6.55. Function(声明控制方法)
      • 19.6.56. GpioInt(GPIO 中断连接资源描述符宏)
      • 19.6.57. GpioIo(GPIO 连接 IO 资源描述符宏)
      • 19.6.58. I2CSerialBusV2(I2C 串行总线连接资源描述符(版本 2)宏)
      • 19.6.59. If(条件执行)
      • 19.6.60. Include(包含附加 ASL 文件)
      • 19.6.61. Increment(整数递增)
      • 19.6.62. Index(成员对象的索引引用)
      • 19.6.63. IndexField(声明索引/数据字段)
      • 19.6.64. Interrupt(中断资源描述符宏)
      • 19.6.65. IO(IO 资源描述符宏)
      • 19.6.66. IRQ(中断资源描述符宏)
      • 19.6.67. IRQNoFlags(中断资源描述符宏)
      • 19.6.68. LAnd(逻辑与)
      • 19.6.69. LEqual(逻辑等于)
      • 19.6.70. LGreater(逻辑大于)
      • 19.6.71. LGreaterEqual(逻辑大于或等于)
      • 19.6.72. LLess(逻辑小于)
      • 19.6.73. LLessEqual(逻辑小于或等于)
      • 19.6.74. LNot(逻辑非)
      • 19.6.75. LNotEqual(逻辑不等于)
      • 19.6.76. Load(加载定义块)
      • 19.6.77. LoadTable(从 XSDT 加载定义块)
      • 19.6.78. Localx(方法局部数据对象)
      • 19.6.79. LOr(逻辑或)
      • 19.6.80. Match(查找对象匹配)
      • 19.6.81. Memory24(内存资源描述符宏)
      • 19.6.82. Memory32(内存资源描述符宏)
      • 19.6.83. Memory32Fixed(内存资源描述符宏)
      • 19.6.84. Method(声明控制方法)
      • 19.6.85. Mid(提取 Buffer 或 String 的一部分)
      • 19.6.86. Mod(整数取模)
      • 19.6.87. Multiply(整数乘法)
      • 19.6.88. Mutex(声明同步/互斥对象)
      • 19.6.89. Name(声明命名对象)
      • 19.6.90. NAnd(整数按位 NAND)
      • 19.6.91. NoOp Code(空操作)
      • 19.6.92. NOr(整数按位 NOR)
      • 19.6.93. Not(整数按位取反)
      • 19.6.94. Notify(通知对象发生事件)
      • 19.6.95. Offset(更改当前字段单元偏移)
      • 19.6.96. ObjectType(获取对象类型)
      • 19.6.97. One(常量值为一的整数)
      • 19.6.98. Ones(全 1 常量整数)
      • 19.6.99. OperationRegion(声明操作区域)
      • 19.6.100. Or(整数按位或)
      • 19.6.101. Package(声明 Package 对象)
      • 19.6.102. PinConfig(引脚配置描述符宏)
      • 19.6.103. PinFunction(引脚功能描述符宏)
      • 19.6.104. PinGroup(引脚组描述符宏)
      • 19.6.105. PinGroupConfig(引脚组配置描述符宏)
      • 19.6.106. PinGroupFunction(引脚组功能配置描述符宏)
      • 19.6.107. PowerResource(声明电源资源)
      • 19.6.108. Printf(创建并存储格式化字符串)
      • 19.6.109. QWordIO(QWord IO 资源描述符宏)
      • 19.6.110. QWordMemory(QWord Memory 资源描述符宏)
      • 19.6.111. QWordSpace(QWord 空间资源描述符宏)
      • 19.6.112. RawDataBuffer(原始数据缓冲区)
      • 19.6.113. RefOf(创建对象引用)
      • 19.6.114. Register(通用寄存器资源描述符宏)
      • 19.6.115. Release(释放 Mutex 同步对象)
      • 19.6.116. Reset(重置 Event 同步对象)
      • 19.6.117. ResourceTemplate(资源到缓冲区转换宏)
      • 19.6.118. Return(从方法执行中返回)
      • 19.6.119. Revision(常量修订整数)
      • 19.6.120. Scope(打开命名作用域)
      • 19.6.121. ShiftLeft(整数左移)
      • 19.6.122. ShiftRight(整数右移)
      • 19.6.123. Signal(发出同步 Event 信号)
      • 19.6.124. SizeOf(获取数据对象大小)
      • 19.6.125. Sleep(毫秒休眠)
      • 19.6.126. SPISerialBusV2(SPI 串行总线连接资源描述符(版本 2)宏)
      • 19.6.127. Stall(短时间停顿)
      • 19.6.128. StartDependentFn(起始依赖函数资源描述符宏)
      • 19.6.129. StartDependentFnNoPri(起始依赖函数资源描述符宏)
      • 19.6.130. Store(存储对象)
      • 19.6.131. Subtract(整数减法)
      • 19.6.132. Switch(根据表达式选择要执行的代码)
      • 19.6.133. ThermalZone(声明热区)
      • 19.6.134. 定时器(获取 64 位定时器值)
      • 19.6.135. ToBCD(将整数转换为 BCD)
      • 19.6.136. ToBuffer(将数据转换为 Buffer)
      • 19.6.137. ToDecimalString(将数据转换为十进制字符串)
      • 19.6.138. ToHexString(将数据转换为十六进制字符串)
      • 19.6.139. ToInteger(将数据转换为整数)
      • 19.6.140. ToPLD(创建 _PLD Buffer 对象)
      • 19.6.141. ToString(将 Buffer 转换为 String)
      • 19.6.142. ToUUID(将字符串转换为 UUID 宏)
      • 19.6.143. UARTSerialBusV2(UART 串行总线连接资源描述符版本 2 宏)
      • 19.6.144. Unicode(字符串到 Unicode 转换宏)
      • 19.6.145. VendorLong(长厂商资源描述符)
      • 19.6.146. VendorShort(短厂商资源描述符)
      • 19.6.147. Wait(等待同步事件)
      • 19.6.148. While(条件循环)
      • 19.6.149. WordBusNumber(Word 总线编号资源描述符宏)
      • 19.6.150. WordIO(Word IO 资源描述符宏)
      • 19.6.151. WordSpace(Word Space 资源描述符宏)
      • 19.6.152. XOr(整数按位异或)
      • 19.6.153. Zero(常量零整数)

19.3.5. ASL 数据类型

ASL 提供了多种多样的数据类型和用于操作数据的运算符。它还提供了在与 ASL 运算符一起使用时,在这些数据类型之间进行显式和隐式转换的机制。

下表描述了每一种可用的 ASL 数据类型。

表 19.5 ASL 数据类型汇总

ASL 数据类型说明
[Uninitialized]未分配类型或值。这是在方法执行开始时所有控制方法 LocalX 变量和未使用 ArgX 变量的类型,以及所有未初始化 Package 元素的类型。未初始化对象在作为 ASL 表达式中的源操作数使用之前,必须先进行初始化(通过 Store 或 CopyObject)。
Buffer字节数组。未初始化的元素默认为零。
Buffer Field使用 CreateBitField、CreateByteField、CreateWordField、CreateQWordField、CreateField 创建的缓冲区的一部分,或由 Index 运算符返回的部分。
Debug Object调试输出对象。对一个对象进行格式化并将其打印到系统调试端口。如果调试未激活,则没有效果。
Device设备或总线对象
Event事件同步对象
Field Unit (within an Operation Region)地址空间的一部分,按位对齐且粒度为 1 位。使用 Field、BankField 或 IndexField 创建。
Integern 位小端无符号整数。在 ACPI 1.0 中,它是 32 位。在 ACPI 2.0 及更高版本中,它是 64 位。Integer(DWORD)标记表示只有低 32 位有意义,而 64 位整数的高 32 位必须为零(不要求屏蔽高位)。
Integer Constant由 ASL 项“Zero”、“One”、“Ones”和“Revision”创建
Method控制方法(可执行 AML 函数)
Mutex互斥同步对象
Object Reference使用 RefOf、Index 或 CondRefOf 运算符创建的对象引用
Operation RegionOperation Region(地址空间中的一个区域)
Package具有固定元素个数(最多 255 个)的 ASL 对象集合。
Power ResourcePower Resource 描述对象
Processor处理器描述对象
RawDataBuffer字节数组。未初始化的元素默认为零。RawDataBuffer 不包含任何 AML 编码字节,只包含原始字节。
String以空字符结尾的 ASCII 字符串。
Thermal ZoneThermal Zone 描述对象

注意

兼容性说明: 存储和操作对象引用的能力是在 ACPI 2.0 中引入的。在 ACPI 1.0 中,引用不能存储在变量中、作为参数传递,也不能从函数返回。

19.3.5.1. 数据类型转换概述

ASL 提供了两种机制,用于在运行时(AML 解释器执行期间)将对象从一种数据类型转换为另一种数据类型。第一种机制,显式数据类型转换,允许使用显式的 ASL 运算符将对象转换为不同的数据类型。第二种机制,隐式数据类型转换,当需要在数据对象被使用或存储之前将其转换为预期的数据类型时,由 AML 解释器调用。

以下通用规则适用于数据类型转换:

  • 输入参数只要操作数类型与预期输入类型不匹配,就总是要进行隐式数据类型转换(也称为隐式源操作数转换)。

  • 除显式数据转换运算符之外的所有运算符的输出(目标)参数,只要目标是一个现有的命名对象或命名字段,并且其类型与要存储的对象不同,就要进行隐式数据类型转换(也称为隐式结果对象转换)。

  • 显式数据转换运算符的输出参数,以及引用方法局部变量或参数(LocalX 或 ArgX)的输出参数,不进行隐式类型转换。

这两种机制(显式和隐式转换)都将在后续章节中详细描述。

19.3.5.2. 显式数据类型转换

以下 ASL 运算符用于显式地将对象从一种数据类型转换为另一种:

ToBuffer

> 将 Integer、String 或 Buffer 转换为 Buffer 类型对象

ToDecimalString

> 将 Integer、String 或 Buffer 转换为 String 类型对象。该字符串包含源操作数十进制值的 ASCII 表示。

ToHexString

> 将 Integer、String 或 Buffer 转换为 String 类型对象。该字符串包含源操作数十六进制值的 ASCII 表示。

ToInteger

> 将 Integer、String 或 Buffer 转换为 Integer 类型对象。

ToString

> 直接复制并将 Buffer 转换为 String 类型对象。

以下 ASL 运算符用于复制和传输对象,并执行显式结果转换,使目标的类型与源对象的类型匹配:

CopyObject

> 显式地将操作数对象的副本存储到目标名称中。不执行隐式类型转换。(此运算符用于避免 ASL Store 运算符固有的隐式转换。)

19.3.5.3. 隐式数据类型转换

在执行 ASL 运算符期间,自动或隐式类型转换可能在两个不同时间发生。首先,可能需要将一个或多个源操作数转换为 ASL 运算符所期望的数据类型。其次,操作结果在存储到目标之前可能需要进行转换。(许多 ASL 运算符可以选择性地将其结果存储到由最后一个参数指定的对象中。对于这些运算符,如果指定了目标,则该行为与使用 Store 运算符将结果放入目标中的效果完全相同。)

这类数据转换由 AML 解释器在执行 AML 代码期间执行,统称为隐式操作数转换。如上文简要描述,隐式操作数转换有两种不同类型:

  1. 将源操作数从不匹配的数据类型转换为 ASL 运算符所需的正确数据类型,称为隐式源转换。当源操作数必须转换为运算符所期望的操作数类型时,会发生此转换。在 ASL 运算符能够继续执行之前,任意一个或所有源操作数都可能以这种方式被转换。

  2. 在操作结果存储到目标操作数之前,将其转换为目标操作数的现有类型,称为隐式结果转换。当目标是固定类型(例如命名对象或字段)时,会发生此转换。当存储到方法 Local 或 Arg 时,不执行也不需要转换,因为这些数据类型是可变类型(存储操作只是简单地覆盖任何现有对象及其现有类型)。

以下 ASL 运算符用于复制和传输对象,并对目标对象的现有类型执行隐式结果转换:

Store

> 将操作数对象的副本存储到目标名称中。如果目标名称是固定数据类型,则执行隐式结果转换(见上文)。但是,存储到方法局部变量和参数时不执行隐式转换,因此与使用 CopyObject 相同。

19.3.5.4. 隐式源操作数转换

在执行 ASL 运算符期间,每个源操作数由 AML 解释器按如下方式处理:

  • 如果操作数的类型正是运算符所期望的类型,则不需要转换。

  • 如果操作数类型不正确,则尝试将其转换为正确类型。

  • 对于 Concatenate 运算符和逻辑运算符(LEqual、LGreater、LGreaterEqual、LLess、LLessEqual 和 LNotEqual),第一个操作数的数据类型决定第二个操作数所需的类型,并且仅对 Concatenate 而言,还决定结果对象的类型。(如有必要,第二个操作数将被隐式转换,以匹配第一个操作数的类型。)

  • 如果无法转换,则中止正在运行的控制方法并发出致命错误。

每当源操作数包含的数据类型与运算符所期望的类型不同时,都会尝试进行隐式源转换。例如:

Store ("5678", Local1)
Add (0x1234, Local1, BUF1)

在上面的 Add 语句中,Local1 包含一个 String 对象,因此在 Add 操作继续之前,必须先将其转换为 Integer 对象。

在某些情况下,运算符可以接受多种类型的操作数(例如 Integer 和 String)。在这种情况下,将根据操作数的类型应用最高优先级的转换。下表描述了可用的源操作数转换。例如:

Store (Buffer (1) {}, Local0)
Name (ABCD, Buffer (10) {1, 2, 3, 4, 5, 6, 7, 8, 9, 0})
CreateDWordField (ABCD, 2, XYZ)
Name (MNOP, "1234")
Concatenate (XYZ, MNOP, Local0)

Concatenate 运算符的前两个参数可以接受 Integer、Buffer 或 String,而第一个参数的类型决定第二个参数将如何转换。在此示例中,第一个参数的类型是 Buffer Field(来自 CreateDWordField 运算符)。它应当被转换为什么:Integer、Buffer 还是 String?根据“对象转换规则”表,最高优先级的转换是 Integer。因此,以下两个对象都将被转换为 Integer:

XYZ (0x05040302)
MNOP (0x31, 0x32, 0x33, 0x34)

并且随后会被连接在一起,生成的类型和值将为:

Buffer (0x02, 0x03, 0x04, 0x05, 0x31, 0x32, 0x33, 0x34)

19.3.5.5. 隐式结果对象转换

对于所有会生成并存储结果值的 ASL 运算符(包括 Store 运算符),结果对象由 AML 解释器按如下方式处理和存储:

  • 如果 ASL 运算符是显式转换运算符之一(ToString、ToInteger 等,以及 CopyObject 运算符),则不执行转换。(换句话说,结果对象会直接存储到目标中,并且会完全覆盖目标中已存储的任何现有对象。)

  • 如果目标是方法局部变量或参数(LocalX 或 ArgX),则不执行转换,结果会直接存储到目标中。

  • 如果目标是固定类型,例如命名对象或字段对象,则在存储之前会尝试将源转换为现有目标类型。

  • 如果无法转换,则中止正在运行的控制方法并发出致命错误。

当运算符的结果被存储到固定类型对象中时,任何时候都可能发生隐式结果转换。例如:

Name (BUF1, Buffer (10))
Add (0x1234, 0x789A, BUF1)

由于 BUF1 是固定类型的 Buffer 命名对象,因此在将 Add 操作的 Integer 结果存储到 BUF1 之前,必须先将其转换为 Buffer。

19.3.5.6. 数据类型和类型转换

下表列出了可用的 ASL 数据类型,以及每种数据类型可用的数据类型转换(如果有)。每种数据类型的条目都进行了完整的交叉引用,同时显示该对象可以转换到的类型,以及所有其他可以转换为该数据类型的类型。

允许的转换同时适用于显式转换和隐式转换。

表 19.6 数据类型和类型转换

ASL 数据类型可隐式或显式转换为这些数据类型(按优先顺序)可从这些数据类型隐式或显式转换而来
[未初始化]无。作为任何 ASL 语句中的源操作数使用时会导致致命错误。Integer, String, Buffer, Package, Object Reference
BufferInteger, String, Debug ObjectInteger, String
Buffer FieldInteger, Buffer, String, Debug ObjectInteger, Buffer, String
Debug Object无。作为任何 ASL 语句中的源操作数使用时会导致致命错误。Integer, String, Buffer, Package, Field Unit, Buffer Field
Device无无
Event无无
Field Unit(位于 Operation Region 中)Integer, Buffer, String, Debug ObjectInteger, Buffer, String
IntegerBuffer, Buffer Field, Field Unit, String, Debug ObjectBuffer, String
Integer ConstantInteger, Debug Object无。并且,将任何对象存储到常量都是无操作,不是错误。
Method无无
Mutex无无
Object Reference无无
Operation Region无无
PackageDebug Object无
StringInteger, Buffer, Debug ObjectInteger, Buffer
Power Resource无无
RawDataBuffer无无
Thermal Zone无无

19.3.5.7. 数据类型转换规则

下表给出了每种允许的数据类型转换的详细数据转换规则。这些转换规则由 AML 解释器实现,并适用于所有转换类型——显式转换、隐式源转换以及隐式结果转换。

表 19.7 对象转换规则

从此数据类型的对象转换到此数据类型的对象AML 解释器执行的操作
BufferBuffer Field缓冲区的内容会被复制到 Buffer Field 中。如果缓冲区小于缓冲字段的大小,则进行零扩展。如果缓冲区大于缓冲字段的大小,则截断高位。兼容性说明:此转换最早在 ACPI 2.0 中引入。在 ACPI 1.0 中其行为未定义。
BufferDebug Object每个缓冲区字节都显示为十六进制整数,以空格和/或逗号分隔。
BufferField Unit缓冲区的全部内容会被复制到 Field Unit 中。如果缓冲区的大小(按位计)大于 Field Unit 的大小,则将其分成若干片段并完整写入 Field Unit,低位片段优先。如果缓冲区(或分段后的最后一段)小于 Field Unit 的大小,则在写入之前进行零扩展。
BufferInteger如果不存在整数对象,则创建一个新的整数。缓冲区的内容会被复制到 Integer 中,从最低有效位开始,持续复制直到缓冲区被完全复制——最多不超过 Integer 的最大位数。Integer 的大小由 Definition Block 表头中的 Revision 字段指示。Revision 字段值小于 2 表示 Integer 的大小为 32 位。大于或等于 2 的值表示 Integer 的大小为 64 位。如果缓冲区小于整数大小,则进行零扩展。如果缓冲区大于整数大小,则进行截断。不允许将零长度缓冲区转换为整数。
BufferString如果不存在字符串对象,则创建一个新的字符串。如果字符串已存在,则将其完全覆盖,并按需要截断或扩展,以精确容纳转换后的缓冲区。缓冲区的全部内容会被转换为由两个字符组成的十六进制数字字符串,每个数字之间用一个空格分隔。零长度缓冲区将被转换为空(零长度)字符串。
Buffer Field[参见 Integer 和 Buffer 规则]如果 Buffer Field 小于或等于 Integer 的大小(按位计),则将其视为 Integer。否则,将其视为缓冲区。Integer 的大小由 Definition Block 表头中的 Revision 字段指示。Revision 字段值小于 2 表示 Integer 的大小为 32 位。大于或等于 2 的值表示 Integer 的大小为 64 位。(参见 Integer 和 Buffer 数据类型的转换规则。)
Field Unit[参见 Integer 和 Buffer 规则]如果 Field Unit 小于或等于 Integer 的大小(按位计),则将其视为 Integer。如果 Field Unit 大于 Integer 的大小,则将其视为 Buffer。Integer 的大小由 Definition Block 表头中的 Revision 字段指示。Revision 字段值小于 2 表示 Integer 的大小为 32 位。大于或等于 2 的值表示 Integer 的大小为 64 位。(参见 Integer 和 Buffer 数据类型的转换规则。)
IntegerBuffer如果不存在缓冲区对象,则根据整数的大小创建一个新的缓冲区对象(32 位整数为 4 字节,64 位整数为 8 字节)。如果缓冲区对象已存在,则 Integer 会覆盖整个 Buffer 对象。如果该整数所需位数大于 Buffer 的大小,则在复制到 Buffer 之前先截断该整数。如果该整数包含的位数少于缓冲区的大小,则对 Integer 进行零扩展以填满整个缓冲区。
IntegerBuffer FieldInteger 会覆盖整个 Buffer Field。如果整数小于缓冲字段的大小,则进行零扩展。如果整数大于缓冲字段的大小,则截断高位。兼容性说明:此转换最早在 ACPI 2.0 中引入。在 ACPI 1.0 中其行为未定义。
IntegerDebug Object该整数显示为十六进制值。
IntegerField UnitInteger 会覆盖整个 Field Unit。如果整数小于缓冲字段的大小,则进行零扩展。如果整数大于缓冲字段的大小,则截断高位。
IntegerString如果不存在字符串对象,则根据整数的大小创建一个新的字符串对象(32 位整数为 8 个字符,64 位整数为 16 个字符)。如果字符串已存在,则将其完全覆盖,并按需要截断或扩展,以精确容纳转换后的整数。无论哪种情况,整个整数都会被转换为十六进制 ASCII 字符串。
PackagePackage如果不存在 Package 对象,则创建一个新的 Package 对象。如果 Package 已存在,则将其完全覆盖,并按需要截断或扩展,以精确容纳源 Package。目标 Package 中任何及所有现有的有效(非空)包元素都会被删除,并将源 Package 的全部内容复制到目标 Package 中。
PackageDebug ObjectPackage 的每个元素都根据其类型显示。
StringBuffer如果不存在缓冲区对象,则创建一个新的缓冲区对象。如果缓冲区对象已存在,则将其完全覆盖。如果字符串长于缓冲区,则在复制之前截断字符串。如果字符串短于缓冲区,则将缓冲区剩余字节置零。无论哪种情况,字符串都被视为缓冲区,其中每个 ASCII 字符串字符都复制到一个缓冲区字节中,包括空终止符。空(零长度)字符串将被转换为零长度缓冲区。
StringBuffer Field字符串被视为缓冲区。如果该缓冲区小于缓冲字段的大小,则进行零扩展。如果缓冲区大于缓冲字段的大小,则截断高位。兼容性说明:此转换最早在 ACPI 2.0 中引入。在 ACPI 1.0 中其行为未定义。
StringDebug Object每个字符串字符都显示为 ASCII 字符。
StringField Unit字符串的每个字符都会从第一个开始写入 Field Unit。如果 Field Unit 小于八位,则每个字符的高位都会丢失。如果 Field Unit 大于八位,则附加位会被置零。
StringInteger如果不存在整数对象,则创建一个新的整数。整数初始化为值零,并将 ASCII 字符串解释为十六进制常量。每个字符串字符都被解释为十六进制值(‘0’-‘9’、‘A’-‘F’、‘a’-‘f’),从第一个字符作为最高有效数字开始,直到遇到第一个非十六进制字符、字符串结束,或达到整数大小为止(32 位整数为 8 个字符,64 位整数为 16 个字符)。注意:第一个非十六进制字符会无错误地终止转换,并且不允许使用“0x”前缀。不允许将空(零长度)字符串转换为整数。

19.3.5.8. 存储和复制对象的规则

下表列出了将对象存储到不同类型命名目标时执行的操作。ASL 提供以下类型的“存储”操作:

  • Store 运算符用于将对象显式存储到某个位置,并支持源对象的隐式转换。

  • 许多 ASL 运算符可以选择性地将其结果存储到由最后一个参数指定的对象中。在这些运算符中,如果指定了目标,则该操作与使用 Store 运算符将结果放入目标完全相同。

  • CopyObject 运算符用于将对象的副本显式存储到某个位置,不支持隐式转换。

表 19.8 对象存储和复制规则

当把任意数据类型的对象存储到这种类型的目标位置时此操作由 Store 运算符或任何带有目标操作数的 ASL 运算符执行此操作由 CopyObject 运算符执行
方法 ArgX 变量对象被复制到目标位置,不进行转换,但有一个例外。如果 ArgX 包含一个对象引用,则会发生自动解引用,并且对象会被复制到对象引用的目标,而不是覆盖 ArgX 的内容。对象被复制到目标位置,不进行转换,但有一个例外。如果 ArgX 包含一个对象引用,则会发生自动解引用,并且对象会被复制到对象引用的目标,而不是覆盖 ArgX 的内容。
方法 LocalX 变量对象被复制到目标位置,不进行转换。即使 LocalX 包含一个对象引用,它也会被覆盖。对象被复制到目标位置,不进行转换。即使 LocalX 包含一个对象引用,它也会被覆盖。
Field Unit 或 BufferField在应用隐式结果转换后,对象被复制到目标位置。Field 将永久保持其类型,不能被更改。因此,CopyObject 只能用于将 Integer 或 Buffer 类型的对象复制到字段。
命名数据对象在应用隐式结果转换以匹配命名位置现有类型后,对象被复制到目标位置。对象及其类型被复制到命名位置。

19.3.5.8.1. ArgX 对象

  1. 从 ArgX 参数读取

> * 对象引用 - 自动解引用,返回引用的目标。使用 DeRefOf 返回相同结果。 > > * Buffer - 返回 Buffer。可以创建指向该缓冲区的 Index、Field 或引用。 > > * Package - 返回 Package。可以创建指向该包的 Index 或引用。 > > * 所有其他对象类型 - 返回该对象。 > >

下表的方法调用示例:

MTHD (RefOf (Obj), Buf, Pkg, Obj)

表 19.9 从 ArgX 对象读取

参数MTHD ArgX 类型对 ArgX 的读取操作读取结果
RefOf (Obj),对象 Obj 的引用Store (Arg0, …)Obj
""CopyObject (Arg0, …)Obj
""DeRefOf (Arg0)Obj
Buf,BufferStore (Arg1, ..)Buf
""CopyObject (Arg1, …)Buf
""Index (Arg1, …)Index (Buf)
""Field (Arg1, …)Field (Buf)
PkgPackageStore (Arg2, …)Pkg
""CopyObject (Arg2, …)Pkg
""Index (Arg2, …)Index (Pkg)
Obj所有其他对象类型Store (Arg3, …)Obj
""CopyObject (Arg3, …)Obj
  1. 存储到 ArgX 参数

    • 对象引用对象 - 自动解引用,复制该对象并覆盖最终目标。

    • 所有其他对象类型 - 复制该对象并覆盖 ArgX 变量。(对 Buffer 或 Package ArgX 参数的直接写入也只会简单地覆盖 ArgX)

表 19.10 写入 ArgX 对象

ArgX 的当前类型要写入的对象对 ArgX 的写入操作写入结果(在 ArgX 中)
RefOf (OldObj)Obj(任意类型)Store (…, ArgX)RefOf (Obj 的副本)
""CopyObject (…, ArgX)RefOf (Obj 的副本)
所有其他对象类型Obj(任意类型)Store (…, ArgX)Obj 的副本
""CopyObject (…, ArgX)Obj 的副本

注

RefOf (ArgX) 返回对 ArgX 的引用。

19.3.5.8.2. LocalX 对象

  1. 从 LocalX 变量读取

> * 对象引用 - 如果执行的是 DeRefOf,则返回引用的目标。否则,返回该引用。 > > * 所有其他对象类型 - 返回该对象 > >

表 19.11 从 LocalX 对象读取

当前 LocalX 类型对 LocalX 的读取操作读取结果
RefOf (Obj)Store (LocalX, …)RefOf (Obj)
"CopyObject (LocalX, …)RefOf (Obj)
"DeRefOf (LocalX)Obj
Obj(所有其他类型)Store (LocalX, …)Obj
"CopyObject (LocalX, …)Obj
  1. 存储到 LocalX 变量

    • 所有对象类型 - 首先删除 LocalX 中任何现有对象,然后存储该对象的一个副本。

表 19.12 写入 LocalX 对象

当前 LocalX 类型要写入的对象对 LocalX 的写入操作写入结果(在 LocalX 中)
所有对象类型Obj(任意类型)Store (…, LocalX)Obj 的副本
""CopyObject (…, LocalX)Obj 的副本

19.3.5.8.3. 命名对象

  1. 从命名对象读取

    • 对象引用 - 如果执行的是 DeRefOf,则返回引用的目标。否则,返回该引用。

    • 所有其他对象类型 - 返回该对象

表 19.13 从命名对象读取

当前 NAME 类型对 NAME 的读取操作读取结果
RefOf (Obj)Store (NAME, …)RefOf (Obj)
"CopyObject (NAME, …))RefOf (Obj)
"DeRefOf (NAME)Obj
Obj(所有其他类型)Store (NAME, …)Obj
"CopyObject (NAME, …)Obj
  1. 存储到命名对象

    • 所有对象类型 - 首先删除 NAME 中任何现有对象,然后存储该对象的一个副本。Store 运算符将执行到 NAME 中现有类型的隐式转换。CopyObject 不执行隐式存储。

表 19.14 写入命名对象

当前 NAME 类型要写入的对象对 NAME 的写入操作写入结果(在 NAME 中)
任意(任意类型)Obj(任意类型)Store (…, NAME)Obj 的副本(已转换以匹配 NAME 的现有类型)
""CopyObject (…, NAME)Obj 的副本(无转换)
Prev
19.3.4. ASL 宏