首先是从理论上的东西。。网上转载来的,后边是看AVR代码时得出的一些东西。
硬件仓库:或许也能够称作体系仓库,是坐落片内RAM区。有人说,只需能运用PUSH,POP指令的单片机,都能够说含有硬件仓库。这样的说法我个人觉得不是很全面。经过指令进行压栈和出栈操作仅仅体系仓库中的一种操做。体系仓库还能够被隐含调用。例如,当调用子程序时,体系会主动把回来地址压入仓库,并不需要用户经过指令操作。一般,栈底设在内存的高端,也便是把内存的最高一段空间划作栈区。这些都是向下成长栈。栈指针或许是专用的寄存器,也或许借用一通用寄存器。也有单片机是在数据区里齐截块作栈区,或许是向上成长,也或许是向下成长。
硬件仓库:是经过寄存器SPH,SPL做为索引指针的地址,是调用了CALL,RCALL等函数调用指令后硬件主动填充的仓库!
软件仓库:是编译器为了处理一些参数传递而做的仓库,会由编译器主动发生和处理,能够经过相应的编译选项对其进行修改。
简略一点说,硬件仓库首要做为地址仓库用,而软件仓库首要会被分配成数据仓库!
—摘自《AVR单片机C言语开发入门辅导》-
假如没有硬仓库,你能够选定一个寄存器作仓库指针,经过软件完成仓库操作。移植μC/OS-II也纷歧定要硬仓库。ARM 就很难说它的仓库是软的仍是硬的。32位的ARM指令中没有PUSH、POP指令。ARM习惯上用R13作仓库指针(SP),但用其他寄存器作仓库指针也未常不行。ARM习惯上用LDM/STM(多寄存器加载/存储指令)来操作仓库,压多少,按什么次序都能挑选。应该说ARM是软硬结合的仓库。
C代码(AVR-GCC编译,优化等级-00):
#include <avr/io.h>
int add(int a,int b)
{
}
int main(void)
{
c=add(a,b);
//c=sub(a,b);
}
汇编代码:
(省掉一些boot代码)
。。。。。。。
00000054 <__ctors_end>:
。。。
0000008e :
#include
int add(int a,int b)
{