DSP

我所知道的ACPI(3) -- ASL 入门简介

2019-07-13 18:39发布

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); }