【正文】
MODIFY(I1,1)。 73 例: C函數(shù) ? C: void f1(int a) { f2(a)。 ?絕對地址尋址,間接尋址,相對 PC尋址模式。 ! Start loop LCNTR=20, DO(PC,loop) UNTIL LCE。 70 優(yōu)化 FIR濾波器代碼 I4=_a。 M8=1 ! Set up increments ! Loop body LCNTR=N, DO loopend UNTIL LCE。 i++) f = f + c[i]*x[i]。 R1=R0R15。 ! Choose which one to save p(r8,r1)。 R8=DM(_b)。 other: ! Code after if 66 特別的 if語句的實(shí)現(xiàn) ? C: if (ab) y = cd。 ! Skip false block ! False block fblock: R0 = DM(_c)。 R1 = DM(_d)。 ! Compare IF GE JUMP fblock。 } else x = c d。 ?可以為延時(shí)和非延時(shí)。 IF AV JUMP(PC,0x00A4)(LA)。 ? 數(shù)據(jù)地址產(chǎn)生器。 ! Load immediate R1=R1 AND R3。 ?匯編: R0=DM(_a)。 R6 = R12*R0(SSI)。 ! Load a R2 = R2*R0。 ?匯編: R1 = DM(_b)。 R2 = DM(_c)。 56 例: C賦值 ? C: x = (a + b) c。 M 為前移地址的增量值。 ! Loads contents of _a ! _a是變量 a的地址 ?直接存儲(chǔ): DM(_a)= R0。 ?兩個(gè)數(shù)據(jù)地址生成器 (DAGs): ? 程序存儲(chǔ)器 ? 數(shù)據(jù)存儲(chǔ)器 ?必須設(shè)置 DAG 寄存器來控制存取操作。 ? STKY是算術(shù)邏輯單元中的某些位的粘性版本。 ?浮點(diǎn)的結(jié)果總是送到寄存器文件中。 ? ALU支持飽和算術(shù)運(yùn)算。 ? 40位 IEEE擴(kuò)展精度浮點(diǎn)。 ? 中斷寄存器。 pop f2’s arg off stack LDR r13!,r15 。 store f1’s return adrs STR r13!,[r0] 。 } ?匯編語言: f1 LDR r0,[r13] 。 add 1 word offset to array index ADD r0,r0,1 。 get c[i] LDR r6,[r5,r8] 。 use r2 for f ADR r3,c 。 use r0 for I MOV r8,0 。 iN。 get address for test LDR r0,[r2] 。 store value of x ?條件執(zhí)行相對于較少的條件是最好的。 get address for d LDRGE r1,[r4] 。 store y 32 例:條件執(zhí)行 。 get address for d LDRLT r1,[r4] 。 get address for x STRLT r0,[r4] 。 store value of x after ... 31 例:條件執(zhí)行 ?使用判斷來控制執(zhí)行那條指令: 。 get address for d LDR r1,[r4] 。 branch around false block 。 get value of d ADD r0,r0,r1 。 store x ADR r4,c 。 if a = b, branch to false block 。 get value of a ADR r4,b 。 } else x = c d。分支是與程序計(jì)數(shù)器相關(guān)的,分支指明了從當(dāng)前程序計(jì)數(shù)器到分支目標(biāo)的偏移量,這個(gè)偏移量的單位是字。將如中的數(shù)值作為地址,取出此地址中的 數(shù)值與 R1 中的值交換 26 多種尋址方式 ?基址加偏移量尋址(基址尋址) LDR r0,[r1,16] ? 將存儲(chǔ)在地址 r1+16單元的值裝入 r0 ?自動(dòng)變址尋址: LDR r0,[r1,16]! ? 將 16與 r1的值相加,然后把這個(gè)值作為地址。R0 – 1 R0 MOV R0,0xff00 。 get address for z STR r1,[r4] 。 get address for b LDR r1,[r4] 。 ?匯編語言: (register reuse) ADR r4,a 。 pute final value for y ADR r4,y 。 get value of c ADD r2,r0,r1 。 ?匯編語言: ADR r4,b 。 get value of c SUB r3,r3,r2 。 get address for b, reusing r4 LDR r1,[r4] 。 ? ADR偽操作產(chǎn)生一個(gè)要求計(jì)算地址的指令: ADR r1,FOO 22 例: C 的賦值語句 ? C: x = (a + b) c。 20 ARM 數(shù)據(jù)傳送指令 ? MOV, MVN :數(shù)據(jù)非傳送 MOV r0, r1 。 17 ARM數(shù)據(jù)指令 ? ADD, ADC : add (w. carry) ? SUB, SBC : subtract (w. carry) ? RSB, RSC : reverse subtract (w. carry) ? MUL, MLA : multiply (and accumulate) ? AND, ORR, EOR ? BIC : bit clear ? LSL, LSR : logical shift left/right ? ASL, ASR : arithmetic shift left/right ? ROR : rotate right ? RRX : rotate right extended with C 18 數(shù)據(jù)操作的不同方法 ?邏輯位