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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • javascript三目运算符的嵌套

    javascript三目运算符的嵌套普通的三目运算符比较简单,就不做介绍了,如(expr1)?(expr2):(expr3),之前在使用三目运算符嵌套的时候,我是这样用的(expr1)?(expr2)

  • Android开发——RelativeLayout.LayoutParams的使用「建议收藏」

    Android开发——RelativeLayout.LayoutParams的使用「建议收藏」前言在日常的Android开发当中,我们少不了需要动态改变控件在RelativeLayout界面的位置。那么我们就需要使用到RelativeLayout.LayoutParams。RelativeLayout.LayoutParamsRelativeLayout.LayoutParams是一个RelativeLayout的布局参数,我们改变控件的就需要使用到。初始化//包裹内容Rel…

  • SQL语句distinct的多个字段去重问题

    SQL语句distinct的多个字段去重问题经典例子selectdistinctname,idfromtable或者selectname,idfromtablegroupbyname像这样是错误的写法,distinct不起作用的曲线救国写法:selectname,idfromtablewhereidin(selectmin(id)fromtablegrou……

    2022年10月22日
  • activity的用法总结_pagemanager

    activity的用法总结_pagemanagerActivityManager总结列表1.公共方法(1)getMemoryClass()通过以兆为单位获取当前应用可用的内存大小。(2)getLargeMemoryClass()当开发者在manifest文件中的标签中设置largeHeap属性的值为”true”时,当前应用就可以获取到系统分配的最大堆内存.如果你设置了该值,可以通过ActivityMa

  • 傅里叶分析(转自知乎)

    傅里叶分析(转自知乎)微博:@花生油工人知乎专栏:与时间无关的故事谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。—

  • srvctl命令_clc命令

    srvctl命令_clc命令SRVCTL命令可以控制RAC数据库中的instance,listener以及services。通常SRVCTL在ORACLE用户下执行。下面我们来介绍srvctl命令。1、通过SRVCTL命令来start/stop/check所有的实例:$srvctlstart|stop|statusdatabase-d<db_name>2、start/stop指定的实例:$srvctl…

发表回复

您的电子邮箱地址不会被公开。

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