【文章內(nèi)容簡(jiǎn)介】
r4,d 。 get address for d LDR r1,[r4] 。 get value of d ADD r0,r0,r1 。 pute y ADR r4,y 。 get address for y STR r0,[r4] 。 store y B after 。 branch around false block 。 false block fblock ADR r4,c 。 get address for c LDR r0,[r4] 。 get value of c ADR r4,d 。 get address for d LDR r1,[r4] 。 get value for d SUB r0,r0,r1 。 pute cd ADR r4,x 。 get address for x STR r0,[r4] 。 store value of x after ... 31 例:條件執(zhí)行 ?使用判斷來控制執(zhí)行那條指令: 。 true block, 條件代碼由 CMP更新 。 no need for “BGE fblock” and “B after” MOVLT r0,5 。 generate value for x ADRLT r4,x 。 get address for x STRLT r0,[r4] 。 store x ADRLT r4,c 。 get address for c LDRLT r0,[r4] 。 get value of c ADRLT r4,d 。 get address for d LDRLT r1,[r4] 。 get value of d ADDLT r0,r0,r1 。 pute y ADRLT r4,y 。 get address for y STRLT r0,[r4] 。 store y 32 例:條件執(zhí)行 。 false block ADRGE r4,c 。 get address for c LDRGE r0,[r4] 。 get value of c ADRGE r4,d 。 get address for d LDRGE r1,[r4] 。 get value for d SUBGE r0,r0,r1 。 pute ab ADRGE r4,x 。 get address for x STRGE r0,[r4] 。 store value of x ?條件執(zhí)行相對(duì)于較少的條件是最好的。 33 例 :用于多分支選擇的 switch語句 ? C: switch (test) { case 0: … break。 case 1: … break。 … } ?匯編: ADR r2,test 。 get address for test LDR r0,[r2] 。 load value for test ADR r1,switchtab 。 load address for switch table LDR r15,[r1,r0,LSL 2] 。 index switch table switchtab DCD case0 DCD case1 ... ? LDR: ? 把 r0移 2位把偏移量轉(zhuǎn)換成為字節(jié)地址 ? 把存儲(chǔ)器 [r1+r0]的值裝入 PC r15中 34 例: FIR 濾波器 ? C (FIR)濾波器: for (i=0, f=0。 iN。 i++) f = f + c[i]*x[i]。 /* x[i]: 周期性的采樣 */ ?匯編語言 。 循環(huán)初始代碼 MOV r0,0 。 use r0 for I MOV r8,0 。 use separate index for arrays ADR r2,N 。 get address for N LDR r1,[r2] 。 get value of N MOV r2,0 。 use r2 for f ADR r3,c 。 load r3 with base of c ADR r5,x 。 load r5 with base of x 35 例: FIR 濾波器 。 循環(huán)代碼 loop LDR r4,[r3,r8] 。 get c[i] LDR r6,[r5,r8] 。 get x[i] MUL r4,r4,r6 。 pute c[i]*x[i] ADD r2,r2,r4 。 add into running sum ADD r8,r8,4 。 add 1 word offset to array index ADD r0,r0,1 。 add 1 to i CMP r0,r1 。 exit? BLT loop 。 if i N, continue 36 ARM 子程序的鏈接 ?分支和鏈接指令: BL foo ? 把當(dāng)前的 PC值存入 r14. ?從一個(gè)子程序返回: MOV r15,r14 37 嵌套的子程序調(diào)用 ?嵌套 /遞歸 ? C: void f1(int a) { f2(a)。 } ?匯編語言: f1 LDR r0,[r13] 。 load arg into r0 from stack 。 r13 is stack pointer 。 call f2() STR r13!,[r14] 。 store f1’s return adrs STR r13!,[r0] 。 store arg to f2 on stack BL f2 。 branch and link to f2 。 return from f1() SUB r13,4 。 pop f2’s arg off stack LDR r13!,r15 。 restore reg and return 38 ? SHARC 編程模型 ? SHARC 匯編語言 ? SHARC 存儲(chǔ)器的組織 ? SHARC 數(shù)據(jù)操作 ? SHARC 控制流程 SHARC處理器 39 SHARC編程模型 ? 寄存器文件: ? R0R15 (對(duì)浮點(diǎn)運(yùn)算