ARM匯編語(yǔ)言中的程序結(jié)構(gòu)
可執(zhí)行映象文件通常由以下幾部分構(gòu)成:
本文引用地址:http://www.ex-cimer.com/article/201611/316614.htm— 一個(gè)或多個(gè)代碼段,代碼段的屬性為只讀。
— 零個(gè)或多個(gè)包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。
— 零個(gè)或多個(gè)不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。
鏈接器根據(jù)系統(tǒng)默認(rèn)或用戶設(shè)定的規(guī)則,將各個(gè)段安排在存儲(chǔ)器中的相應(yīng)位置。因此源程序中段之間的相對(duì)位置與可執(zhí)行的映象文件中段的相對(duì)位置一般不會(huì)相同。
以下是一個(gè)匯編語(yǔ)言源程序的基本結(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
在匯編語(yǔ)言程序中,用 AREA 偽指令定義一個(gè)段,并說(shuō)明所定義段的相關(guān)屬性,本例定義一個(gè) 名為 Init 的代碼段,屬性為只讀。 ENTRY 偽指令標(biāo)識(shí)程序的入口點(diǎn),接下來(lái)為指令序列,程序的末尾為 END 偽指令,該偽指令告訴編譯器源文件的結(jié)束,每一個(gè)匯編程序段都必須有一條 END 偽指令,指示代碼段的結(jié)束。 ARM匯編語(yǔ)言中的子程序調(diào)用
在 ARM 匯編語(yǔ)言程序中,子程序的調(diào)用一般是通過(guò) BL 指令來(lái)實(shí)現(xiàn)的。在程序中,使用指令:
BL 子程序名
即可完成子程序的調(diào)用。
該指令在執(zhí)行時(shí)完成如下操作:將子程序的返回地址存放在連接寄存器 LR 中,同時(shí)將程序計(jì)器 PC 指向子程序的入口點(diǎn),當(dāng)子程序執(zhí)行完畢需要返回調(diào)用處時(shí),只需要將存放在 LR 中的返回地址重新拷貝給程序計(jì)數(shù)器 PC 即可。在調(diào)用子程序的同時(shí),也可以完成參數(shù)的傳遞和從子程序回運(yùn)算的結(jié)果,通??梢允褂眉拇嫫?R0 ~ R3 完成。
以下是使用 BL 指令調(diào)用子程序的匯編語(yǔ)言源程序的基本結(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
評(píng)論