ldr与adr的区别
ldr r0, _start
adr r0, _start
ldr r0, =_start
nop
mov pc, lr
_start:
nop
编译的时候设置 RO 为 0x0c008000
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
0c008000 :
c008000: e59f000c ldr r0, [pc, #12] ; c008014
c008004: e28f0008 add r0, pc,...
看下面的代码:
ldr r0, _start
adr r0, _start
ldr r0, =_start
nop
mov pc, lr
_start:
nop
编译的时候设置 r0 为 0x0c008000
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
0c008000 :
c008000: e59f000c ldr r0, [pc, #12] ; c008014
c008004: e28f0008 add r0, pc,...
本帖最后由 crifan 于 2011-04-18 00:15 编辑
关于为何不直接用mov指令,而非要用adr伪指令
在分析uboot的start.S中,看到一些指令,比如:[code]adr r0, _start[/code]觉得好像可以直接用mov指令实现即可,为啥还要这么麻烦地,去用ldr去实现?
关于此处的代码,为何要用adr指令:[code]adr r0, _start[/code](注:其被编译器编译后,会被翻译成:[code]sub r0, pc, #172[/code])而不直接用mov指令直接将_start的值赋值给r0...
ARM汇编有ldr指令以及ldr、adr伪指令,他门都可以将标号表达式作为操作数...
ARM汇编有ldr指令以及ldr、adr伪指令,他门都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别。
ldr r0, _start
adr r0, _start
ldr r0, =_start
_start:
b _start
编译的时候设置 RO 为 0x30000000,下面是反汇编的结果:
0x00000000: e59f0004 ldr r0, [pc, #4] ; 0xc
0x00000004: e28f0000 add r0, pc, #0 ; 0x0
0x00...
假设程序中有个语句标号a_proc
指令 ldr r0, =a_proc
和伪指令 adr r0, a_proc
是否等效啊
感觉 adr 这个伪指令似乎没有存在价值
是不是我理解有误呢
它们到底有什么区别呢
[ 本帖最后由 zhuhefang2006 于 2008-10-20 23:18 编辑 ]
问题,就是上边的,LDR与伪汇编的区别难道只是一个=么?
adr与adrL的区别是什么呢?
当然,首先请帮我解释一下这两个指令是做什么用的,最好详细点!
还有align与.align和.balignl的区别是什么,最后这两个混淆了。
因为是初学者,天天有问题,抱歉啊。多帮帮忙啦!!!