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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c# pdb文件_pdb文件是什么

    c# pdb文件_pdb文件是什么C++编译生成的pdb文件就是符号表。这些符号表,程序运行的时候没有用。但调试的时候有用,主要记录如下东西:全局变量 局部变量 函数名及其实体指针地址 帧指针表 源代码行数使用pdb文件进行调试,要和当前运行的程序一致。…

    2022年10月21日
    0
  • JAVA:定时器的三种方法(详细注解)

    JAVA:定时器的三种方法(详细注解)第一种:创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果,代码如下:publicclassTask1{ publicstaticvoidmain(String[]args){ //runinasecond //每一秒钟执行一次 finallongtimeInterval=10…

    2022年9月18日
    0
  • 信号带宽和信道带宽_信号带宽大于信道带宽

    信号带宽和信道带宽_信号带宽大于信道带宽信号带宽:一个信号可以分解为一系列不同频率正余弦函数的加权和。带宽,就是那些对应的加权非零部分对应的三角函数的频率宽度。信号频谱的宽度,也就是信号的最高频率分量与最低频率分量之差。例如,比如我们学过的sin(x)函数,就是一个信号,sin(x)是一个三角函数,所以其若用傅里叶级数表示,加权非零部分就是该信号本身。其对应的信号的带宽就是1HZ.(因其只有一个频率)。再例如:一个由数个正弦波叠加成的方…

    2022年10月11日
    0
  • navicat15 mac 激活码(JetBrains全家桶)

    (navicat15 mac 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsaWN…

    2022年3月22日
    52
  • POJ2029——Get Many Persimmon Trees

    POJ2029——Get Many Persimmon Trees

    2022年1月4日
    36
  • 面试官:说下什么是TCP 的粘包和拆包?

    面试官:说下什么是TCP 的粘包和拆包?

    2022年2月20日
    51

发表回复

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

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