指令集选择 USTC 若对系统的性能有较高要求,应使用32位的存储系统和 ARM指令 若对系统的成本及功耗有较高要求,则应使用16位的存储 系统和Thumb指令集。 若两者结合使用,充分发挥其各自的优点,会取得更好的 效果。 f(X-=0) armcc tcc C Source return x; Code else return-x; iabs CMP r0.#0 iabs CMP r0,#0 Assembly RSBLT r0,r0,#0 BGE return Code MOV pc,Ir NEG r0.r0 return MOV pc,Ir Code Instruction Size (Bytes) Normalized Comparison ARM 3 12 1.0 Thumb 4 8 0.67 16/77
指令集选择 • 若对系统的性能有较高要求,应使用32位的存储系统和 ARM指令 • 若对系统的成本及功耗有较高要求,则应使用16位的存储 系统和Thumb指令集。 • 若两者结合使用,充分发挥其各自的优点,会取得更好的 效果。 llxx@ustc.edu.cn 16/77
ARM指令的寻址方式 ·立即寻址 ADD RO,RO,#0x3f ;R0←-R0+0x3f -1 有效立即数:立即数扩展 31 28272625242322212019 1615 1211 87 543 Data Processing Cond 00 Opcode Rn Rd Operand 2 PSR Transfer ·寄存器寻址 寄存器间接寻址:LDRRO,[R1] ·基址变址寻址 多寄存器寻址:LDMIA R0,{R1,R2,R3,R4} 相对寻址 ·堆栈寻址 llxx@ustc.edu.cn 17/77
ARM指令的寻址方式 • 立即寻址 – ADD R0,R0,#0x3f ;R0←R0+0x3f – 有效立即数:立即数扩展 • 寄存器寻址 llxx@ustc.edu.cn 17/77 • 寄存器间接寻址:LDR R0,[R1] • 基址变址寻址 • 多寄存器寻址:LDMIA R0,{R1,R2,R3,R4} • 相对寻址 • 堆栈寻址
ARM基址变址寻址 将基址寄存器的内容与指令中给出的地址偏移量 相加,从而得到一个操作数的有效地址。 -“变址”:改变基址寄存器的内容 ·变址寻址方式常用于访问某基地址附近的地址单元。 。 变址方式: 前变址、自动变址(“回写”!)、后变址(“回写”!)、 偏移变址 LDRR0,[R1,#4];R0[R1+4],前,未变址! LDRR0,[R1,#4]!;R0-[R1+4]、R1-R1+4,自 LDR RO, [R1],#4;R0[R1]、R1←R1+4,后 LDR RO,[R1,R2] ;R0[R1十R2],偏,未变址! llxx@ustc.edu.cn 18/77
ARM基址变址寻址 • 将基址寄存器的内容与指令中给出的地址偏移量 相加,从而得到一个操作数的有效地址。 – “变址” :改变基址寄存器的内容 • 变址寻址方式常用于访问某基地址附近的地址单元。 • 变址方式: llxx@ustc.edu.cn 18/77 前变址、自动变址(“回写”!)、后变址(“回写”!)、 偏移变址 LDR R0,[R1,#4] ;R0←[R1+4],前,未变址! LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4,自 LDR R0,[R1],#4 ;R0←[R1]、R1←R1+4,后 LDR R0,[R1,R2] ;R0←[R1+R2],偏,未变址!
Pre or Post Indexed Addressing Pre-indexed:STR r0,[r1,#12] Offset ro Source 12 →0x20c 0x5 0x5 Register for STR r1 Base Register 0x200 0x200 Auto-update form:STR r0,[r1,#12]! Post-indexed:STR r0,[r1],#12 Updated r1 Offset Base 0x20c 12 0x20c Register ro Source Original r1 0x5 Register Base 0x5 for STR 0x200 0x200 Register
0x5 r1 0x200 Base Register 0x200 r0 0x5 Source Register for STR Offset 12 0x20c Auto-update form: STR r0,[r1,#12]! Pre or Post Indexed Addressing? • Pre-indexed: STR r0,[r1,#12] 0x5 r1 0x200 Original Base Register 0x200 r0 0x5 Source Register for STR Offset 12 0x20c r1 0x20c Updated Base Register Auto-update form: STR r0,[r1,#12]! • Post-indexed: STR r0,[r1],#12
栈操作图示 STMED sP!, STMED sp! STMFA sp! STMEA SP!, {r0,r1,x3-r5} {r0,r1,r3-r5} {r0,r1,r3-r5} {r0,r1,r3-r5} 0x418 SP r5 SP r4 r5 r3 r4 r1 r3 ro r1 Old SP> Old SP> r5 Old SP Old SP> rO 0x400 r5 r4 r4 r3 r3 r1 r1 r0 SP r0 SP 0x3e8 llxx@ustc.edu.cn 20/77
栈操作图示 llxx@ustc.edu.cn 20/77