3.9.6. 汇编中的ldr+标号,来实现C中的函数调用

接着上面的内容,继续解释,对于汇编中这样的代码:

第一种:

ldr pc, 标号1
......
标号1:.word 标号2
......
标号2:
	......(具体要执行的代码)
        

或者是,

第二种:

ldr pc, 标号1
......
标号1:.word XXX(C语言中某个函数的函数名)
        

的意思就是,将地址为标号1中内容载入到pc中。

而地址为标号1中的内容,就是标号2。

TEXT_BASE=0x33D00000

所以上面第一种的意思:

就很容易看出来,就是把标号2这个地址值,给pc,即实现了跳转到标号2的位置执行代码,

就相当于调用一个函数,该函数名为标号2.

第二种的意思,和上面类似,是将C语言中某个函数的函数名,即某个地址值,给pc,实现调用C中对应的那个函数。

两种做法,其含义用C语言表达,其实很简单:

PC = *(标号1) = 标号2

例 3.1. 汇编中的ldr加标号实现函数调用 示例

举个例子就是:

第一种:

......
	ldr	pc, _software_interrupt
......
_software_interrupt:	.word software_interrupt
......
software_interrupt:
	get_bad_stack
	bad_save_user_regs
	bl 	do_software_interrupt
            

就是实现了将标号1,_software_interrupt,对应的位置中的值,标号2,software_interrupt,给pc,即实现了将pc掉转到software_interrupt的位置,即实现了调用函数software_interrupt的效果。

第二种:

	ldr	pc, _start_armboot

_start_armboot:	.word start_armboot
            

含义就是,将标号1,_start_armboot,所对应的位置中的值,start_armboot给pc,即实现了调用函数start_armboot的目的。

其中,start_armboot是C语言文件中某个C语言的函数。



[注意]总结汇编中实现函数调用的方式

汇编中,实现函数调用的效果,有如下两种方法:

  1. 方法1
    ldr pc, 标号1
    ......
    标号1:.word 标号2
    ......
    标号2:
    	......(具体要执行的代码)
                        
  2. 方法2
    ldr pc, 标号1
    ......
    标号1:.word XXX(C语言中某个函数的函数名)