打印
[ZLG-ARM]

谢谢computer00阁下

[复制链接]
1928|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhulijun1|  楼主 | 2007-10-11 16:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
computer00:
    你在昨夜对我问题的再次回复我真的很感动:
“UsrStackSpace是一个标号,它里面的内容是UsrStack的地址(这个地址在RAM中).

而StackUsr DCD UsrStackSpace,则是将UsrStackSpace这个标号的地址(这个地址在ROM中)放在了StackUsr里面,所以两者不一样了。

通过StackUsr里面的值,可以找到UsrStackSpace的地址,这个地址里面的内容才是堆栈.

而你前面正确的,StackUsr里面的值就是堆栈.”

你的分析应该是正确的,我对“disassemble”出来的东东一知半解。

现在是否说明  书上所给的初如化堆栈的方法有问题,因为正如你所分析的不能指向RAM地址:
===========================================================================
StackUsr       DCD     UsrStackSpace + (USR_STACK_LEGTH - 1)*4
StackSvc    DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)*4
StackIrq    DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)*4
StackFiq    DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)*4
StackAbt    DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)*4
StackUnd    DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)*4


; 分配堆栈空间 
            AREA    MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace         SPACE      USR_STACK_LEGTH * 4     ; 用户(系统)模式堆栈空间
SvcStackSpace          SPACE      SVC_STACK_LEGTH * 4      ; 管理模式堆栈空间
IrqStackSpace          SPACE      IRQ_STACK_LEGTH * 4      ; 中断模式堆栈空间
FiqStackSpace          SPACE      FIQ_STACK_LEGTH * 4      ; 快速中断模式堆栈空间
AbtStackSpace          SPACE      ABT_STACK_LEGTH * 4      ; 中止义模式堆栈空间
UndtStackSpace         SPACE      UND_STACK_LEGTH * 4      ; 未定义模式堆栈 
============================================================================   
因为要实现堆栈向下递减,所以只能像书上所讲的方法,我该怎么办呢?

相关帖子

沙发
computer00| | 2007-10-11 17:11 | 只看该作者

你的编译器我不熟,不知道用EQU行不行。

你可以去下载一些别人的启动文件来参考。

使用特权

评论回复
板凳
wj77317| | 2007-10-11 20:15 | 只看该作者

看来你是要自己移植操作系统啊

你研究的很深啊,周立功移植好的操作系统都研究啊。有志气。

使用特权

评论回复
地板
zhulijun1|  楼主 | 2007-10-12 07:59 | 只看该作者

回复computer00

用EQU也不行,

使用特权

评论回复
5
zhulijun1|  楼主 | 2007-10-12 08:16 | 只看该作者

另外


如下的代码:
StackUsr            DCD      UsrStackSpace 
...
AREA    MyStacks, DATA, NOINIT
UsrStackSpace       SPACE    USR_STACK_LEGTH * 4 
...

我认为并没有为“UsrStackSpace”这个标号分配一字的内存空间,也就是说这个标号没有存放的地址;而为“StackUsr”这个标号分配了一个字的单元,里面的内容为数据结构的首地址

使用特权

评论回复
6
computer00| | 2007-10-13 00:22 | 只看该作者

具体是怎样,你可以写程序测试的。

使用特权

评论回复
7
zhulijun1|  楼主 | 2007-10-13 09:56 | 只看该作者

回复

测试了一下,结果:

          LDR     SP,StackUsr
StackUsr            DCD      UsrStackSpace 
...
AREA    MyStacks, DATA, NOINIT
UsrStackSpace       SPACE    USR_STACK_LEGTH * 4 
...

结果把“StackUsr”的地址附给了SP,而实际是需要把“StackUsr”里的内容(即数据结构的首地址)附给SP...

使用特权

评论回复
8
computer00| | 2007-10-14 11:41 | 只看该作者

那你就可以修改一下启动代码啊

使用间接寻址的方式,两那个里面的内容弄出来就行了。

使用特权

评论回复
9
zhulijun1|  楼主 | 2007-10-15 08:48 | 只看该作者

回复

ldr sp [sp]   ?

使用特权

评论回复
10
xiao李| | 2007-10-15 09:51 | 只看该作者

re

StackUsr            DCD      UsrStackSpace 
StackUsr 不是变量,只是一个标号,该标号的地址位置上存放的是后面那个标号的地址。

使用特权

评论回复
11
computer00| | 2007-10-15 10:20 | 只看该作者

那么多工作寄存器,随便借助一个,前面的R2什么的

使用特权

评论回复
12
zhulijun1|  楼主 | 2007-10-17 08:23 | 只看该作者

oo

我想看看你的 ARM_00_OS

使用特权

评论回复
13
computer00| | 2007-10-17 09:35 | 只看该作者

直接去我的博客里面的初学ARM里面找,有几个版本了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

20

帖子

0

粉丝