局部標號主要用於在局部範圍內使用。他由兩部分組成:開頭是一個0~99的數字,後面緊跟着一個通常表示該局部變量作用範圍的符號。
局部變量的作用範圍通常爲當前段,也可以用僞操作ROUT來定義局部變量的作用範圍。
局部標號定義格式:N{routname}
其中:N 局部標號,爲0~99。
routname 局部標號作用範圍的名稱,由ROUT 僞指令定義。
局部標號引用格式:
%{F|B}{A|T} N{routname}
其中: % 表示局部標號引用操作。
F 指示編譯器只向前搜索
B 指示編譯器只向後搜索
A 指示編譯器搜索宏的所有嵌套層次
T 指示編譯器搜索宏的當前層
如果F和B都沒有指定,則編譯器先向前搜索,再向後搜索。如果A和T 都沒有指定,編譯器搜索所有從宏的當前層次到宏的最高層次,比當前層次的層次不再搜索。
如果指定了routname,編譯器向前搜索最近的ROUT 僞指令,若routname 與該ROUT僞指令定義的名稱不匹配,編譯器報告錯誤,彙編失敗。
memsetup:
@ 設置存儲控制器以便使用SDRAM等外設
mov r1, #MEM_CTL_BASE @ 存儲控制器的13個寄存器的開始地址
adrl r2, mem_cfg_val @ 這13個值的起始存儲地址
add r3, r1, #52 @ 13*4 = 54
1:
ldr r4, [r2], #4 @ 讀取設置值,並讓r2加4
str r4, [r1], #4 @ 將此值寫入寄存器,並讓r1加4
cmp r1, r3 @ 判斷是否設置完所有13個寄存器
bne 1b @ 若沒有寫成,繼續
mov pc, lr @ 返回
上面bne 1b 的意思是,如果r1!=r3 即r1的地址的不等於r3的地址,也就是還沒設置完這13個寄存器,就要重新跳到:
1:
ldr r4, [r2], #4 @ 讀取設置值,並讓r2加4
str r4, [r1], #4 @ 將此值寫入寄存器,並讓r1加4
......
處執行;直到r1=r3,即設置好這13個寄存器。纔會結束這個局部循環。