hello.c
):主要包含一個 main()
函數,呼叫 printf
來輸出文字 "Hello, World"。hello.s
):
.text
指令來進入文本段,並使用 .align
指令來對齊程式碼。main:
標籤定義了 main
函數的起始位置,組合語言中使用偽指令(pseudoinstruction)來進行堆疊管理、暫存器存取、函數呼叫(例如 printf
)。str1
, str2
)進行輸出,並進行相應的堆疊回收與返回處理。addi
, sw
, lui
, auipc
這些指令都轉換成了具體的機器碼。main
是全局的文本段,str1
和 str2
分別是本地的資料段。str1
, str2
)需要在連結過程中確定它們的絕對位址,這些符號會被列入重定位表中,待連結器來處理。str1
, str2
的位址轉換為機器碼中可用的位址。lui
和 addi
指令的位址計算過程使用了 20 位和 12 位的立即數進行分割和處理。addi
指令進行符號擴展,來生成 32 位的立即數。例如 str1
的位址 0x20A10
,其 12 位立即數部分帶有負號位。lui
和 addi
指令,將位址分成上 20 位和下 12 位來處理,最後正確計算出 str1
的位址。