[ZLG-ARM] 启动代码一问

[复制链接]
2672|8
 楼主| leonlais 发表于 2008-11-30 10:20 | 显示全部楼层 |阅读模式
在SMART&nbsp;2400&nbsp;启动代码中&nbsp;的一条汇编<br /><br />&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xb9206e50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;这是保留地址,这个值由用户写进来,怎么算出这个值呢?<br />&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;[PC,&nbsp;#-0x120]&nbsp;&nbsp;;这样写的目的是?#-0x120怎么来的?
QAWSDEDR 发表于 2008-11-30 16:44 | 显示全部楼层

你来问,我来答!

DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xb9206e50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;前8个32位寄存器的二进制相加和为0。LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;[PC,&nbsp;#-0x120]&nbsp;&nbsp;;获得IRQ中断程序函数指针。计算看另外一贴!
 楼主| leonlais 发表于 2008-11-30 19:02 | 显示全部楼层

具体是怎么算的?

DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xb9206e50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;这是保留地址,我知道它要使得前8个32位寄存器的二进制相加为0,但是它是怎么算出来的呢?这前8个寄存器的2进制值是指?<br />
ZLG_Dengz 发表于 2008-11-30 23:12 | 显示全部楼层

RE

&nbsp;&nbsp;呵呵,&nbsp;你要你使用下面的代码其值就一定是:&nbsp;0xb9206e50<br />&nbsp;&nbsp;Reset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;ResetAddr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;UndefinedAddr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;SWI_Addr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;PrefetchAddr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;DataAbortAddr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xb9206e50<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;[PC,&nbsp;#-0x120]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;FIQ_Addr<br /><br />ResetAddr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResetInit<br />UndefinedAddr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Undefined<br />SWI_Addr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SoftwareInterruptAdd<br />PrefetchAddr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrefetchAbort<br />DataAbortAddr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataAbort<br />Nouse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />IRQ_Addr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />FIQ_Addr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FIQ_Handler&nbsp;<br /><br />因为通过DCD为各异常向量分配了确定的地址空间来存储异常处理函数地址。这使得0x00000000到0x0000001c中除0x00000014外,存储着确定的值,&nbsp;这样我们也就可以计算出0x00000014应该存放的值(0xb9206e50).&nbsp;上电后,系统会判断前8个字之和是否为零,以确定代码是否有效。&nbsp;&nbsp;&nbsp;&nbsp;
 楼主| leonlais 发表于 2008-12-1 10:34 | 显示全部楼层

RE

因为通过DCD为各异常向量分配了确定的地址空间来存储异常处理函数地址。这使得0x00000000到0x0000001c中除0x00000014外,存储着确定的值.<br />这确定的值哪来的??<br /><br />
wlq_9 发表于 2008-12-1 11:00 | 显示全部楼层

混编代码

对应的机器码.<br />用hjtag会自动计算向量和.....
 楼主| leonlais 发表于 2008-12-1 11:45 | 显示全部楼层

RE 6楼

对应的机器码,就是说各异常向量对应的处理函数所对应的机器码?<br />比如<br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;ResetAddr<br />ResetAddr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResetInit<br /><br />中<br />ResetInit所对应的机器码?<br />那么异常向量表中的这些代码是不是固定的?(针对一个芯片的)
wlq_9 发表于 2008-12-1 11:49 | 显示全部楼层

不固定

和你的代码有关.但是,由于中断向量这一块一般都作成起动代码或者是模板,相对来说比较固定,因此,这个值通常算一次就行了.除非你重新修改了中断向量所在的代码,否则,这个值不变.<br />
 楼主| leonlais 发表于 2008-12-1 11:51 | 显示全部楼层

RE 楼上各位

谢谢各位给小弟解释得那么清楚,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

26

帖子

0

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