历史上的今天
今天是:2025年12月07日(星期日)
2022年12月07日 | s3c2440裸机之中断向量的写法(二)
2022-12-07 来源:zhihu
先说明一下LDR伪指令。
LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中。
语法格式
LDR{cond} register,={expr|label-expr}其中的符号及参数说明如下:
●cond为可选的指令执行条件。
●register为目标寄存器。
●expr为32位的常量,编译器将根据expr的取值情况,处理LDR伪指令如下。
●当expr表示的地址值没有超过MOV或MVN指令中地址的取值范围时,编译器使用合适的MOV或者MVN指令替代该LDR伪指令。
●当expr表示的地址超过了MOV或MVN指令中地址的取值范围时,编译器将该常数放在数据缓冲区中,同时用一条基于PC的LDR指令读取该常数。
●label-expr为基于PC的地址表达式或者是外部表达式。当label-expr为基于PC的地址表达式时,编译器将label-expr表示的数值放在数据缓冲区中,同时用一条基于PC的LDR指令读取该值。当label-expr为外部表达式,或者非当前段的表达式时,汇编编译器将在目标文件中插入链接重定位伪操作,这样链接器将在链接是生成该地址。
使用LDR伪操作编写中断向量表如下:
/* 中断向量表的第二种写法 */ ldr pc ,= reset ldr pc ,= undefined_instruction ldr pc ,= software_interrupt ldr pc ,= prefetch_abort ldr pc ,= data_abort ldr pc ,= not_used ldr pc ,= irq ldr pc ,= fiq reset: b reset undefined_instruction: b undefined_instruction software_interrupt: b software_interrupt prefetch_abort: b prefetch_abort data_abort: b data_abort not_used: b not_used irq: b irq fiq: b fiq
反汇编结果如下:
33f80000 <.text>: 33f80000: e59ff038 ldr pc, [pc, #56] ; 33f80040 <.text+0x40> 33f80004: e59ff038 ldr pc, [pc, #56] ; 33f80044 <.text+0x44> 33f80008: e59ff038 ldr pc, [pc, #56] ; 33f80048 <.text+0x48> 33f8000c: e59ff038 ldr pc, [pc, #56] ; 33f8004c <.text+0x4c> 33f80010: e59ff038 ldr pc, [pc, #56] ; 33f80050 <.text+0x50> 33f80014: e59ff038 ldr pc, [pc, #56] ; 33f80054 <.text+0x54> 33f80018: e59ff038 ldr pc, [pc, #56] ; 33f80058 <.text+0x58> 33f8001c: e59ff038 ldr pc, [pc, #56] ; 33f8005c <.text+0x5c> 33f80020: eafffffe b 33f8002033f80024: eafffffe b 33f80024 33f80028: eafffffe b 33f80028 33f8002c: eafffffe b 33f8002c 33f80030: eafffffe b 33f80030 33f80034: eafffffe b 33f80034 33f80038: eafffffe b 33f80038 33f8003c: eafffffe b 33f8003c 33f80040: 33f80020 mvnccs r0, #32 ; 0x20 33f80044: 33f80024 mvnccs r0, #36 ; 0x24 33f80048: 33f80028 mvnccs r0, #40 ; 0x28 33f8004c: 33f8002c mvnccs r0, #44 ; 0x2c 33f80050: 33f80030 mvnccs r0, #48 ; 0x30 33f80054: 33f80034 mvnccs r0, #52 ; 0x34 33f80058: 33f80038 mvnccs r0, #56 ; 0x38 33f8005c: 33f8003c mvnccs r0, #60 ; 0x3c
可以看出,LDR伪指令被编译器编译后,将地址常量存放在代码段的最后,并使用相对于PC偏移的地址进行访问。其中,地址常量为固定的0x33f80020...,也就是符号的地址在链接阶段已经确定了。
当代码运行于0地址时(重定位前),这条指令将使PC指向运行时地址,这时运行时地址还没有指令,所以会出错误。所以LDR register,=label-expr是地址相关的。
上一篇:s3c2440时钟频率设置
史海拾趣
|
我从文件中读出一段文字然后显示到另一个窗口上,可是当我穿硬代码时能顺利显示,但是变量中的值不能显示(其中的值我messagebox出来是独到的东西,即变量不为空),请大侠们指教。。。… 查看全部问答> |
|
1、为什么我编译成功的eboot.bin烧写到nor中不起作用?害得我每次都的烧写eboot.nb0,但是板商提供的bootloader是.bin格式的 怎么才能让.bin格式的eboot在nor中运行起来?是在boot.bib中有一些选项吗? 2、我编译的eboot有256k太大了,每次烧写都 ...… 查看全部问答> |
|
小弟最近想做一下关于arm2410于java结合方面的论文,但苦于对arm了解甚少,不知道java是否可在arm上很好的搭建,两者结合起来做哪方面的比较好?以及java于c++相比到底优势在哪里?那位仁兄有好的idear可以分享一下!!… 查看全部问答> |
|
如果想得到zigbee网络中所有节点的如下信息:ieee address,short address,type(coordinator,router,end device),应该怎样做?我用的是Ti的z-stack协议栈,CC2430,我不知道该用mt,还是zdo或是其他的?我应该从哪方面去找这些资料呢?还希望过来人能点提示 ...… 查看全部问答> |
|
LED灯相对于普通灯泡有哪些优点 1、节能,比传统白炽灯节电80%以上,相同功率下亮度是白炽灯的10倍; 2、寿命超长,50,000小时以上,是传统钨丝灯的50倍以上; 3、没有有害气体,如汞; 4、没有任何射线,如紫外线; ...… 查看全部问答> |
|
闲散电子配件一批,详见清单 上次在OURDEV发过一次,但因为资料没整理好,只卖出去一部分,这次重发,并加了东西,~ 欢迎竟拍! 快速恢复二极管 ,BYC10B, 600V-10A ,数量 80只,全新 27N25,250V,27A,NMOS管 ,数量30只,已折脚 TS ...… 查看全部问答> |
|
作者从网格纸出发,一路走来,从他的经历讲述了各种软件的特点 我用eda软件画板有些年头了,今天写点也算是个总结,权当回忆吧 很久很久以前……偶见到了tango,那时候我觉得还不如用网格纸画电路板方便,而且觉得 ...… 查看全部问答> |
|
嗯 这么一个事情啊 我要做一个东西。。。需要单片机来对外部的两个频率不同的脉冲计数 嗯 搜了一下 然后好多人说 可以用计时器A来计数 有人说用 TACLK 有人说用捕获 问题是 计时器A的 TAR只有 ...… 查看全部问答> |




