1、LDR r0, label 和 LDR r0, =label的区别
LDR 是ARM中的指令,也是伪指令。
当用 LDR r0, =num
编译时,编译器会根据num是否能表示为立即数,决定用 ldr 指令或者是mov或mvn指令。
当num能表示为立即数,就将它翻译成一条mov或mvn指令。不能,编译器会将num存在一个内存单元中,然后再用一条ldr指令加载这个内存单元的的值到r0中。
LDR r0, label 和 LDR r0, =label的区别:
LDR r0, =label 会把label表示的值加载到r0中,相当于直接赋值。
LDR r0, label 会把label当做地址,把label指向的地址中的值加载到r0中,相当于指针操作.
譬如 label的值是 0x8000, LDR r0, =label会将 0x8000加载到r0中,而LDR r0, label则会将内存0x8000处的值加载到r0中。
————————————————
版权声明:本文为CSDN博主「铍镁钙锶钡镭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq1113231395/article/details/83650069
2、ldr和bl的区别
ldr和bl在启动程序中,都是可以负责pc跳转的指令。
1)bl是地址无关指令,和当前的运行地址无关,链接器脚本中标明了一个运行地址,但是arm中的代码实际是从地址0开始运行的。这个时候实际的地址和运行地址不相符,如果想让程序正常的运行,就必须使用地址无关指令。比如在完成将程序复制到内存之前想要跳转到一个函数里,就必须使用bl,因为bl跳转依靠的是相对地址,和运行地址无关,所以能完成跳转。
2)ldr是地址有关指令,如果这个时候使用“ldr pc,=函数名”来跳转,实际上是跳转到这个函数在链接器脚本中标明的地址上了。所以使用地址相关指令之前,要把代码复制到链接器脚本中指明的那个地址上,否则程序就跑飞了。复制完成之后再使用ldr跳转到内存中,使程序继续运行。
————————————————
版权声明:本文为CSDN博主「猪皮哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013368345/article/details/91882554