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

ARM的中断向量表,及DCD伪指令当中断或异常发生的时候,CPU自动将PC指向一个特定的地址,这个地址就是中断向量表。在32位ARM系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现程序跳转到中断服务例程的功能。例如: IRQEntryBHandleIRQ;跳转范围较小 LDRPC,=HandleFIQ   ;LDR伪指令等效生成1条存储读取指令和1条32位常数定义

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

当中断或异常发生的时候,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  
ARM的中断向量表,及DCD伪指令

上面中断向量表的第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语言实现中断的时候 ,直接将函数地址赋值给中断向量表 ,我觉着应该是将一条跳转指令赋给中断向量表才符合上面所讲,在此还有疑问但是我猜测,我猜测经过编译后该中断向量表处还是一条跳转指令,跳转的地址就是向该地址写入的值。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223027.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • iframe高度自适应_读取跨域iframe

    iframe高度自适应_读取跨域iframe采用JavaScript来控制iframe元素的高度是iframe高度自适应的关键,同时由于JavaScript对不同域名下权限的控制,引发出同域、跨域两种情况。由于客户端js使用浏览器的同源安全策略,跨域情况下,被嵌套页面如果想要获取和修改父页面的DOM属性会出现权限不足的情况,提示错误:Permissiondeniedtoaccessproperty’document’。这是

    2022年10月12日
    5
  • MySql优化

    MySql优化MySql优化

    2022年4月23日
    48
  • 静心经

    静心经静心经 nbsp nbsp 老君曰 大道无形 生育天地 大道无情 运行日月 大道无名 長养万物 吾不知其名 强名曰道 夫道者 有清有浊 有动有静 天清地浊 天动地静 男清女浊 男动女静 降本流末 而生万物 清者 浊之源 动者 静之基 人能常清静 天地悉皆归 夫 人神好清 而心忧之 人心好静 而欲牵之 常能遣其欲 而心自静 澄其心 而神自清 自然六欲不生 三毒消滅 所以

    2025年10月31日
    4
  • angular5面试题_大数据面试题

    angular5面试题_大数据面试题Angular更新还是非常快的,目前(2020)的速度是每年2个主版本。网上也有不少面试题,不过很多都是针对老的版本,尤其是AngularJS的。因为最近在看Angular的面试题,所以特意总结一下。下面内容都是基于Angularv8.0以上的。顺便科普一下,Angular最早期的版本,也叫AnugularJS,使用javascript开发;新的版本,才叫Angular,也称为Angular2,使用typescript开发,Angular和AngularJS是不兼容的(当然也有2个版本的集成方案)。

    2022年10月18日
    3
  • eMule 站点收集[通俗易懂]

    eMule 站点收集[通俗易懂]http://www.simplecd.org/http://qvocd.com/http://www.ied2k.com/http://www.thshare.net/http://www.eastgame.nethttp://www.chnp2p.com/http://www.hatrix.org/http://www.emule-ed2k.com/htt…

    2022年7月15日
    19
  • ubuntu svn命令 tab补全(linux安装svn客户端)

    ubuntuSVN命令大全1、将文件checkout到本地目录svncheckout path(path是服务器上的目录)例如:svncheckoutsvn://192.168.1.1/pro/domain简写:svnco2、往版本库中添加新的文件svn add file例如:svn add test.php(添加te

    2022年4月11日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号