本帖最后由 freebsder 于 2018-3-24 19:50 编辑
你是问问题的,你不能用你的角度来觉得应该提供哪些不应该提供哪些,越多的信息越有用。比如,上面的keil,我不熟悉,这种辣鸡工具我也几乎不用,但是,并不妨碍我告诉你咋回事。
汇编也好,C也好,最后都要通过链接实际给定位置,称之为PIC,可不是microchip的PIC单片机。
连接器根据脚本装载空间,惯例是asm/c里面相同的区段从上到下依次装载,先来先装载,从上到下的意思是词法顺序谁先声明就是谁先。因为位置无关,所以不同asm/c的前后没有影响。连接器内部有一个计数器,每分配一个空间就往下挪动一个空间的距离,因此会有个当前地址,类似PC这个当前指令指针。你前面那什么标号什么的__initial_sp,连接器遇到了就把当前地址给这个符号,是符号,意思是同一个地址可以给多个符号。因为__initial_sp和__heap_base之间没有空间分配(这里不考虑下面的8字节对齐影响,你可以设置成4字节对齐看看是不是相等的),所以当前地址不变,所以__initial_sp和__heap_base是一个地址,最后的布局就是栈顶=堆底。
所以,不考虑8字节对齐,内存布局应该是这样的:
PIC+0
PIC+0x400 -> __initial_sp
PIC+0x400 -> __heap_base
PIC+0x600 -> __heap_limit
至于为什么要你多提供信息,因为我自己百度看到同一个文件下面vector那里DCD __initial_sp 做为0中断,那就必然是上面那样了,对于贫道这种即便是一点不会keil只根据上下文猜,也不会偏差到哪里去。 |