組合語言轉換為機器語言的過程:
foo.s
for RISC-V),這些程式碼可能包含偽指令(pseudoinstructions)。偽指令是一種高層次指令,最終會被轉換成具體的機器指令。foo.o
for RISC-V)。這個物件文件包含機器碼,並且還包含一些連結和除錯所需的資訊,例如符號表(Symbol Table)、重定位資訊(Relocation Information)、數據段(Data Segment)等。Directives 指令的作用:
.text
:告訴組譯器接下來的項目屬於程式的文字段(text segment),也就是放置機器碼的區域。.data
:用來標示接下來的項目屬於資料段(data segment),這些數據會以二進制形式存儲在 object file 中。.globl sym
:將符號 sym
宣告為全域變數,可以從其他文件中被引用。.string str
:將字串 str
存入記憶體,並在字串末尾加上空字元以便終止。.word w1 ... wn
:將 n 個 32 位元數量依次存入記憶體。Object File 格式:
Object file 是程式最終執行前的中間文件,包含不同的部分來支持連結和執行:
生成機器碼的過程:
add x18, x18, x10
和 addi x19, x19, -1
,這些指令的操作數和結果都可以直接從指令本身中解讀出來。beq
、bne
和 jal
等指令需要計算跳轉到標籤的位移(offset)。在這些情況下,指令中的位移是相對於當前程式計數器(PC)的。當 pseudoinstructions 被替換為實際指令後,所有基於 PC 的位址計算都能被執行。PC-Relative 地址計算的雙遍法:
處理其他引用:
strlen
函數,這需要知道 strlen
函數的地址。la
會被分解成 lui
和 addi
,這些需要完整的 32 位地址。完整的 Object File 結構: