1. ASL基本准则
a) 变量名必须由4个字符组成,第1个字符不能是数字
b) 变量名和函数名不区分大小写
c) Scope和Device都会形成自己的作用域,类似于C++中的namespace和class
d) 所有以”_”开头的函数都是Reserved的,给系统使用,不能给自己的函数起这样的名字
e) ASL中的路径有相对路径和绝对路径之分。其结构有点像文件目录。
f) 对于函数,最多只能传递8个参数(Arg0~Arg7),只能用这8个名字,不能自己起名字
g) 对于局部变量,最多能使用8个变量(Local0~Local7),和函数参数一样,不能自己起名字,而且在使用之前必须手动赋初值。
h) 声明变量时不需要显示声明其类型,这一点不同于C和C++。
2. 数据类型
ASL 常用的几种数据类型
a) Integer – 整数 b) String – 字符串 c) Event -- 事件
d) Buffer -- 数组 e) Package – 对象结合
问:如何获取一个变量的类型?
答:使用函数
ObjectType(Obj)可以得到变量类型
返回值:
0: Uninitialized 1: Integer 2: String 3: Buffer
4: Package 7: Event
3. 定义变量
正如前面提到的,声明变量时不需要显式地声明其类型。
Name(MYIN,1) //定义了一个整数
Name(MSTR, “Hello,world”) //定义了一个字符串
4. 赋值
ASL中使用函数Store()来进行赋值操作
Store(0x1234, Local0)
Store(“Hello”, Local0)
5. 算术运算
ASL中不使用+-*/等符号进行运算,全部使用函数
常用的有:
Add: Add(0x1, 0x2, Local0) // Local0 = 0x1
+ 0x2
And: And(0x1, 0x2, Local0) // Local0 = 0x1
& 0x2
Divide: Divide(0x2, 0x1, Local0) // Local0 = 0x2
/ 0x1
Mod: Mod(0x2, 0x1, Local0) //Local0 = 0x2
% 0x1
Multiply: Multiply(0x2, 0x1, Local0) //Local0 = 0x1
* 0x2
Nor: Nor(0x1, 0x2, Local0) //Local0 = (~0x1)
& (~0x2)
Not: Not(0x1, Local0) // Local0 =
~0x1
Or: Or(0x1, 0x2, Local0) // Local0 = 0x1
|0x2
ShiftLeft: ShiftLeft(0x1, 0x8, Local0) // Local0 = (0x1)
<<0x8
ShiftRight: ShiftRight(0x8, 0x2, Local0) //Local0 = (0x8)
>>0x2
Subtract: Subtract(0x2, 0x1, Local0) //Local0 = 0x2
– 0x1
Xor: Xor(0x1, 0x2, Local0) //Local0 = 0x1
^ 0x2
6. 逻辑运算
和算术运算一样,ASL中同样使用函数来进行逻辑运算
常用的有:
LAnd: LAnd(0x1, 0x2) //0x1 && 0x2
LEqual: LEqual(0x1, 0x2) // 0x1== 0x2
LGreater: LGreater(0x1, 0x2) //0x1 > 0x2
LGreaterEqual: LGreaterEqual(0x1,0x1) // 0x1 >= 0x2
LLess: LLess(0x1, 0x2) // 0x1 < 0x2
LLessEqual: LLessEqual(0x1,0x2) // 0x1 <= 0x2
LNot: LNot(0x1) //!(0x1)
LNotEqual: LNotEuqal(0x1,0x2) //0x1 != 0x2
LOr: LOr(0x1,0x2) // 0x1 || 0x2
7. 函数定义
Method(ADBG, 2) //表示有两个输入参数
{
// Arg0, First parameter
// Arg1, Second parameter
Store(Arg0, Local0) //局部变量0
Store(Arg1, Local1) //局部变量1
Add(Local0, Local1, Local1)
Return(Local1) //返回Local1
}
调用函数
ADBG(3, 5)
8. 流程控制
在ASL中,常见的流程控制列表如下:
Break, BreakPoint, Case, Continue, Default, Else, ElseIf, Fatal, If, NoOp, Return, Sleep, Stall, Switch, While
If的用法:
If (predicate1)
{
…statements1…
}
ElseIf (predicate2)
{
…statements2…
}
Else
{
…statements3…
}
For Example:
If (predicate1)
{
…statements1…
}
ElseIf (predicate2)
{
…statements2…
}
Else
{
…statements3…
}
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
}
}
While语句的用法:While (LGreater(Local0, 0))
{
Subtract(Local0, 1, Local0);
}