以ARM处理器来说明C语言的内部机制:
1、ARM中有r0~r15共16个寄存器,如下图:
其中,r0~r3用作传递参数,r12~r15分别对应为:r12--ip、r13--sp(stack point)栈、
r14--lr(link Register)返回地址、r15--pc(pragram Counter)=当前指令地址+8。
如:
(地址0x1c刚好对应值0x56000050)
备注:ARM处理器是以流水线的方式处理指令的,即为:
a、当前执行地址A的指令。
b、已经在对地址A+4的指令进行译码。
c、已经在读取地址A+8的指令。
2、以led.c文件和led.c的反汇编文件led.dis说明。
led.c:
led.c的反汇编文件led.dis如下:
start.S启动文件:
led.c内部机制分析:
a、start.S的作用:(1)设置栈。(2)调用main并把返回地址保存在lr中。
b、led.c:main函数作用:(1)定义2个局部变量。(2)设置变量。(3)return 0。
思考:(1)为何要设置栈?因为C函数要用。
(2)怎么使用栈?a、保存局部变量。b、保存lr等寄存器。
(3)调用者如何传参数给被调用者?通过r0~r3传递
(4)被调用者如何传返回值给调用者?通过r0~r3传递
(5)怎么从栈中恢复那些寄存器?在函数中,r4~r11可能被使用,所以在入口保存它们,在出口恢复它们。
注意:在程序中,栈要指向一个内存,这块内存要可读可写,并且这块内存跟程序不能冲突,所以,将sp设在4096即顶部(NAND启动时)。
如图,已知ARM内部存储为4k,且nand上前4k的内容会被完完全全复制到SRAM中,对应上面的反汇编码可得: