硬件堆栈和软件堆栈.doc_第1页
硬件堆栈和软件堆栈.doc_第2页
硬件堆栈和软件堆栈.doc_第3页
硬件堆栈和软件堆栈.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

硬件堆栈和软件堆栈在AVR中的理解(2010-02-01 18:43:03)首先是从理论上的东西。网上转载来的,后面是看AVR代码时得出的一些东西。硬件堆栈:或许也可以称作系统堆栈,是位于片内RAM区。有人说,只要能使用PUSH,POP指令的单片机,都可以说含有硬件堆栈。这样的说法我个人觉得不是很全面。通过指令进行压栈和出栈操作只是系统堆栈中的一种操做。系统堆栈还可以被隐含调用。例如,当调用子程序时,系统会主动把返回地址压入堆栈,并不需要用户通过指令操作。通常,栈底设在内存的高端,也就是把内存的最高一段空间划作栈区。这些都是向下生长栈。栈指针可能是专用的寄存器,也可能借用一通用寄存器。也有单片机是在数据区里划一块作栈区,可能是向上生长,也可能是向下生长。硬件堆栈:是通过寄存器SPH,SPL做为索引指针的地址,是调用了CALL,RCALL等函数调用指令后硬件自动填充的堆栈!软件堆栈:是编译器为了处理一些参数传递而做的堆栈,会由编译器自动产生和处理,可以通过相应的编译选项对其进行编辑。简单一点说,硬件堆栈主要做为地址堆栈用,而软件堆栈主要会被分配成数据堆栈!-摘自AVR单片机C语言开发入门指导-P169-ICCAVR使用两个堆栈:一个用于子程序调用和中断操作的硬件堆栈,一个用于传递参数、临时变量和局部变量的软件堆栈。可以使用堆栈检测函数检测两个堆栈是否溢出。单片机在执行调用子程序的指令时,一般会把返回地址自动存入堆栈,而没有被单片机自动入栈但是也需要保存的内容比如状态寄存器、通用寄存器等,就得通过PUSH等指令把它们人为地保存到堆栈中。自动入栈和“人为入栈”可能使用的是一个堆栈指针。有的单片机可以分开,比如AVR,可以通过“ST -Y, R0”这样的指令把R0存入软件堆栈区(Y是由R28和R29两个寄存器的值组成的16位指针),有的单片机缺少这样的指令,就会把软件堆栈和硬件堆栈放在一个栈空间,都使用SP,比如51.看其栈顶指针是否和CPU具有特殊的关联,有关联者(如SP)“硬”,而无关联者“软”。如果没有硬堆栈,你可以选定一个寄存器作堆栈指针,通过软件实现堆栈操作。移植C/OS-II也不一定要硬堆栈。ARM 就很难说它的堆栈是软的还是硬的。32位的ARM指令中没有PUSH、POP指令。ARM习惯上用R13作堆栈指针(SP),但用别的寄存器作堆栈指针也未常不可。ARM习惯上用LDM/STM(多寄存器加载/存储指令)来操作堆栈,压多少,按什么顺序都能选择。应该说ARM是软硬结合的堆栈。C代码(AVR-GCC编译,优化等级-00):#include int add(int a,int b)int c;c=a+b;return c;int main(void)int a=2,b=3,c=0;c=add(a,b);/c=sub(a,b);汇编代码:(省略一些boot代码)。00000054 :54:11 24eorr1, r156:1f beout0x3f, r1; 6358:cf e5ldir28, 0x5F; 95/此处Y指针和SP都指到了SRAM最高端5a:d4 e0ldir29, 0x04; 45c:de bfout0x3e, r29; 625e:cd bfout0x3d, r28; 61。0000008e :#include int add(int a,int b)8e:cf 93pushr2890:df 93pushr29/保存了Y指针,此时SP已经-2,这里再减292:cd b7inr28, 0x3d; 61/重新定位Y指针跟SP一样。94:de b7inr29, 0x3e; 6296:26 97sbiwr28, 0x06; 6/减掉6,即向下开了6字节的区域,存放3变量98:0f b6inr0, 0x3f; 639a:f8 94cli9c:de bfout0x3e, r29; 629e:0f beout0x3f, r0; 63a0:cd bfout0x3d, r28; 61a2:9a 83stdY+2, r25; 0x02a4:89 83stdY+1, r24; 0x01a6:7c 83stdY+4, r23; 0x04a8:6b 83stdY+3, r22; 0x03int c;c=a+b;aa:29 81lddr18, Y+1; 0x01ac:3a 81lddr19, Y+2; 0x02ae:8b 81lddr24, Y+3; 0x03b0:9c 81lddr25, Y+4; 0x04b2:82 0faddr24, r18b4:93 1fadcr25, r19b6:9e 83stdY+6, r25; 0x06b8:8d 83stdY+5, r24; 0x05return c;ba:8d 81lddr24, Y+5; 0x05bc:9e 81lddr25, Y+6; 0x06be:26 96adiwr28, 0x06; 6/加了6个字节空间,Y指针恢复到减6之前c0:0f b6inr0, 0x3f; 63c2:f8 94clic4:de bfout0x3e, r29; 62c6:0f beout0x3f, r0; 63c8:cd bfout0x3d, r28; 61ca:df 91popr29cc:cf 91popr28ce:08 95ret/弹出堆栈中2个字节000000d0 :int main(void)d0:c9 e5ldir28, 0x59; 89/这4句给SP和Y指针重新赋值了,很明显的在SP的d2:d4 e0ldir29, 0x04; 4/上面还有6个字节(SRAM最大到045E),这6个字节d4:de bfout0x3e, r29; 62/被存放了a,b,c三个变量(可以与上面理论对应)d6:cd bfout0x3d, r28; 61/通过Y指针来保存了这三个变量到这个区域int a=2,b=3,c=0;d8:82 e0ldir24, 0x02; 2da:90 e0ldir25, 0x00; 0dc:9a 83stdY+2, r25; 0x02de:89 83stdY+1, r24; 0x01e0:83 e0ldir24, 0x03; 3e2:90 e0ldir25, 0x00; 0e4:9c 83stdY+4, r25; 0x04e6:8b 83stdY+3, r24; 0x03e8:1e 82stdY+6, r1; 0x06ea:1d 82stdY+5, r1; 0x05c=add(a,b);ec:6b 81lddr22, Y+3; 0x03ee:7c 81lddr23, Y+4; 0x04f0:89 81lddr24, Y+1; 0x01f2:9a 81lddr25, Y+2; 0x02f4:0e 94 47 00 call0x8e /使用call时自动将PC+2的地址压到堆栈f8:9e 83stdY+6, r25; 0x06fa:8d 83stdY+5, r24; 0x05/c=sub(a,b);fc:80 e0ldir24, 0x00; 0fe:90 e0ldir25, 0x00; 0100:0c 94 82 00 jmp0x104 00000104 :104:ff cfrjmp.-2; 0x104 r28和r29一起组成SP指针,Y指针可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论