創作內容

5 GP

ACPI & ASL Code

作者:[ヒヤシン]信の芙蕾│2015-03-17 12:42:15│巴幣:1,008│人氣:13664

久久沒發文了~

所以來整理一下專業文當自己的筆記(被巴

(以下所有補充的部分圖文來源: huangkangying的專欄)

-----------------------------------------------------------------------------------
ACPI Table

  BIOS利用ACPI Table來描述BIOS所提供的所有Information、method與function

  舉凡像是OS需要進入S3、S4、S5啦,在運行3D軟體時需要喚醒DGPU啦,HotKey的function啦,亦或者是僅僅是單純的一些指向參數、暫存器在記憶體中所在位置的指標等等

目前常看的ACPI Table(其他的不熟 ((被巴

RSDT(16bits)與XSDT(32bits):  存放各個ACPI Table的Entry

FACP:  記錄了一些像是DSDT的Address、ACPI enable/disable(0xB0/0xB1)、SMI Port(0xB2)、SCI Interrupt (0x09)等等重要的參數

DSDT:  Differentiated System Description Table,幾乎大部分的Function與Method都會被編譯至這個ACPI Table,很長很長哦(誤

SSDT:  Secondary System Description Table,剩餘的補充Function與Method


ASL Code
  ASL是ACPI Source Language的簡稱,它經過編譯器編譯過後變成AML,OS便可以依據想做的Method,在ACPI Table中找到該Code執行

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. 定義變量
  聲明變量時不需要顯式地聲明其類型。ASL常用的數據類型有:

Integer(整數), String(字符串), Event(事件), Buffer(數組), Package(對象集合)

定義一個Integer:
Name(TEST, 0)

定義一個String:
Name(TEST, "ABCD")

定義一個Buffer:
Buffer (BufferSize) {String or ByteList}
Buffer() {0xa, 0xb, 0xc, 0xd}
Buffer(2) {0xa, 0xb}

定義一個Package:
Package (NumElements) {PackageList}

Package中的成員可以是Integer, String, Buffer, 當然也可以是Package
例如:

Package () {
      3,
      9,
      “ACPI 1.0 COMPLIANT”,
      Package () {
            “CheckSum=>”,
            Package () {7, 9}

      },

     0
}

4. 賦值
  ASL中使用函數Store()來進行賦值操作,類似於組語的MOV

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)





引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2780093
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:BIOS|C語言|ACPI|ASL|算術運算|邏輯運算

留言共 6 篇留言

nine
我從第一句就看不懂(那就閉嘴

03-17 21:16

[ヒヤシン]信の芙蕾
第一句話是久久沒發文~(好像正確無誤XD03-17 21:27
nine
可惡對齁,那就是從分隔線以後#

03-17 21:51

[ヒヤシン]信の芙蕾
萌萌搭[e12](?03-18 17:24
小花
拉下 [e16]

03-19 03:40

[ヒヤシン]信の芙蕾
什麼意思-w-直接看留言的意思嗎[e28]03-19 11:11
小花
直接來加油的XD....[e15]

03-19 23:57

[ヒヤシン]信の芙蕾
居然~~(摸頭?03-20 10:20
CCeres
謝大大,簡單明瞭

01-02 15:17

薯條~Fightだよ
BIOS工程師偶然發現這篇 感謝大大 GP奉上
網路上自學資訊真的好難找QQ

04-16 14:01

我要留言提醒:您尚未登入,請先登入再留言

5喜歡★qqcandy111 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:每一次聽到感動的動漫歌曲... 後一篇:UEFI & L...

追蹤私訊切換新版閱覽

作品資料夾

shane8124各位帥哥美女們
新聞學院的戀愛預報 111#純黑的巧克力塔 更新看更多我要大聲說昨天20:01


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】