ARM匯編語(yǔ)言程序格式
ARM匯編語(yǔ)言以段(分為代碼段和數(shù)據(jù)段)為單位組織源文件。一個(gè)ARM源程序至少要有一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段。
代碼段通常是只讀的,
0個(gè)或者多個(gè)包含初始值的數(shù)據(jù)段。通??勺x。
0個(gè)或者多個(gè)不包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段被初始化為0,通??勺x。
如:
1、入口
AREA Init,CODE,READONLY
ENTRY
--------------------ENTRY偽操作標(biāo)識(shí)了程序執(zhí)行的第一條指令。一個(gè)ARM程序至少要有一個(gè)ENTRY,
END告訴匯編編譯器編譯源文件結(jié)束,每一個(gè)匯編必須包含一個(gè)END
2、子程序調(diào)用
BL 子程序調(diào)用名稱
BL指令完成兩個(gè)操作,將子程序返回地址放在LR寄存器中,同時(shí)將PC寄存器的值設(shè)置成目標(biāo)子程序的第一條指令地址。子程序調(diào)用通常使用寄存器R0~R3來(lái)返回結(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
-----------------------------------看到上面兩個(gè)例子,唯一區(qū)別就是后面這個(gè)有mov pc,lr,這個(gè)表明這個(gè)程序完了之后會(huì)返回到這個(gè)程序BL的下一句執(zhí)行。