ARM匯編程序設(shè)計之:匯編語言文件格式
10.3.6匯編語言的程序結(jié)構(gòu)
在ARM(Thumb)匯編語言程序中以程序段為單位組織代碼。段是相對獨立的指令或數(shù)據(jù)序列,具有特定的名稱。段可以分為代碼段(CodeSection)和數(shù)據(jù)段(DataSection),代碼段的內(nèi)容為執(zhí)行代碼,數(shù)據(jù)段存放代碼運行時需要用到的數(shù)據(jù)。一個匯編程序至少應(yīng)該有一個代碼段,當程序較長時,可以分割為多個代碼段和數(shù)據(jù)段,多個段在程序編譯鏈接時最終形成一個可執(zhí)行的映像文件。
可執(zhí)行映像文件通常由以下幾部分構(gòu)成。
·一個或多個代碼段,代碼段的屬性為只讀。
·零個或多個數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。數(shù)據(jù)段可是被初始化的數(shù)據(jù)段或沒有被初始化的數(shù)據(jù)段(ZI,zeroinitialized)。
鏈接器根據(jù)系統(tǒng)默認或用戶設(shè)定的規(guī)則,將各個段安排在存儲器中的相應(yīng)位置。因此源程序中段之間的相對位置與可執(zhí)行的映像文件中段的相對位置一般不會相同。
以下是一個匯編語言源程序的基本結(jié)構(gòu)。
AREA Init,CODE,READONLY
ENTRY
Start
LDR R0,=0x3FF5000
LDR R1,0xFF
STR R1,[R0]
LDR R0,=0x3FF5008
LDR R1,0x01
STR R1,[R0]
……
END
在匯編語言程序中,用AREA偽操作定義一個段,并說明所定義段的相關(guān)屬性,本例定義一個名為Init的代碼段,屬性為只讀。ENTRY偽操作標識程序的入口點,接下來為指令序列,程序的末尾為END偽指令,該偽操作告訴編譯器源文件的結(jié)束,每一個匯編程序段都必須有一條END偽操作,指示代碼段的結(jié)束。
10.3.7匯編語言子程序調(diào)用
在ARM匯編語言程序中,子程序的調(diào)用一般是通過BL指令來實現(xiàn)的。在程序中,使用指令“BL子程序”名即可完成子程序的調(diào)用。
該指令在執(zhí)行時完成如下操作:將子程序的返回地址存放在連接寄存器LR中,同時將程序計數(shù)器PC指向子程序的入口點。當子程序執(zhí)行完畢需要返回調(diào)用處時,只需要將存放在LR中的返回地址重新拷貝給程序計數(shù)器PC即可。在調(diào)用子程序的同時,也可以完成參數(shù)的傳遞和從子程序返回運算的結(jié)果,通??梢允褂眉拇嫫鱎0~R3完成。
注意 | 不同編譯器編譯的代碼間的相互調(diào)用,要遵循AAPCS(ARMArchitecture)。詳見ARM編譯工具手冊。 |
以下是使用BL指令調(diào)用子程序的匯編語言源程序的基本結(jié)構(gòu):
AREA Init,CODE,READONLY
ENTRY
Start
LDR R0,=0x3FF5000
LDR R1,0xFF
STR R1,[R0]
LDR R0,=0x3FF5008
LDR R1,0x01
STR R1,[R0]
BL PRINT_TEXT
……
PRINT_TEXT
……
MOV PC,BL
……
END
評論