首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

关于arm7汇编指令中的BL的有关问题

2012-03-13 
关于arm7汇编指令中的BL的问题。我在看一个ADS自带的swi的例子时,遇到了这么一个问题:vec(routine-(unsign

关于arm7汇编指令中的BL的问题。
我在看一个ADS自带的swi的例子时,遇到了这么一个问题:

vec   =   (routine   -   (unsigned)vector   -   8)   > >   2;

这句话老师告诉我是为了算出软中断处理程序距软中断向量的相对位置。
然后我问为什么减8,再右移两位。在arm手册中找到了,关于bl:

<target_address>
Specifies   the   address   to   branch   to.   The   branch   target   address   is   calculated   by:
1.   Sign-extending   the   24-bit   signed   (two 's   complement)   immediate   to   32   bits.
2.   Shifting   the   result   left   two   bits.
3.   Adding   this   to   the   contents   of   the   PC,   which   contains   the   address   of   the   branch   instruction   plus   8.

我理解的是把 "bl   address "中的 addr 取出来先扩展成32位,再左移两位,再加到pc上,再加8。
我想问的是:是不是我们写 "bl   address "这条指令后,编译时,编译器就把   addr   就做了扩展,左移的操作,当执行软中断时,把   addr   取出来,加到pc中,再加8,就跳转到软中断处理程序了,是这个样子吗?如果是的话,编译器为什么做这一系列的操作,有什么好处吗?



[解决办法]
这是为了在中断向量里拼凑出一个跳转指令,该指令的结构里要求带偏移地址,偏移地址就是上面那个算法,意思是:中断向量到处理程序的偏移,考虑到流水线预取,再减去8,两条指令。因为偏移以指令为单位,所以再除4,即> > 2.

热点排行