組合語言與程序呼叫

組合語言

在最底層,處理器只懂機器碼:一長串位元,意思是諸如「把暫存器 6 加上暫存器 7,結果放進暫存器 5」這類動作。用手讀寫這些位元極為痛苦。組合語言(assembly language)是覆蓋在機器碼之上、一層薄薄而人類可讀的外皮。你不必背 add 的位元樣式,而是寫一個簡短的助憶符(mnemonic)如 add,用名字稱呼暫存器,並用十進位寫出小數字。它是人能讀懂、卻又最直接對機器說它自己語言的方式。

組合語言的每一行幾乎都恰好對應一道機器指令(這種近乎一對一的對應,正是它之所以是組合語言而非高階語言的關鍵)。像 add a0, a1, a2 這一行,意思是取暫存器 a1 的值,加上暫存器 a2 的值,把結果存進暫存器 a0。你還會用到標籤(label,給程式碼中某個位置取名,如 loop: 或 done:),以及告訴組譯器資料、對齊與區段資訊的指示詞(directive)。正因為它如此貼近指令集,組合語言只屬於某一族機器:RISC-V 組語不能在 x86 晶片上跑,反之亦然。

組合語言之所以重要,正因為它就在軟體碰觸裸機的那一層。你能精確看到用了哪些暫存器、何時讀寫記憶體、控制如何跳轉。這讓它在理解效能、最底層除錯與資安工作上不可或缺。但要老實說:今天幾乎沒人整支程式用組合語言寫,因為編譯器把高階程式碼轉成的組語,通常和人手寫的一樣快、甚至更快。它真正的長久價值在於「讀」,而非「手寫」。

C 語言敘述 c = a + b 在 RISC-V 組語中可能變成: lw t0, 0(s0) # 把 a 載入 t0 lw t1, 4(s0) # 把 b 載入 t1 add t2, t0, t1 # t2 = a + b sw t2, 8(s0) # 把結果存進 c 四行可讀的文字,對應四道機器指令。

每行組語對應一道機器指令;# 之後的註解寫給人看,在組譯時會消失。

組合語言不等於機器碼:組合語言是可讀的文字,機器碼是原始位元。組譯器才是把前者變成後者的工具。

又称
asm組語