ARM匯編語言以段(分為代碼段和數(shù)據(jù)段)為單位組織源文件。一個ARM源程序至少要有一個代碼段,大的程序可以包含多個代碼段和數(shù)據(jù)段。
代碼段通常是只讀的,
0個或者多個包含初始值的數(shù)據(jù)段。通??勺x。
0個或者多個不包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段被初始化為0,通??勺x。
如:
1、入口
AREA Init,CODE,READONLY
ENTRY
--------------------ENTRY偽操作標識了程序執(zhí)行的第一條指令。一個ARM程序至少要有一個ENTRY,
END告訴匯編編譯器編譯源文件結(jié)束,每一個匯編必須包含一個END
2、子程序調(diào)用
BL 子程序調(diào)用名稱
BL指令完成兩個操作,將子程序返回地址放在LR寄存器中,同時將PC寄存器的值設(shè)置成目標子程序的第一條指令地址。子程序調(diào)用通常使用寄存器R0~R3來返回結(jié)果和傳遞參數(shù)。
在2440init.s中有大量的子程序調(diào)用例子
;===========================================================
ReadNandID
mov r7,#NFCONF
ldr r0,[r7,#4];NFChipEn();
bic r0,r0,#2
str r0,[r7,#4]
mov r0,#0x90;WrNFCmd(RdIDCMD);
strb r0,[r7,#8]
mov r4,#0;WrNFAddr(0);
strb r4,[r7,#0xc]
;===========================================================
1;while(NFIsBusy());
ldr r0,[r7,#0x20]
tst r0,#1
beq %B1
ldrb r0,[r7,#0x10];id = RdNFDat()<<8;
mov r0,r0,lsl #8
ldrb r1,[r7,#0x10];id |= RdNFDat();
orr r5,r1,r0
ldr r0,[r7,#4];NFChipDs();
orr r0,r0,#2
str r0,[r7,#4]
mov pc,lr
-----------------------------------看到上面兩個例子,唯一區(qū)別就是后面這個有mov pc,lr,這個表明這個程序完了之后會返回到這個程序BL的下一句執(zhí)行。