ARM的中断向量表,及DCD伪指令

当中断或异常发生的时候,CPU自动将PC指向一个特定的地址,这个地址就是中断向量表。

在32位ARM系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现程序跳转到中

断服务例程的功能。例如: 
IRQEntry B HandleIRQ ;跳转范围较小 
LDR PC,=HandleFIQ     

;LDR伪指令等效生成1条存储读取指令和1条32位常数定义指令。32位常数存储在LDR指令四周的存储单元
中,相对偏移小于4KB。该32位数据就是要跳转到的中断服务程序入口地址。 
之所以使用LDR伪指令,是因为ARM的RISC指令为单字指令,不能装载32位的立即数 (常数),无法直接
把一个32位常数数据或地址数据装载到寄存器中。所以我们一般将中断向量按如下方式设置中断向量表

[plain]  view plain  copy
  1. LDR     PC, Reset_Addr             1  
  2. LDR     PC, Undefined_Addr  
  3. LDR     PC, SWI_Addr  
  4. LDR     PC, Prefetch_Addr  
  5. LDR     PC, Abort_Addr  
  6. NOP                             ; Reserved vector must be remained  
  7. LDR     PC, IRQ_Addr  
  8. LDR     PC, FIQ_Addr  
  9.    
  10. Vector_Addr_Table  
  11.    
  12. Reset_Addr      DCD     Reset_Handler          9  
  13. Undefined_Addr DCD     UndefinedHandler  
  14. SWI_Addr        DCD     SWIHandler  
  15. Prefetch_Addr   DCD     PrefetchAbortHandler  
  16. Abort_Addr      DCD     DataAbortHandler  
  17. IRQ_Addr        DCD     IRQHandler  
  18. FIQ_Addr        DCD     FIQHandler  
上面中断向量表的第9行就是从地址0X00000020开始分配一个字的空间(也就是4字节),这4个字节的内容就是Reset_Handler函数的地址0X00001000。Reset_Addr的值就是这4个字节的首地址0X00000020。
DCD是ARM的伪指令。作用是分配一个字的空间。功能类似于C51里定义一个数组并初始化。
Unsigned char Reset_Addr[4]={0x00,0x00,0x10,0x00};
对比一下就明白了。
 
再分析第1行。LDR只能在当前PC的4KB范围内跳转,B命令只能在当前PC的32MB范围内调转。
Reset_Handler的地址是0X00001000,已经超出了当前PC的4K范围,所以不能用
LDR     PC,  Reset_Handler
这里不好理解,涉及到ARM的寻址方式。
LDR Rn,语句标号
这种表达式里,是相对寻址,基址是程序计数器PC,偏移量是语句标号到PC处的指令条数。
LDR PC,语句标号只能在当前PC的4KB范围内跳转的原因是这条指令译码后,偏移表达式占用指令代码32位的最后12位,也就是2^12=4KB。
 
完整的分析下,以复位为例。地址0X00000020开始的4字节内容是复位处理函数Reset_Handler的地址0x00001000。Reset_Addr的地址是0X00000020。当产生复位时,PC=0x00000000,跳到第1行语句执行。LDR     PC, Reset_Addr把 0X00000020处的一个字的内容送到PC,然后PC跳转到0X00001000处开始执行。
LDR     PC, Reset_Addr是间接寻址,就是把地址Reset_Addr处的一个字送


/************************************************************************************/
 以下内容是自己猜测补充,在看课程的时候,用C语言实现中断的时候 ,直接将函数地址赋值给中断向量表 ,我觉着应该是将一条跳转指令赋给中断向量表才符合上面所讲,在此还有疑问但是我猜测,我猜测经过编译后该中断向量表处还是一条跳转指令,跳转的地址就是向该地址写入的值。
  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
原作者:宛城布衣。 本文件已移除PDF签名,如内容有误,欢迎大家指正。 目录 前言 i 目录 I ARM7TDMI(-S)指令集及汇编1 ARM 处理器寻址方式2 寄存器寻址2 立即寻址2 寄存器偏移寻址2 寄存器间接寻址3 基址寻址3 多寄存器寻址4 堆栈寻址4 块拷贝寻址5 相对寻址5 指令集介绍7 ARM 指令集7 指令格式7 第 2 个操作数7 #immed_8r 7 Rm8 Rm,shift8 条件码9 ARM 存储器访问指令 11 LDR 和 STR 11 LDM 和 STM14 SWP 17 ARM 数据处理指令19 数据传送指令20 MOV 20 MVN 20 算术逻辑运算指令20 ADD 20 SUB21 RSB 21 ADC 21 SBC 21 RSC 22 AND 22 ORR22 EOR22 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII BIC 23 第 I 页常用 ARM 指令集及汇编 Ver:1010 比较指令23 CMP 23 CMN23 TST24 TEQ24 乘法指令25 MUL25 MLA25 UMULL25 UMLAL26 SMULL 26 SMLAL 26 ARM 跳转指令27 B27 BL27 BX 27 ARM 协处理器指令28 CDP28 LDC29 STC 29 MCR30 MRC30 ARM 杂项指令31 SWI 31 MRS 32 MSR 33 ARM 伪指令34 ADR 35 ADRL35 LDR36 NOP37 Thumb 指令集39 Thumb 指令集与 ARM 指令集的区别 39 Thumb 存储器访问指令 40 LDR 和 STR 41 PUSH 和 POP 43 LDMIA 和 STMIA 43 Thumb 数据处理指令 45 数据传送指令46 MOV 46 MVN 46 NEG47 算术逻辑运算指令47 ADD 47 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 第 II 页常用 ARM 指令集及汇编 Ver:1010 SUB48 ADC 49 SBC 49 MUL50 AND 50 ORR50 EOR51 BIC 51 ASR51 LSL52 LSR 52 ROR53 比较指令53 CMP 53 CMN54 TST54 Thumb 跳转指令 55 B 55 BL55 BX 55 Thumb 杂项指令 56 SWI 56 Thumb 伪指令 57 ADR 57 LDR57 NOP58 伪指令59 符号定义伪指令59 GBLA、GBLL、GBLS 59 LCLA、LCLL、LCLS60 SETA、SETL、SETS 61 RLIST61 CN 62 CP62 DN、SN62 FN63 数据定义伪指令63 LTORG64 MAP64 FIELD 65 SPACE66 DCB 66 DCDDCDU67 DCDO 67 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 第 III 页常用 ARM 指令集及汇编 Ver:1010 DCFD 和 DCFDU68 DCFS 和 DCFSU68 DCI69 DCQ 和 DCQU69 DCW 和 DCWU 70 报告伪指令70 ASSERT 70 INFO 71 OPT 71 TTL 和 SUBT 72 汇编控制伪指令73 IF、ELSE 和 ENDIF73 MACRO 和 MEND 74 WHIL 和 WEND 75 杂项伪指令76 ALIGN 77 AREA78 CODE16 和 CODE32 79 END 80 ENTRY80 EQU 81 EXPORT 和 GLOBAL 81 IMPORT 和 EXTERN 82 GET 和 INCLUDE 83 INCBIN83 KEEP83 NOFP 84 REQUIRE 84 PEQUIRE8 和 PRESERVE8 84 RN 84 ROUT85 ARM 伪指令86 ADR 86 ADRL86 LDR86

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值