打印

44b0x初始化程序分析问题

[复制链接]
1454|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
biehoff|  楼主 | 2008-10-17 18:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
InitStacks
    mrs        r0,cpsr
    bic        r0,r0,#MODEMASK
    orr        r1,r0,#UNDEFMODE|NOINT
    msr        cpsr_cxsf,r1        ;UndefMode
    ldr        sp,=UndefStack                     (sp = #0x0c7fe400)
    
    orr        r1,r0,#ABORTMODE|NOINT
    msr        cpsr_cxsf,r1             ;AbortMode
    ldr        sp,=AbortStack                     (sp = #0x0c7fe800)

    orr        r1,r0,#IRQMODE|NOINT
    msr        cpsr_cxsf,r1             ;IRQMode
    ldr        sp,=IRQStack                       (sp = #0x0c7fec00)
    
    orr        r1,r0,#FIQMODE|NOINT
    msr        cpsr_cxsf,r1             ;FIQMode
    ldr        sp,=FIQStack                       (sp = #0x0c7ff000)

    bic        r0,r0,#MODEMASK|NOINT
    orr        r1,r0,#SVCMODE
    msr        cpsr_cxsf,r1             ;SVCMode
    ldr        sp,=SVCStack                       (sp = #0x0c7fe000)


44binit.s中当程序进入这一段时  看样子是在给各个模式下的堆栈指针SP定一个地址  看了S3C44B0的寄存器说明  6个模式下 有6个SP 也就是6个R13了 每个R13要区别开要加后缀的吧 比如 _usr _svc _abt _und _irp _fiq  那么从上面程序来看 貌似SP没区别开嘛 虽然有一句   
     msr        cpsr_cxsf,r1 
看样子是切换到那个将要给相应的SP赋值的模式了 但是切换到那个相应模式 那么后面的SP不需要加后缀以区别吗····
    程序后面我标注的()里的内容是我用AXD 单步运行时 记录下来的 确确实实送如sp的值 我是把RO_BASE设为0x00000000烧录完成后 程序能运行没问题后开AXD的 disassembly 看到的值  上面程序运行完后 我开AXD的registers表看看每个模式下的SP值是不是按上述程序设置的一样  结果很郁闷 所有的SP都成了 (sp = #0x0c7fe000) 再单步看了一下 原来每次
    ldr        sp,=???Stack 
    所有的SP都是一起被赋值的·· 到最后 都被赋值成了0x0c7fe000
我想改下程序 把sp改成相应的 r13_svc r13_abt ···  但是改不了 编译出错 这个问题很郁闷 难道说这几个模式的SP本来就该设置成同一个地址 请教高人···
  还有那个cpsr_cxsf  加的_cxsf后缀是什么意思啊?

相关帖子

沙发
biehoff|  楼主 | 2008-10-17 19:40 | 只看该作者

RE

msr cpsr_cxsf,r1        ;这里的cxsf表示从低到高分别占用的4个8bit的数据域

指令中有时还有出现cpsr_cf, cpsr_all, cpsr_c等,这里:

        c 指  CPSR中的control field ( PSR[7:0])
        f 指  flag field (PSR[31:24])
        x 指  extend field (PSR[15:8])
        s 指  status field ( PSR[23:16])

找到一个解答····
但好像对主要问题没什么联系

快拜拜阿南版主···  看他等会儿会出现不

使用特权

评论回复
板凳
mybao| | 2008-10-17 23:03 | 只看该作者

re

兄弟,你对了,“那么后面的SP不需要加后缀以区别吗”,确实不用加。

win下编译器很久没用了,记不清。

RO_BASE设为0x00000000,你是改变的编译时的地址还是0x00000000仅仅是烧写的起始地址。这个如果是烧写的地址,肯定不会对SP初始化有影响啊,那估计是你看错鸟。

r13_svc r13_abt 这个玩意没有就没有,不能自己造啊

使用特权

评论回复
地板
阿南| | 2008-10-18 01:09 | 只看该作者

楼主,请不要拜了,阿南受不起啊

这段程序为初始化各个模式的堆栈指针.过程是先设置状态寄存器将模式切换到特定的模式,再对特定的模式的堆栈覆初始值.
楼主要注意各个小段的指令

orr        r1,r0,#UNDEFMODE|NOINT

orr        r1,r0,#ABORTMODE|NOINT

orr        r1,r0,#IRQMODE|NOINT
 
orr        r1,r0,#FIQMODE|NOINT
 
bic        r0,r0,#MODEMASK|NOINT
orr        r1,r0,#SVCMODE

这些就是设置各个模式的掩模值,然后通过下述指令设置
msr        cpsr_cxsf,r1             
 

使用特权

评论回复
5
biehoff|  楼主 | 2008-10-18 10:33 | 只看该作者

谢谢两位大侠

问题貌似解决了  我觉得是AXD仿真的问题  
    后来我自己在那段程序后面加上

    orr        r1,r0,#IRQMODE|NOINT
    msr        cpsr_cxsf,r1             ;IRQMode

    orr        r1,r0,#FIQMODE|NOINT
    msr        cpsr_cxsf,r1             ;FIQMode

就看到寄存器的变化了 
 r13分别是  0c7fec00 和 0c7ff000  
   原来是要自己切换状态才能看到  单单点击那个寄存器列表是只能看到当前程序运行模式下的r13  虽然我很意淫的点了寄存器表里的其他模式看看 但看到的还是 当前模式的r13值  所以看起来 所有模式都一样····AXD害死我

使用特权

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

本版积分规则

21

主题

138

帖子

0

粉丝