内容提要 ·ARM指令集 -ARM指令集分类与指令格式 ARM指令集 -ARM指令的寻址方式 -ARM指令集详解 -Thumb:指令及应用 李曦 ·ARM汇编程序设计基础 llxx@ustc.edu.cn 一系统初始化 调试环境 lboousic.edu.cn 5.1ARM微处理器的指令集概述 ARM指令集 5.1,IARM微处理器的指令的分类与格式 ·跳转指令: ·Load-store结构 -B 转指令。 带延回的蛛转折令。 BLX 带问和状态切换的洗转折令。 带状态切换的转指令。 ·指令分类 ·数据处理指令 ◆数据处理指令一使用和改变寄存器的值 位测试指令 ◆数据传送指令-把存储器的值拷贝到寄存器中(1oad)或 2 TEQ 相等测试折令 饰进位 把寄存器中的值拷贝到存储器中(stor©) 法指令 ◆拉制流指今 EOR 辑异支折令 BIC 位清除折令 上分支 。乘法指令与乘加指令 一分支和链接。保存返回的地址,以恢复最先的次序 MLA >陪入系统代玛 ◆程序状态寄存器(PSR)处理指令 程序状态寄存器存取指令 。RS程序状态寄存器到通用寄存的数据传送指令。 ◆协处理器指令 一MSR通用酱存器到程序状态寄存器的数据传送指令。 ◆异常产生指令 .edu.cn 37m .edu.cn /77 ARM指令集(续) 5.1.2指令的条件域 ·寄存器加载存储指令: LDB字节数据加我指令 ·所有的ARM指合都可以条件执行 R字数据加我指令 一DR半字数据加载指令 STR字数据存储指令 ST阳 字数据存储指令 妻整的执行5香取决于CPSR寄存器的N乙,CaaV际 ST连续数据存储指令 -所有的Thumb指合都可以解压成全部条件指 ·数据交换指令: -SP字数据交换指令 SPB字节数据交换指令 每一条ARM指令包含4位的条件码,位于指令的最高4位 ·移位元指令: [31:28] ,条件码共有16种 每种条件码可用两个字符表 S1辑左移 ASL算术左移 示,这两个字符可以添加在指今助记符的后面和指今同时 一LSR辑右移 ASR算术右移 使用, 0R循环右移 即贴带扩充的循环右移 -例如,跳转指合B可以加上后缀EQ变为BEQ表示“相等 ·协处理器指令 则跣转”,即当CPSR中的Z标志置位时发生跳转。 -P协处理器数据操作指令 -山C协处理署数据如我指令 -STC协处理器数据存指令 -RA处理器寄存器到协处理器寄存器的数据传送指令 -RC协处理器寄存器到A处理器寄存器的数据传送指令 ·在16种条件标志码中,只有15种可以使用 577
ARM指令集 李曦 llxx@ustc.edu.cn llxx@ustc.edu.cn 2/77 内容提要 • ARM指令集 – ARM指令集分类与指令格式 – ARM指令的寻址方式 – ARM指令集详解 – Thumb指令及应用 • ARM汇编程序设计基础 – 系统初始化 – 调试环境 llxx@ustc.edu.cn 3/77 5.1 ARM微处理器的指令集概述 5.1.1 ARM微处理器的指令的分类与格式 • Load-store结构 • 指令分类 数据处理指令 – 使用和改变寄存器的值 数据传送指令 – 把存储器的值拷贝到寄存器中 (load)或 把寄存器中的值拷贝到存储器中(store) 控制流指令 分支 分支和链接, 保存返回的地址,以恢复最先的次序 陷入系统代码 程序状态寄存器(PSR)处理指令 协处理器指令 异常产生指令 llxx@ustc.edu.cn 4/77 ARM指令集 • 跳转指令: – B 跳转指令。 BL 带返回的跳转指令。 – BLX 带返回和状态切换的跳转指令。 BX 带状态切换的跳转指令。 • 数据处理指令 – MOV 数据传送指令 MVN 数据取反传送指令 – CMP 比较指令 CMN 反值比较指令 – TST 位测试指令 TEQ 相等测试指令 – ADD 加法指令28 ADC 带进位加法指令 – SUB 减法指令 SBC 带借位减法指令 – RSB 逆向减法指令 RSC 带借位的逆向减法指令 – AND 逻辑与指令 ORR 逻辑或指令 – EOR 逻辑异或指令 BIC 位清除指令 • 乘法指令与乘加指令 – MUL 32 位乘法指令 MLA 32 位乘加指令 – SMULL 64 位有符号数乘法指令 SMLAL 64 位有符号数乘加指令 – UMULL 64 位无符号数乘法指令 UMLAL 64 位无符号数乘加指令 • 程序状态寄存器存取指令 – MRS 程序状态寄存器到通用寄存器的数据传送指令。 – MSR 通用寄存器到程序状态寄存器的数据传送指令。 llxx@ustc.edu.cn 5/77 ARM指令集(续) • 寄存器加载/存储指令 : – LDR 字数据加载指令 LDRB 字节数据加载指令 – LDRH 半字数据加载指令 STR 字数据存储指令 – STRB 字节数据存储指令 STRH 半字数据存储指令 – LDM 连续数据加载指令 STM 连续数据存储指令 • 数据交换指令 : – SWP 字数据交换指令 SWPB 字节数据交换指令 • 移位元指令: – LSL 逻辑左移 ASL 算术左移 – LSR 逻辑右移 ASR 算术右移 – ROR 循环右移 RRX 带扩充的循环右移 • 协处理器指令 – CDP 协处理器数据操作指令 – LDC 协处理器数据加载指令 – STC 协处理器数据存储指令 – MCR ARM处理器寄存器到协处理器寄存器的数据传送指令 – MRC 协处理器寄存器到ARM处理器寄存器的数据传送指令 llxx@ustc.edu.cn 6/77 • 所有的ARM指令都可以条件执行 – 指令的执行与否取决于CPSR寄存器的N, Z, C and V标 志位 – 所有的Thumb指令都可以解压成全部条件指令 • 每一条ARM指令包含4位的条件码,位于指令的最高4位 [31:28]。条件码共有16种,每种条件码可用两个字符表 示,这两个字符可以添加在指令助记符的后面和指令同时 使用。 – 例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等 则跳转”,即当CPSR中的Z标志置位时发生跳转。 • 在16种条件标志码中,只有15种可以使用。 31 28 0 Cond 5.1.2 指令的条件域
指令的条件两15种) 条件执行 条件 助记符后银 标志 含义 0000 EO Z置位 相等 ·条件执行可避免使用分支指令 0001 NE Z清零 不相等 ·Example C置位 无符号数大于或等于 0011 CC C清零 无符号数小于 CMP rO,#5 0100 N置位 负数 BEQ BYPASS :ifc0:5){ ADDr1,r1.ro r1:=r1+r0-r2 0101 N清零 正数或零 SUBr1,r1,r2 注意:条件不成立时, 0110 争 V置位 滋出 BYPASS: 该指令被忽略,等于执 0111 V清零 未漫出 行了一条NOP. 1000 C爱位清零 无符号数大于 使用条件执行 if ((a==b)&&(c==d))e+ 1001 LS C清零Z置位 无符号数小于或等于 CMP rO,#5 1010 GE N等于V 带符号数大于或等于 ADDNE r1,r1,ro: CMP rO,r1 1011 LT N不等于V 带符号数小干 SUBNE r1,r1,r2: CMPEQ r2,r3 1100 GT Z清零且(N等于V) 带符号数大于 ADDEQr4,r4,#1 101 E Z置位或(N不等于V) 带符号数小于或等于 obe:add 2-letter condition after the 3-etter opcode 1110 AL 复略 无第件执行 boxustc.cdu.cn lbooustc.edu.cn 指令格式 ARM7TDMI指令集编码 ◆3地址指令格式 >在ARM状态中使用 1001 fbits n bits n bits n bits 00001001 function op 1 addr.op 2 addr.dest.addr. ◆2地址指令格式 >在ARM和THUMB状态下使用 fbits n bits n bits function op 1 addr.dest.addr. xustc.edu.cn 77 .edu.cn 077 ARM存储器访问指令 单寄存器存储 ARM存储器访问指令一单寄存器存储 LDR和STR一字和无符号字节加载/存储指令编码 LDR和STR一丰字和有特号字节如载/存储指令编玛 B为1表示字节诗问 为0美示幸诗司 W表示回写 5为1表示有特号诗问, 为0表示无特号诗问 P表示前/后变址 L用于制加载L为1 P表示前/后支址 日为1表示来字诗问,为 指个执行的景件码 或存陆(L为0 指执守的件码 0表示字节诗问 318272石7为为73疗1动9165 1711 31282726252232224209 1615 1211 875430 cdb1Puwm U表示如/减 为指的寻址方 1为0,偏量为 为指命的寻址方式 12位 1为0时,偏移量为 Rd为源/g标寺存互 偏移量为寺存移 Rd为源/日标奇存三 12位立即教,为1对, Rn为基址寺存器 Rn为基址寺存耳 偏移量为寺存器移 L用于区刮加我L为1) U表示加/减 W表示四写 或存储L为0) 1177 27
llxx@ustc.edu.cn 7/77 条件执行 • 条件执行可避免使用分支指令 • Example CMP r0, #5 ; BEQ BYPASS ; if (r0!=5) { ADD r1, r1, r0 ; r1:=r1+r0-r2 SUB r1, r1, r2 ; } BYPASS: ... CMP r0, #5 ; ADDNE r1, r1, r0; SUBNE r1, r1, r2; ... 使用条件执行 Note: add 2 –letter condition after the 3-letter opcode ; if ((a==b) && (c==d)) e++; CMP r0, r1 CMPEQ r2, r3 ADDEQ r4, r4, #1 注意:条件不成立时, 该指令被忽略,等于执 行了一条NOP。 llxx@ustc.edu.cn 8/77 条件码 助记符后缀 标 志 含 义 0000 EQ Z置位 相等 0001 NE Z清零 不相等 0010 CS C置位 无符号数大于或等于 0011 CC C清零 无符号数小于 0100 MI N置位 负数 0101 PL N清零 正数或零 0110 VS V置位 溢出 0111 VC V清零 未溢出 1000 HI C置位Z清零 无符号数大于 1001 LS C清零Z置位 无符号数小于或等于 1010 GE N等于V 带符号数大于或等于 1011 LT N不等于V 带符号数小于 1100 GT Z清零且(N等于V) 带符号数大于 1101 LE Z置位或(N不等于V) 带符号数小于或等于 1110 AL 忽略 无条件执行 指令的条件码(15种) llxx@ustc.edu.cn 9/77 3地址指令格式 在ARM状态中使用 2地址指令格式 在ARM和 THUMB 状态下使用 指令格式 llxx@ustc.edu.cn 10/77 ARM7TDMI指令集编码 llxx@ustc.edu.cn 11/77 ARM存储器访问指令——单寄存器存储 •LDR和STR——字和无符号字节加载/存储指令编码 指令执行的条件码 I为0时 , 偏 移 量 为 12位立即数,为1时, 偏 移 量 为 寄 存 器 移 位 P表示前/后变址 U表示加/减 B为1表示字节访问, 为0表示字访问 W表示回写 为指令的寻址方式 Rd为源/目标寄存器 Rn为基址寄存器 L用于区别加载(L为1) 或存储(L为0) llxx@ustc.edu.cn 12/77 ARM存储器访问指令——单寄存器存储 •LDR和STR——半字和有符号字节加载/存储指令编码 指令执行的条件码 I为0时 , 偏 移 量 为 12位立即数,为1时, 偏 移 量 为 寄 存 器 移 位 P表示前/后变址 U表示加/减 W表示回写 为指令的寻址方式 Rd为源/目标寄存器 Rn为基址寄存器 L用于区别加载(L为1) 或存储(L为0) S为1表示有符号访问, 为0表示无符号访问 H为1表示半字访问,为 0表示字节访问
5.2ARM指令的寻址方式 5.2.1立即寻址 ·立即寻址 ·立即寻址也叫立即数寻址 ·寄存器寻址 ·操作数本身就在指令中给出,只要取出指令也就取 ·寄存器间接寻址 到了操作数。这个操作数被称为立即数。 ·例如: ·基址变址寻址 ·多寄存器寻址 ADD RO,RO,#1 :R0-R0+1 ·相对寻址 ADD RO,RO,#0x3f RO+-R0+0x3f ·堆栈寻址 一第二个源操作数即为立即数,要求以“#”为前缀 ·对于以十六进制表示的立即数,还要求在"料”后加上0x”或最 .edu.cn 13m loousic.edu.cn 14m 有效立即数问题 5.2.2寄存器寻址 c附o9a工 ·寄存器中的数值作为操作数 并不是所有立即数都是有效的 在32位指令编码中存放32位立即数的方法是: 一这种寻址方式是各类微处理器经常采用的一种 方式,也是一种执行效率较高的寻址方式。 一在ARM漱据处理指令中,第二操作数域12位 老接品 针高餐用秀 -以下指令: 桃平棉家 ADD RO,R1,R2 RO+R1+R2 示成 -immed8循环右移(2 x rotate imm) 如:movR4,#0x8000000A ADD R3,R2,R1,LSL #3 ;#0x8000000A由0xA8循环右移0x2位得到 :R3=R2+R1()(s)Rd>,,Koperand2>) 符奇存器的移位结果作为操作 理 教,但Rm值保持不变(移位 灵活的使用第2个絲作教“operand2”能妙提高代码效车。 接作不萌耗新外的对间)。 结果N 它有如下的形式: ALU "immed8r一常数表达式,立即寻址; 移位方法如下: Rd Rm一奇存器寻址方式: 提作积 说明 操作胡 说明 Rm.shift-一寺存器移位方式: ASR粉算术右移n位 ROR 畅环右移n位 LSLn逆辑左移n位 RRX 带打展的循环右移1位 wO"工 ] LSR #n 边辑右移n位 Type Rs 公盟 X ust.cdu.m 177 877
llxx@ustc.edu.cn 13/77 5.2 ARM指令的寻址方式 • 立即寻址 • 寄存器寻址 • 寄存器间接寻址 • 基址变址寻址 • 多寄存器寻址 • 相对寻址 • 堆栈寻址 llxx@ustc.edu.cn 14/77 • 立即寻址也叫立即数寻址 • 操作数本身就在指令中给出,只要取出指令也就取 到了操作数。这个操作数被称为立即数。 • 例如: ADD R0,R0,#1 ;R0←R0+1 ADD R0,R0,#0x3f ;R0←R0+0x3f –第二个源操作数即为立即数,要求以“#”为前缀 • 对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&” 5.2.1 立即寻址 llxx@ustc.edu.cn 15/77 有效立即数问题 • 并不是所有立即数都是有效的 • 在32位指令编码中存放32位立即数的方法是: – 在ARM数据处理指令中,第二操作数域12位 – 每个立即数采用一个8位的常数(bit[7:0])循环右移偶数 位而间接得到,其中循环右移的位数由一个4位二进制 (bit[11:8])的两倍表示 • 如果立即数记作,8位常数记作immed_8,4位的循 环右移值记作rotate_imm,有效的立即数是由一个8位的立即数 循环右移偶数位得到,可以表示成: • =immed_8 循环右移(2×rotate_imm) 如:mov R4, #0x8000 000A ;#0x8000 000A由0xA8循环右移0x2位得到 llxx@ustc.edu.cn 16/77 5.2.2 寄存器寻址 • 寄存器中的数值作为操作数 – 这种寻址方式是各类微处理器经常采用的一种 方式,也是一种执行效率较高的寻址方式。 – 以下指令: ADD R0,R1,R2 ;R0←R1+R2 ADD R3,R2,R1,LSL #3 ;R3=R2+R1 {} {S} ,{,} 灵活的使用第2个操作数“operand2”能够提高代码效率。 它有如下的形式: #immed_8r——常数表达式,立即寻址; Rm——寄存器寻址方式; Rm,shift——寄存器移位方式; llxx@ustc.edu.cn 18/77 ARM指令——第2个操作数 Rm,shift——寄存器移位方式 将寄存器的移位结果作为操作 数,但Rm值保持不变(移位 操作不消耗额外的时间)。 移位方法如下: 操作码 说明 操作码 说明 ASR #n 算术右移n位 ROR #n 循环右移n位 LSL #n 逻辑左移n位 RRX 带扩展的循环右移1位 LSR #n 逻辑右移n位 Type Rs Type为移位的一种类型,Rs为 偏移量寄存器,低8位有效。 ALU 桶形移位器 Rd 结果N 预 处 理 未 预 处 理 Rn Rm
桶形移位器操作 桶形移位器操作(续) 助记符说明 LSL移位热作: 移位操作结果 Y值 8 LSL逻辑左移 xLSLy x>y #1-320rRs -Ⅲ ASR算术右移 x ASR y (signed)x>>Y #1-320rRs ASR移往播作: ROR 算术左移 x RORy ((unsigned)x>>yl(x>1) RRX移往恭作: xusic.edu.cn 19m lboousic.edu.cn 207m 5.23寄存器间接寻址 5.2.4基址变址寻址 ② 寄存器间接寻址:以寄存器中的值作为操 ·将基址寄存器的内容与指令中给出的地址偏移量 作数的地址,而操作数本身存放在存储器 相加,从而得到一个操作数的有效地址。 一“变址”,改变基址 中。 一变址寻址方式常用于访问某基地址附近的地址 LDR RO,[R1] :R0←-[R1] 单元。 STR RO,[RI] [R1]+R0 ·变址方式: 前变址、自动变址(“回写”!)、后变址(“回写”!)、 偏移变址 ADD RO,R1,[R2] :R0←R1+[R2] LDRR0,[R1,#4]:R0-[R1十4],前 :可用?,查 LDRR0,[R1,#4]!:R0-[R1+4]、R1-R1十4,自 LDRR0,[R1],#4:R0-[R1]、R1-R1十4,后 LDRR0,【R1,R2】:R0-[R1+R2],偏 xBustc.edu.cn 21m .edu.cn 22m Pre or Post Indexed Addressing? 52.5多寄存器寻址 ·Pre-indexed::STRx0,【r1,121 12 020 采用多寄存器寻址方式,一条指令可以完成多个寄存器值 的传送。这种寻址方式可以用一条指令完成传送最多16个 驰 通用寄存器的值。 Auio-update formsTRx0,【r1,12】 以下指令: LDMIA RO,(R1,R2,R3,R4) ·Post-indexed:sTRr0,【r1],12 :R1-[RO] :R2-[RO+4] Offset :R3-[R0+8] 12 020c 0 :R4-[R0+12] 该指令的后缀1A表示在每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可将连续存储单元的值传送到 R1R4。 2477
llxx@ustc.edu.cn 19/77 桶形移位器操作 助记符 说明 移位操作 结果 Y值 LSL 逻辑左移 x LSL y x>y #1-32 or Rs ASR 算术右移 x ASR y (signed)x>>Y #1-32 or Rs ROR 算术左移 x ROR y ((unsigned)x>>y|(x>1) none llxx@ustc.edu.cn 20/77 桶形移位器操作(续) LSL移位操作: 0 LSR移位操作: 0 ASR移位操作: ROR移位操作: RRX移位操作: C llxx@ustc.edu.cn 21/77 5.2.3 寄存器间接寻址 寄存器间接寻址:以寄存器中的值作为操 作数的地址,而操作数本身存放在存储器 中。 LDR R0,[R1] ;R0←[R1] STR R0,[R1] ;[R1]←R0 ADD R0,R1,[R2] ;R0←R1+[R2] ;可用??? ,查 llxx@ustc.edu.cn 22/77 5.2.4 基址变址寻址 • 将基址寄存器的内容与指令中给出的地址偏移量 相加,从而得到一个操作数的有效地址。 – “变址”,改变基址 – 变址寻址方式常用于访问某基地址附近的地址 单元。 • 变址方式: 前变址、自动变址(“回写”!)、后变址(“回写”!)、 偏移变址 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],偏 0x5 0x5 r1 0x200 Base Register 0x200 r0 0x5 Source Register for STR Offset 12 0x20c 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]! Pre or Post Indexed Addressing? • Pre-indexed: STR r0,[r1,#12] • Post-indexed: STR r0,[r1],#12 llxx@ustc.edu.cn 24/77 5.2.5 多寄存器寻址 采用多寄存器寻址方式,一条指令可以完成多个寄存器值 的传送。这种寻址方式可以用一条指令完成传送最多16个 通用寄存器的值。 以下指令: LDMIA R0,{R1,R2,R3,R4} ;R1←[R0] ;R2←[R0+4] ;R3←[R0+8] ;R4←[R0+12] 该指令的后缀IA表示在每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可将连续存储单元的值传送到 R1~R4
5.2.6相对寻址 52.7堆栈寻址 堆栈是一种数据结构,按先进后出(First In Last Out 与基址变址寻址方式相类似,相对寻址以程序计数器PC的 FL0)的 当前值为基地址,指令中的地址标号作为偏移量,将两者 相加之后得到操作数的有效地址。 按SP指向的位置,分: 以下程序段完成子程序的调用和返回,跳转指令L采用了 满堆栈(Full Stack):当堆栈指针指向最后压入堆栈的数据 时: 相对寻址方式: 空堆栈(Empty Stack):当堆栈指针指向下一个将要放入数据 的空位置时: BL NEXT :跳转到子程序NEXT处执行 根据堆栈的生成方式,分: NEXT: 递增堆栈(Ascending Stack):当堆栈由低地址向高地址生 成时: MOV PC.LR :从子程序返回 递减堆栈(Decending Stack):当堆栈由高地址向低地址生成 时: xusic.edu.cn 25m 26m ARM微处理器支持的堆栈工作方式② 栈操作图示 满递增堆栈FA g s 一堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈FD 0x418 r5 SP 一堆栈指针指向最后压入的数据,且由高地址向低地址生成。 空递增堆栈EA 一堆栈指针指向下一个将要放入致据的空位置,且由低地址向高地址 生成 Dd SR r5 0x400 ·空递减堆栈ED r5 一罐技指针指向下一个将要政入数据的空仓置。且由高地址向低地址 ·堆找操作指令 0 LDM 0x3e8 STM Uco1上移植:do1reO3G0T1堆栈由高地址向低地址增长 xustc.edu.cn 277元 .edu.cn 277 子程序调用 ② 程序嵌套调用 BL SUBR branch to SUBR 物w网中 子程序里再调用子程序时会政变14,因 return to here 此遇到多层程序调用时得保存14 SUBR BL SUBI branch to SUB! sub entry point MoV pe,r14 i return 8nmx131,【0-2,141 save rogs BL SUB2 入Pc即可(没有奏似RET的语句) = 世 如果子程序要使用14的话,需要保存 存在里面的返回地址。 EDMEA E131,[r0-2,pe)return SUB2 MOV pC,:14 return lboophustc.edu.cn 077
llxx@ustc.edu.cn 25/77 5.2.6 相对寻址 与基址变址寻址方式相类似,相对寻址以程序计数器PC的 当前值为基地址,指令中的地址标号作为偏移量,将两者 相加之后得到操作数的有效地址。 以下程序段完成子程序的调用和返回,跳转指令BL采用了 相对寻址方式: BL NEXT ;跳转到子程序NEXT处执行 …… NEXT: …… MOV PC,LR ;从子程序返回 5.2.7 堆栈寻址 堆栈是一种数据结构,按先进后出(First In Last Out, FILO)的方式工作,使用一个称作“堆栈指针”的专用寄存 器(SP)指示当前的操作位置,堆栈指针总是指向栈顶。 按SP指向的位置,分: 满堆栈(Full Stack):当堆栈指针指向最后压入堆栈的数据 时; 空堆栈(Empty Stack):当堆栈指针指向下一个将要放入数据 的空位置时; 根据堆栈的生成方式,分: 递增堆栈(Ascending Stack):当堆栈由低地址向高地址生 成时; 递减堆栈(Decending Stack):当堆栈由高地址向低地址生成 时; llxx@ustc.edu.cn 26/77 llxx@ustc.edu.cn 27/77 • 满递增堆栈FA – 堆栈指针指向最后压入的数据,且由低地址向高地址生成。 • 满递减堆栈FD – 堆栈指针指向最后压入的数据,且由高地址向低地址生成。 • 空递增堆栈EA – 堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址 生成。 • 空递减堆栈ED –堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址 生成。 • 堆栈操作指令 – LDM – STM Ucosii移植:#define OS_STK_GROWTH 1 /* 堆栈由高地址向低地址增长 ARM微处理器支持的堆栈工作方式 llxx@ustc.edu.cn 28/77 栈操作图示 llxx@ustc.edu.cn 29/77 子程序调用 BL SUBR ; branch to SUBR … ; return to here … SUBR … ; sub entry point … MOV pc, r14 ; return • 转跳时返回地址存放在r14中,子程序 返回时只要把原先保存在r14的地址装 入pc即可(没有类似RET的语句) • 如果子程序要使用r14的话,需要保存 存在里面的返回地址。 llxx@ustc.edu.cn 30/77 程序嵌套调用 子程序里再调用子程序时会改变r14,因 此遇到多层程序调用时得保存r14 BL SUB1 ; branch to SUB! … … SUB1 STMFA r13!, {r0-r2, r14} ; save regs BL SUB2 … … LDMFA r13!, {r0-r2, pc} ; return SUB2 … MOV pc, r14 ; return
软中断 软中断服务程序 SWI SWI Writec output character in r0 异常中新处理程李中,取出5指令中立即款【服共型)的乡豫为 SWI SWI Exit ;return to monitor m首先确定引起款中新的I稻伞是ARM指令还是Thumb指本,这可通 过对SPR诗问得到: :SW将处理置于监控(SVC)模式,从地址Ox08开始执行 ■城后取得设期指伞的地址。这可通过诗可LR寺存器得到: 指令。 换着染出该指伞,分解出立即教。 ·系统调用类型:这些中断调用的作用与实现的系统有关。 商新产留”务 ;动取573行 潮絡胸房建嘴陈见倩增史 3D571,{R0} ;绿卉5P3家 0,40x20 婚洲 EP0,【1,21 :装是h山我坠,通疯雅◆线16生1 BKPT 1cE0,0,40xT00 :泰手:hm由拉个的8性主即款(他位 断点中断指令,用于产生款件断点,供调试程序用。 cE0,0,40000000 .edu.cn 31m 1D5!,0-3,则2,汇1*;理红4者中新道■ 异常处理 状态寄存器操作指令 处提无许多个男室同报生 周定优先进行 下面是从特殊寄存器到普通寄存器的传输指令 MRS r0,CPSR r0 :CPSR 进入异常处理的基本步潭: MRS r3,SPSR r3 :SPSR 一将下一条指令的地址存入相应连接寄存粗R 下面是把数据传输到特殊寄存器的指令 一将CPSR复制到相应的SPSR中 一根据异常类型,制设置CPSR的运行模式位 MSR CPSR,RO :复制R0到CPSR中 。幽制PC从相关的异常向量地址《下一条折令执行 MSR SPSR,RO ;复制RO到SPSR中 ,从面珠技到相应的异常处理程序处 MSR CPSR_f1g,R0;复制R0的标志位到CPSR中 MSR CPSR f1g,#0xF0000000 :NVCZ="1111" MSR SPSR all,Rm ·从异常返回: 将连接寄存R的值减去相应的偏量后送到PC MSRNE CPSR ct1,Rm MRS Rd,CPSR -热SPSR制回CPSR中 在进入异处理时设置了中断装止位,要在此清 只能改变条件 ·在user模式中,不能尝试访问SPSR,因为它不存在! .edu.cn 33m .edu.cn 34m 使用特殊寄存器指令的例子 协处理器指令 ·ARM微处理器可支持多达16个协处理器 设置V标志: M8 R CPSR E1g,#&10000000 :设置v标志但 一每个协处理器只执行针对自身的协处理指令 :不影响控制位 ARM处理器初始化协处理器的数据处理操作 一在ARM处理器的寄存器和协处理器的寄存帮之间传送 要政变模式: 亚据 MRS RO,CPSR a11 :复制PSR ·MCR ARM处速悬寄存喜→协处道暑膏存善的数据传送滑令 BICR0,R0,带E1E :清除模式位 ORRR0,R0,带new_mode :把模式位设置为新模式 ·MRC协处理琴青存景+ARM处理景青存器的数据传送指令 MSR CPSR a1l,RO :写回PSR,变更模式 一在协处理器的寄存器和存储器之间传送数据。 ·CDP协处理题最据操作指令 ·LDC处重器敷帮加蒙指令 STC曲处速存指冬 荐算然理番不能胶对完成传选操作,侧则产生未定义指 oxustc.c时u.cm 35m .edu.cn 3677
llxx@ustc.edu.cn 31/77 软中断 SWI SWI_WriteC ; output character in r0 SWI SWI_Exit ; return to monitor •SWI将处理器置于监控(SVC)模式,从地址0x08开始执行 指令。 •系统调用类型:这些中断调用的作用与实现的系统有关。 – 立即数“SWI_WriteC”和“SWI_Exit”出现在SWI指令的0~23比特, 它被操作系统用来判断用户程序调用系统例程的类型,由中断服务 程序决定是否使用。 – 当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由 通用寄存器R0的内容决定,同时,参数通过其他通用寄存器传递。 BKPT •断点中断指令,用于产生软件断点,供调试程序用。 llxx@ustc.edu.cn 32/77 软中断服务程序 SWI异常中断处理程序中,取出SWI指令中立即数(服务类型)的步骤为: 首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通 过对SPSR访问得到; 然后取得该SWI指令的地址,这可通过访问LR寄存器得到; 接着读出该SWI指令,分解出立即数。 SWI_Handler STMFD SP!, {R0-R3, R12, LR} ; 现场保护 MRS R0, SPSR ; 读取SPSR STMFD SP!, {R0} ; 保存SPSR TST R0, #0x20 ; 测试T标志位 LDRNEH R0, [LR,#-2] ; 若是Thumb指令,读取指令码(16位) BICNE R0, R0, #0xFF00 ; 取得Thumb指令的8位立即数(低8位) LDREQ R0, [LR,#-4] ; 若是ARM指令,读取指令码(32位) BICEQ R0, R0, #0xFF000000 ; 取得ARM指令的24位立即数(低23位) ... LDMFD SP!, {R0-R3, R12, PC}^ ; SWI异常中断返回 NE:Z=0 EQ:Z=1 异常处理 • 处理器允许多个异常同时发生,按固定优先级进行 处理 • 进入异常处理的基本步骤: – 将下一条指令的地址存入相应连接寄存器LR – 将CPSR复制到相应的SPSR中 – 根据异常类型,强制设置CPSR的运行模式位 – 强制PC从相关的异常向量地址取下一条指令执行 ,从而跳转到相应的异常处理程序处 • 如果异常发生时,处理器处于Thumb状态,则当 异常向量地址加载入PC时,处理器自动切换到 ARM状态。 • 从异常返回: – 将连接寄存器LR的值减去相应的偏移量后送到PC 中 – 将SPSR复制回CPSR中 – 若在进入异常处理时设置了中断禁止位,要在此清 除。 llxx@ustc.edu.cn 33/77 llxx@ustc.edu.cn 34/77 状态寄存器操作指令 下面是从特殊寄存器到普通寄存器的传输指令 MRS r0, CPSR ; r0 := CPSR MRS r3, SPSR ; r3 := SPSR 下面是把数据传输到特殊寄存器的指令 MSR CPSR, R0 ; 复制 R0 到 CPSR 中 MSR SPSR, R0 ; 复制 R0 到 SPSR 中 MSR CPSR_flg, R0 ; 复制 R0 的标志位到 CPSR 中 MSR CPSR_flg, #0xF0000000 ; NVCZ=“1111” MSR SPSR_all, Rm ; MSRNE CPSR_ctl, Rm ; MRS Rd, CPSR • 在 user模式中,不能改变CPSR的控制位,只能改变条件 标志。在其他模式中,可获得整个 CPSR。 • 在 user模式中,不能尝试访问 SPSR,因为它不存在! llxx@ustc.edu.cn 35/77 使用特殊寄存器指令的例子 设置 V 标志: MSR CPSR_flg, #&10000000 ;设置V标志但 ;不影响控制位 要改变模式: MRS R0, CPSR_all ; 复制PSR BIC R0, R0, #&1F ; 清除模式位 ORR R0, R0, #new_mode ; 把模式位设置为新模式 MSR CPSR_all, R0 ; 写回PSR,变更模式 llxx@ustc.edu.cn 36/77 协处理器指令 • ARM微处理器可支持多达16个协处理器 – 每个协处理器只执行针对自身的协处理指令 • ARM处理器初始化协处理器的数据处理操作 – 在ARM处理器的寄存器和协处理器的寄存器之间传送 数据 • MCR ARM处理器寄存器→协处理器寄存器的数据传送指令 • MRC 协处理器寄存器→ARM处理器寄存器的数据传送指令 – 在协处理器的寄存器和存储器之间传送数据。 • CDP 协处理器数据操作指令 • LDC 协处理器数据加载指令 • STC 协处理器数据存储指令 – 若协处理器不能成功完成传送操作,则产生未定义指 令异常
ARM920T协处理器 ·CDP指令用于ARM处理器通知ARM协处 ·CP14调试通信通道协处理器 理器执行特定的操作 -运行于ARM内核上的应用程序与运行于主机 ·格式: 上的调试器之间的通信 ·CP15系统控制协处理器 协处理器操作码2 -配置和控制caches、MMU、保护系统、配置 时钟模式(在bootloaderl时钟初始化用到) ·Cache清空 指令示例: ·MMU初始化、enable CDPP3,2,C12,C10,C3,4:该指令完成协处理器P3的初始化 ·TLB清空 ·。。。 .edu.cn 37m loousic.edu.cn 协处理器CP15 Cryredeatie ARM伪汇编指令ADR Urpreseshe ·配置和控制caches、 ADR伪指本特基于PC相对偏移的地址值或暴于寺存三相对偏移的地址 值谈取列奇存异中。在汇编编译器编革源狂序财,ADR伪指◆被编泽器甚 MMU、保护系统、配 换成一豪会透的指本。通者,编年三用一条ADD指本或SUB指本来来观试 置时钟模式( ADR伪指伞的动能,者不能用一条尖现,则产生话,编年夫败。 Rut can F自e3a。 bootloader在时钟初始 应用乐创【源班序): 编年后的反汇编代码: 化用到) 。。。 。 pe Cache lacklews。 ADR RO,Delay 0x20 ADD r1,pc,#0x3c Qxn小物n TII locldgus 卫nwg Delay MOV R0,r14 0x64 MOV x0,r14 LrprSrbie … e configiw的 使用伪稻伞桥程序标号 Delay的地址存入R0 ADR伤指伞被汇编成一条指令 .edu.cn 40m ARM伪汇编指令LDR ARM伪汇编指令NOP 空查集禁福梵高急帝到的去外超出或指令能操作的施调时。 NOP伪指令在汇捣时将会被代替成ARM中的空标作,比 注意:这样使用的话,代码的运行地址必须Lik时固定,不能移动. 如可能是“MOVR0,R0”指令等。 LDR r1,=Oxfff loads Oxfff into r1 NOP可用于延对标作。 LDR r1,[pc,offset_to_litpooll “ov R1,#0x1234 1itpool DCD Oxfff Delay LDR r2,=place ;loads the address of "place"into r2 NOP :空插作 -> LDR r2,[pc,offset_to_litpooll NOP NOP litpool DCD place SUBS R1,R1,01 :语环火教减一 下面的代码应该用MOV,写成LDR时被汇编器自动转回MOV语句 BNE Delay :知果环有束,Delay继 LDR :3,=0xff0 ;loads 0xtfo into r3 ;->MoVr3,#0xrt0 MOV PC,LR ;子程序嘎凹 4177 lbooustc.edu.cn 4277
• CDP 指令用于 ARM 处理器通知 ARM 协处 理器执行特定的操作 • 格式: llxx@ustc.edu.cn 37/77 CDP {条件} 协处理器编码,协处理器操作码 1,目的寄存器,源寄存器 1, 源寄存器 2,协处理器操作码 2; 其中协处理器操作码 1 和协处理器操作码 2 为协处理器将要执行的操作,目 的寄存器和源寄存器均为协处理器的寄存器,指令不涉及 ARM 处理器的寄存 器和存储器。 指令示例: CDP P3,2,C12,C10,C3,4 ;该指令完成协处理器P3的初始化 ARM920T协处理器 • CP14 调试通信通道协处理器 – 运行于 ARM 内核上的应用程序与运行于主机 上的调试器之间的通信 • CP15 系统控制协处理器 – 配置和控制caches、MMU、保护系统、配置 时钟模式(在bootloader时钟初始化用到) • Cache清空 • MMU初始化、enable • TLB清空 • 。。。 llxx@ustc.edu.cn 38/77 协处理器CP15 • 配置和控制caches、 MMU、保护系统、配 置时钟模式( bootloader 在时钟初始 化用到) llxx@ustc.edu.cn 39/77 llxx@ustc.edu.cn 40/77 ARM伪汇编指令ADR ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址 值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替 换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该 ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 ... ADR R0,Delay ... Delay MOV R0,r14 ... 应用示例(源程序): ... 0x20 ADD r1,pc,#0x3c ... ... 0x64 MOV r0,r14 ... 编译后的反汇编代码: 使用伪指令将程序标号 Delay的地址存入R0 ADR伪指令被汇编成一条指令 llxx@ustc.edu.cn 41/77 ARM伪汇编指令LDR 向寄存器加载立即数:当立即数的大小超出MOV或MVN指令能操作的范围时, 生成额外的代码(利用pc得到立即数)。 注意:这样使用的话,代码的运行地址必须在Link时固定,不能移动。 LDR r1,=0xfff ; loads 0xfff into r1 ; => LDR r1,[pc,offset_to_litpool] ; ... ; litpool DCD 0xfff LDR r2,=place ; loads the address of “place” into r2 ; ; => LDR r2,[pc,offset_to_litpool] ; ... ; litpool DCD place 下面的代码应该用MOV,写成LDR时被汇编器自动转回MOV语句 LDR r3,=0xff0 ; loads 0xff0 into r3 ; => MOV r3,#0xff0 llxx@ustc.edu.cn 42/77 NOP伪指令在汇编时将会被代替成ARM中的空操作,比 如可能是“MOV R0,R0”指令等。 NOP可用于延时操作。 mov R1,#0x1234 Delay NOP ;空操作 NOP NOP SUBS R1,R1,#1 ;循环次数减一 BNE Delay ;如果循环没有结束,跳转Delay继续 MOV PC,LR ;子程序返回 ARM伪汇编指令NOP
简单的ARM程序 Example:Hello ARM World! A文件名:TE3T1. AREA Hellow,CODE,READONLY声明代码区 使用“:”进行注将 真调试 SWI_Writec EQU &0 手输出r0中的字将 AREA Exanple1,CODE,READONLY :声明代鸟段ap1a】 SMEx雅 EQU 811 ,面序的京 ENTRY :标识程序入口 ENTRY 1代网入口 CODE32 :声明32位A5折令 START ADR r1,TEXT :r1--."Hello World' START R0,0 :没置参数 LOOP LDRB r0.[r1].81 下一李节 R1,10 CMP 0,0 ,故查文本,点 00 ADD_SUE :调用子程序aDD_8E SWINE SWI_WriteC 。者非裤点则打耳 BNE 际代码段 :线转到100P LOOP 1并返每LO0P SW SWI_Exit ADD SUE 标号格写 1教行站京 R0,0,R R0=R0+R TEXT "Hello World,&0a,&Od,0 ,子程序廷回 END :忽序随京 PC,IR END 声用文件皓京 :文件结来 boustc.cdu.cn 4377 4477 ARM ADS汇编伪指令 APCS(ARM Procedure Call Standafa) ·ALIGN EQU 地址对齐(2如边界)》 为常量起名 ·对寄存器使用的限制 ·AREA EXPO 使用栈的惯例 指定Section 定义一个可以在其他模块访 ·C0DE16 问的名称 -APCS规定数据栈为FD(满递减)类型 指示下面是Tmb(16-bit)代码 EXTERN.IMPORT ·在函数调用之间传递/返回参数 ·C0DE32 一个存在于其他模块的 指示下面是A型(32-b1t)代码 -当参兼不超过4个时,可以使用寄存器R0-R3来传递参 ·DATA GET 数: 指示当前代码段里的标号是存放数据的 相当于C中的#include ·可以被回溯的基于栈的结构的格式,用来提供从 ·DB,DCD OPT 定义初始化的数据 打印控制 失败点到程序入口的函数(和给予的参数)的列表 ENTRY ·SETS,SETA 程序入口 设置字符串变量和数据变量 SPACE ·开发一个系统,不要求一定要符合APCS。 申请空白数据空间 4577 .edu.cn 46m 寄存器命名 寄存器号 APCS名字 意义 BootLoader RO al 可以改变的输入变量 R 可以改变的输入变量 ·在系统加电后,CPU将首先执行Boot Loader a3 可以改变的输入变量 程序 3 可以改变的输入变量 一在操作系统内核运行之前,初始化硬件设备、建立 vl 不可改变的输入变量 不可改变的输入变量 内存空间的映射图,将系统的软硬件环境带到一个 3 合适的状态,以便为最终调用操作系统内核准备好 不可改变的输入变量 正确的环境。 R7 v4 不可改变的输入变量 v5 不可改变的输入变量 ·Boot Loader的两种操作模式 R9 不可改变的输入变量 -启动加载模式 R10 sl 栈限制 ·将操作系统加载到RAM中运行 R11 桢指针 -下载模式 ip 内部过程调用寄存器 ·通过串口连接或网路连接等通信手段从主机(Host)下 sp 栈指针 r 载文件,如:内核映像和根文件系统映像等 R14 连接寄存器 R15 pCoxust.u.m 程序计数器 4777 .edu.cn 4877
llxx@ustc.edu.cn 43/77 简单的ARM程序 ;文件名:TEST1.S ;功能:实现两个寄存器相加 ;说明:使用ARMulate软件仿真调试 AREA Example1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令 START MOV R0,#0 ;设置参数 MOV R1,#10 LOOP BL ADD_SUB ;调用子程序ADD_SUB B LOOP ;跳转到LOOP ADD_SUB ADDS R0,R0,R1 ;R0 = R0 + R1 MOV PC,LR ;子程序返回 END ;文件结束 使用“;”进行注释 标号顶格写 实际代码段 声明文件结束 llxx@ustc.edu.cn 44/77 AREA HelloW,CODE,READONLY ;声明代码区 SWI_WriteC EQU &0 ;输出r0中的字符 SWI_Exit EQU &11 ;程序结束 ENTRY ;代码入口 START ADR r1,TEXT ;r1---“Hello World” LOOP LDRB r0,[r1],#1 ;读取下一字节 CMP r0,#0 ;检查文本终点 SWINE SWI_WriteC ;若非终点,则打印 BNE LOOP ;并返回LOOP SWI SWI_Exit ;执行结束 TEXT = “Hello World”,&0a,&0d,0 END ;程序结束 Example: Hello ARM World! llxx@ustc.edu.cn 45/77 ARM ADS汇编伪指令 • ALIGN 地址对齐(2n边界) • AREA 指定Section • CODE16 指示下面是Thumb(16-bit)代码 • CODE32 指示下面是ARM(32-bit)代码 • DATA 指示当前代码段里的标号是存放数据的 • DCB,DCD 定义初始化的数据 • ENTRY 程序入口 • EQU 为常量起名 • EXPORT 定义一个可以在其他模块访 问的名称 • EXTERN, IMPORT 申明一个存在于其他模块的 名称 • GET相当于C中的#include • OPT打印控制 • SETS, SETA 设置字符串变量和数据变量 • SPACE申请空白数据空间 llxx@ustc.edu.cn 46/77 APCS( ARM Procedure Call Standard) • 对寄存器使用的限制 • 使用栈的惯例 – APCS规定数据栈为FD(满递减)类型 • 在函数调用之间传递/返回参数 – 当参数不超过4个时,可以使用寄存器R0~R3来传递参 数; • 可以被‘回溯’的基于栈的结构的格式,用来提供从 失败点到程序入口的函数(和给予的参数)的列表 • 开发一个系统,不要求一定要符合APCS。 llxx@ustc.edu.cn 47/77 寄存器命名 寄存器号 APCS名字 意义 R0 a1 可以改变的输入变量 R1 a2 可以改变的输入变量 R2 a3 可以改变的输入变量 R3 a4 可以改变的输入变量 R4 v1 不可改变的输入变量 R5 v2 不可改变的输入变量 R6 v3 不可改变的输入变量 R7 v4 不可改变的输入变量 R8 v5 不可改变的输入变量 R9 v6 不可改变的输入变量 R10 sl 栈限制 R11 fp 桢指针 R12 ip 内部过程调用寄存器 R13 sp 栈指针 R14 lr 连接寄存器 R15 pc 程序计数器 BootLoader • 在系统加电后,CPU 将首先执行 Boot Loader 程序 – 在操作系统内核运行之前,初始化硬件设备、建立 内存空间的映射图,将系统的软硬件环境带到一个 合适的状态,以便为最终调用操作系统内核准备好 正确的环境。 • Boot Loader 的两种操作模式 – 启动加载模式 • 将操作系统加载到 RAM 中运行 – 下载模式 • 通过串口连接或网络连接等通信手段从主机(Host)下 载文件,如:内核映像和根文件系统映像等 llxx@ustc.edu.cn 48/77
BOOT的一般步骤 设置中断向量表 ·设置中断向量表 ·每个中断只占据向量表中1个字的存储空间,放置一条ARM跳 转指令: 初始化存储设备 ·中断向量表的程序实现通常如下表示: AREA Boot,CODE,READONLY ·初始化堆栈 ENTRY B???ResetHandler ·初始化用户执行环境 B???UndefHandler ·调用主应用程序 -B? PreAbortHandler -B???DataAbortHandler -B B???IROHandler B???F .edu.cn 4m lboousic.edu.cn 5077 初始化存储设备 初始化堆栈 ·片上存储系统初始化 “鞋稀镜台 然后 (MPU): ,注意:不要切损现Use模式进行User模式的蛛栈议置 堆栈初始化的代码示例 片外存情系统初始化:如SDRAM初始化 一mrsr0,cpsr:读取cpsr寄存器的值 骏的都新验光a以外接一个 bcr0.rO,MODEMASK:把梳式位清零 orr r1.r0.#UNDEFMODE|NOINT 。共13个寄存器 msr cpsr_cxsf.r1 :UndefMode -位宽:BWSCON寄存瀑 -边sp,=UndefSta ·所速搜存钟花片的位真,.8、16、32等 堆栈地址的定义一般如下: -(_ISR_STARTADDRESS-0x1400) UserStack#1024=ield,定义一个数据域,长度为1024 一行扫捕到列扫描的延时 SVCStack 1024 一刷新率 BANKSIZE IRQStack ,模试设量 .edu.cn 51m .edu.cn 527m 初始化用户执行环境 基于ARM的开发环境 ·完成必要的从ROM到RAM的数据传输和内容 清零 -主要是把RO、RW、Z三段拷贝到指定的位置 ·一个ARM映像文件构成 -RO,代码段,可在ROM、RAM中 -RW,已初始化的全局变量,需在RAM中 ■ 一ZI,未初始化的全局变量,需在RAM中 ·调用主应用程序 IMPORT main -B???Main 5477
BOOT的一般步骤 • 设置中断向量表 • 初始化存储设备 • 初始化堆栈 • 初始化用户执行环境 • 调用主应用程序 llxx@ustc.edu.cn 49/77 设置中断向量表 • 每个中断只占据向量表中1个字的存储空间,放置一条ARM跳 转指令; • 中断向量表的程序实现通常如下表示: • AREA Boot ,CODE, READONLY – ENTRY – B??? ResetHandler – B??? UndefHandler – B??? SWIHandler – B??? PreAbortHandler – B??? DataAbortHandler – B – B??? IRQHandler – B??? FIQHandler – 其中关键字ENTRY是指定编译器保留这段代码,因为编译器可能 会认为这是一段亢余代码而加以优化。链接的时候要确保这段代 码被链接在0地址处,并且作为整个程序的入口。 llxx@ustc.edu.cn 50/77 初始化存储设备 • 片上存储系统初始化 – 许多ARM处理器都有片上存储器系统,如cache和紧密耦合 存储器(TCM)、存储器管理单元(MMU)或存储器保护单元 (MPU)。 • 片外存储系统初始化:如SDRAM初始化 – TQ2440的地址分为0~7八个bank,每个bank可以外接一个 存储设备,初始化即初始化每个bank的寄存器 • 共13个寄存器 – 位宽:BWSCON寄存器 • 所连接存储芯片的位宽,8、16、32等 – bank0的位宽由硬件决定,不需要我们去配置 – bank1~7的宽度都是可以软件控制的 – 行扫描到列扫描的延时 – 刷新率 – BANKSIZE – 模式设置 llxx@ustc.edu.cn 51/77 初始化堆栈 • 对程序中需要用到的每一种模式都要给SP定义一个堆栈地址 – 方法:改变状态寄存器的状态位,使处理器切换到不同的状态,然后给 SP赋值。 • 注意:不要切换到User模式进行User模式的堆栈设置 • 堆栈初始化的代码示例 – mrs r0,cpsr ;读取cpsr寄存器的值 – bic r0,r0,#MODEMASK ;把模式位清零 – orr r1,r0,#UNDEFMODE|NOINT – msr cpsr_cxsf,r1 ;UndefMode – ldr sp,=UndefStack • 堆栈地址的定义一般如下: – ^ (_ISR_STARTADDRESS-0x1400) – UserStack # 1024 ;#=field,定义一个数据域,长度为1024 – SVCStack # 1024 – UndefStack # 1024 – AbortStack # 1024 – IRQStack # 1024 – FIQStack # 0 llxx@ustc.edu.cn 52/77 初始化用户执行环境 • 完成必要的从ROM到RAM的数据传输和内容 清零 – 主要是把RO、RW、ZI三段拷贝到指定的位置 • 一个ARM映像文件构成 – RO,代码段,可在ROM、RAM中 – RW,已初始化的全局变量,需在RAM中 – ZI,未初始化的全局变量,需在RAM中 • 调用主应用程序 – IMPORT main – B??? Main llxx@ustc.edu.cn 53/77 基于ARM的开发环境 llxx@ustc.edu.cn 54/77
ADS(ARM Developer Suite) 作业 由六部分组成: ·熟悉ADS,设计一个冒泡排序程序。 ·代码生成工具(Code Generation Tools) ·条件执行的特点和作用? 集成开发环境( CodeWarrior IDE from Metrowerks) 调试器(Debuggers) ·起攀桃器instrucion ·ARM开发包(ARM Firmware Suite) ·ARM应用库(ARM Applications Library) .edu.cn 55m xustc.edu.cn 57m
ADS(ARM Developer Suite) 由六部分组成: • 代码生成工具(Code Generation Tools) • 集成开发环境( CodeWarrior IDE from Metrowerks) • 调试器(Debuggers) • 指令集模拟器(Instruction Set Simulators) • ARM 开发包(ARM Firmware Suite) • ARM应用库(ARM Applications Library) llxx@ustc.edu.cn 55/77 作业 • 熟悉ADS,设计一个冒泡排序程序。 • 条件执行的特点和作用? llxx@ustc.edu.cn 57/77