19.6.132. Switch(根据表达式选择要执行的代码)
语法 :
Switch (Expression) {CaseTermList}
参数
Expression 是一个 ASL 表达式,其求值结果为 Integer、String 或 Buffer。
描述
Switch、Case 和 Default 语句有助于简化条件和分支代码的创建。Switch 语句将控制转移到所包围的可执行 ASL 代码主体中的某个语句
如果 Case Value 是 Integer、Buffer 或 String,则控制转移到与 Switch(Expression)值匹配的语句。如果 Case Value 是 Package,则只要该包中的任何成员与 Switch(Value)匹配,控制就会转移。Switch 的 CaseTermList 可以包含任意数量的 Case 实例,但在同一个 Switch 语句中,任意两个 Case Value(或者如果 Value 是 Package,则 Value 的任意成员)都不能具有相同的值。
语句体的执行从选定的 TermList 开始,并持续到 TermList 主体结束,或直到 Break 或 Continue 语句将控制转移出该主体。
如果没有任何 Case Value 与 Switch(expression)的值匹配,则执行 Default 语句。如果省略了 Default 语句,并且没有找到匹配的 Case,则不会执行 Switch 主体中的任何语句。最多只能有一个 Default 语句。Default 语句可以出现在 Switch 语句主体中的任何位置。
Case 或 Default 项只能出现在 Switch 语句内部。Switch 语句可以嵌套。(兼容性说明)Switch、Case 和 Default 项首次引入于 ACPI 2.0。不过,它们的实现与 ACPI 1.0 AML 解释器向后兼容。
示例
Switch 语句的使用通常如下所示:
Switch (expression)
{
Case (value) {
Statements executed if Lequal (expression, value)
}
Case (Package () {value, value, value}) {
Statements executed if Lequal (expression, any value in package)
}
Default {
Statements executed if expression does not equal any case constant-expression
}
}
注
编译器说明: 以下示例演示了应如何将 Switch 语句翻译为与 ACPI 1.0 兼容的 AML:
Switch (Add (ABCD( ),1)
{
Case (1) {
...statements1...
}
Case (Package () {4,5,6}) {
...statements2...
}
Default {
...statements3...
}
}
被翻译为:
Name (_T_I, 0) // Create Integer temporary variable for result
While (One)
{
Store (Add (ABCD (), 1), \_T_I)
If (LEqual (_T_I, 1)) {
...statements1...
}
Else {
If (LNotEqual (Match (Package () {4, 5, 6}, MEQ, \_T_I, MTR, 0, 0), Ones)) {
...statements2...
}
Else {
...statements3...
}
Break
}
发出 While (One) 是为了支持在 Switch 语句中使用 Break 和 Continue。由 ASL 编译器发出的临时名称应出现在方法的顶层,因为 Switch 语句可能出现在循环内部,从而尝试多次创建该名称。
注意:如果 ASL 编译器无法确定该表达式的类型,则会生成一条警告,并假定其类型为 Integer。该警告将指出,代码应使用某种类型转换运算符(例如 ToInteger、ToBuffer、ToDecimalString 或 ToHexString)。注意:其中一些运算符是从 ACPI 2.0 开始定义的,因此 ACPI 1.0b 兼容解释器可能不支持它们。
例如:
Switch (ABCD ()) // Cannot determine the type because methods can return anything.
{
...case statements...
}
将生成一条警告以及以下代码:
Name (_T_I, 0)
Store (ABCD (), \_T_I)
要消除此警告,代码应为:
Switch (ToInteger (ABCD ()))
{
...case statements...
}