MOV PC, LR
如果在子程序中LR没有改变,则等同于 RET
程序在 调用子程序时,会把 BL SUB_XXXXX 处的
下一条指令送入 LR, 这样,当所调用的子程序没有改变LR的值时(注意这里我说说的是在整个子程序中LR没有被改变),返回父程序时,你就可以使用
MOV PC, LR
;==============这一段代码完成从NAND Flash读代码到RAM=====================
nand_boot_beg ;
mov r5, #NFCONF ;首先设定NAND的一些控制寄存器
;set timing value
ldr r0, =(7<<12)|(7<<8)|(7<<4)
str r0, [r5]
;enable control
ldr r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
str r0, [r5, #4]
bl ReadNandID ;按着读取NAND的ID号,结果保存在r5里
。。。。。。。。。
跳转到下面的子程序了:
ReadNandID
mov r7,#NFCONF
ldr r0,[r7,#4] ;NFChipEn();
bic r0,r0,#2
str r0,[r7,#4]
mov r0,#0x90 ;WrNFCmd(RdIDCMD);9=1001b
strb r0,[r7,#8];NFCMMD Register
mov r4,#0 ;WrNFAddr(0);
strb r4,[r7,#0xc]
1 ;while(NFIsBusy());
ldr r0,[r7,#0x20]
tst r0,#1 ;0: NAND Flash memory busy
beq %B1
ldrb r0,[r7,#0x10] ;id = RdNFDat()<<8; ldrb Rd,[Rn,#immed_5X4] 加载字节数据,放入Rd中,即Rd最低字节有效,高24位清零
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
mov pc,lr 返回主程序