44b0x初始化程序分析问题

[复制链接]
2339|4
 楼主| biehoff 发表于 2008-10-17 18:25 | 显示全部楼层 |阅读模式
InitStacks<br />&nbsp;&nbsp;&nbsp;&nbsp;mrs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,cpsr<br />&nbsp;&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#MODEMASK<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#UNDEFMODE|NOINT<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;UndefMode<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp,=UndefStack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sp&nbsp;=&nbsp;#0x0c7fe400)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#ABORTMODE|NOINT<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;AbortMode<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp,=AbortStack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sp&nbsp;=&nbsp;#0x0c7fe800)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#IRQMODE|NOINT<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;IRQMode<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp,=IRQStack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sp&nbsp;=&nbsp;#0x0c7fec00)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#FIQMODE|NOINT<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;FIQMode<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp,=FIQStack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sp&nbsp;=&nbsp;#0x0c7ff000)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#MODEMASK|NOINT<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#SVCMODE<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;SVCMode<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp,=SVCStack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sp&nbsp;=&nbsp;#0x0c7fe000)<br /><br /><br />44binit.s中当程序进入这一段时&nbsp;&nbsp;看样子是在给各个模式下的堆栈指针SP定一个地址&nbsp;&nbsp;看了S3C44B0的寄存器说明&nbsp;&nbsp;6个模式下&nbsp;有6个SP&nbsp;也就是6个R13了&nbsp;每个R13要区别开要加后缀的吧&nbsp;比如&nbsp;_usr&nbsp;_svc&nbsp;_abt&nbsp;_und&nbsp;_irp&nbsp;_fiq&nbsp;&nbsp;那么从上面程序来看&nbsp;貌似SP没区别开嘛&nbsp;虽然有一句&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;<br />看样子是切换到那个将要给相应的SP赋值的模式了&nbsp;但是切换到那个相应模式&nbsp;那么后面的SP不需要加后缀以区别吗····<br />&nbsp;&nbsp;&nbsp;&nbsp;程序后面我标注的()里的内容是我用AXD&nbsp;单步运行时&nbsp;记录下来的&nbsp;确确实实送如sp的值&nbsp;我是把RO_BASE设为0x00000000烧录完成后&nbsp;程序能运行没问题后开AXD的&nbsp;disassembly&nbsp;看到的值&nbsp;&nbsp;上面程序运行完后&nbsp;我开AXD的registers表看看每个模式下的SP值是不是按上述程序设置的一样&nbsp;&nbsp;结果很郁闷&nbsp;所有的SP都成了&nbsp;(sp&nbsp;=&nbsp;#0x0c7fe000)&nbsp;再单步看了一下&nbsp;原来每次<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp,=???Stack&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;所有的SP都是一起被赋值的··&nbsp;到最后&nbsp;都被赋值成了0x0c7fe000<br />我想改下程序&nbsp;把sp改成相应的&nbsp;r13_svc&nbsp;r13_abt&nbsp;···&nbsp;&nbsp;但是改不了&nbsp;编译出错&nbsp;这个问题很郁闷&nbsp;难道说这几个模式的SP本来就该设置成同一个地址&nbsp;请教高人···<br />&nbsp;&nbsp;还有那个cpsr_cxsf&nbsp;&nbsp;加的_cxsf后缀是什么意思啊?
 楼主| biehoff 发表于 2008-10-17 19:40 | 显示全部楼层

RE

msr&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;这里的cxsf表示从低到高分别占用的4个8bit的数据域<br /><br />指令中有时还有出现cpsr_cf,&nbsp;cpsr_all,&nbsp;cpsr_c等,这里:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;指&nbsp;&nbsp;CPSR中的control&nbsp;field&nbsp;(&nbsp;PSR[7:0])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;指&nbsp;&nbsp;flag&nbsp;field&nbsp;(PSR[31:24])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;指&nbsp;&nbsp;extend&nbsp;field&nbsp;(PSR[15:8])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;指&nbsp;&nbsp;status&nbsp;field&nbsp;(&nbsp;PSR[23:16])<br /><br />找到一个解答····<br />但好像对主要问题没什么联系<br /><br />快拜拜阿南版主···&nbsp;&nbsp;看他等会儿会出现不
mybao 发表于 2008-10-17 23:03 | 显示全部楼层

re

兄弟,你对了,“那么后面的SP不需要加后缀以区别吗”,确实不用加。<br /><br />win下编译器很久没用了,记不清。<br /><br />RO_BASE设为0x00000000,你是改变的编译时的地址还是0x00000000仅仅是烧写的起始地址。这个如果是烧写的地址,肯定不会对SP初始化有影响啊,那估计是你看错鸟。<br /><br />r13_svc&nbsp;r13_abt&nbsp;这个玩意没有就没有,不能自己造啊
阿南 发表于 2008-10-18 01:09 | 显示全部楼层

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

这段程序为初始化各个模式的堆栈指针.过程是先设置状态寄存器将模式切换到特定的模式,再对特定的模式的堆栈覆初始值.<br />楼主要注意各个小段的指令<br /><br />orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#UNDEFMODE|NOINT<br /><br />orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#ABORTMODE|NOINT<br /><br />orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#IRQMODE|NOINT<br />&nbsp;<br />orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#FIQMODE|NOINT<br />&nbsp;<br />bic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#MODEMASK|NOINT<br />orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#SVCMODE<br /><br />这些就是设置各个模式的掩模值,然后通过下述指令设置<br />msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;
 楼主| biehoff 发表于 2008-10-18 10:33 | 显示全部楼层

谢谢两位大侠

问题貌似解决了&nbsp;&nbsp;我觉得是AXD仿真的问题&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;后来我自己在那段程序后面加上<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#IRQMODE|NOINT<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;IRQMode<br />或<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r0,#FIQMODE|NOINT<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpsr_cxsf,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;FIQMode<br /><br />就看到寄存器的变化了&nbsp;<br />&nbsp;r13分别是&nbsp;&nbsp;0c7fec00&nbsp;和&nbsp;0c7ff000&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;原来是要自己切换状态才能看到&nbsp;&nbsp;单单点击那个寄存器列表是只能看到当前程序运行模式下的r13&nbsp;&nbsp;虽然我很意淫的点了寄存器表里的其他模式看看&nbsp;但看到的还是&nbsp;当前模式的r13值&nbsp;&nbsp;所以看起来&nbsp;所有模式都一样····AXD害死我
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

138

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部