[ZLG-ARM] 请那位仁兄赐教

[复制链接]
2750|6
 楼主| space_12 发表于 2007-3-26 19:19 | 显示全部楼层 |阅读模式
以下所说的都是在ARM7TDMI处理器下的<br />1.<br />1)<br />AREA&nbsp;&nbsp;&nbsp;Example,CODE,READONLY&nbsp;;声明代码段Example<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENTRY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;标识程序入口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CODE32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;声明32位ARM指令<br />………………………………………………………………<br />2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CODE32<br />AREA&nbsp;&nbsp;&nbsp;Vector,CODE,READONLY<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENTRY<br />………………………………………………………………<br />问:为什么“CODE32”的位置不同,&nbsp;对整体程序有不同吗?<br /><br />2.<br />在ARM里&nbsp;工作模式的改变&nbsp;是否&nbsp;程序计数器PC的值是否&nbsp;也会改变<br /><br />3.<br />在ARM里&nbsp;寄存器R0~~R7,R8~R15&nbsp;和CPSR、SPSR的绝对地址是多少<br /><br />4.<br />PC与lR之间的关系<br />1)子程序调用的时候,LR保存的值是什么(用PC来表示)&nbsp;<br />2)当异常发生的时候,LR保存的值是什么(用PC来表示)<br />说明:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR存放子程序或者异常返回的地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC&nbsp;指向被取指的指令,而不是正在执行的指令
zlgARM 发表于 2007-3-27 08:59 | 显示全部楼层

space_12

&nbsp;&nbsp;&nbsp;&nbsp;(1)只要是在被声明为32位指令的那段程序前,就没有问题。CODE32、AREA等伪指令都是彼此不相关,各行其是的。您只需要根据伪指令自身的功能来考虑它的位置;<br />&nbsp;&nbsp;&nbsp;&nbsp;(2)PC的值只由执行的指令的地址决定;因而和处理器模式没有直接关系;<br />&nbsp;&nbsp;&nbsp;&nbsp;(3)这些寄存器不占用地址空间,(您看一下ARM地址空间的章节)也就没有所谓的绝对地址之说法;<br />&nbsp;&nbsp;&nbsp;&nbsp;(4)这个您可以在书上找一下“异常的入口和出口”,里面列了表来详细说明的。<br />
 楼主| space_12 发表于 2007-3-27 21:04 | 显示全部楼层

非常荣幸 周工程师为我解答

我刚刚学ARM,在看了&nbsp;周立功&nbsp;的smartARM2200的开发板以及所带的一些书籍后&nbsp;才感到以上的疑问。<br /><br />能不能请周工给我详细的解答<br />1.<br />在初时化堆栈时候&nbsp;要保存PC值<br />如下代码:<br />……………………………………………………<br />InitStack&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;LR<br />;Build&nbsp;the&nbsp;SVC&nbsp;stack<br />;设置管理模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0xd3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;StackSvc<br />;Build&nbsp;the&nbsp;IRQ&nbsp;stack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;设置中断模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0xd2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;StackIrq<br />;Build&nbsp;the&nbsp;FIQ&nbsp;stack<br />;设置快速中断模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0xd1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;StackFiq<br />;Build&nbsp;the&nbsp;DATAABORT&nbsp;stack<br />;设置中止模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0xd7<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;StackAbt<br />;Build&nbsp;the&nbsp;UDF&nbsp;stack<br />;设置未定义模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0xdb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;StackUnd<br />;Build&nbsp;the&nbsp;SYS&nbsp;stack<br />;设置系统模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0x5f<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;=StackUsr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;R0<br />………………………………………………………………<br />如果不保存返回的PC&nbsp;会有什么后果呢<br />只不过&nbsp;在初时化堆栈时候&nbsp;改变了模式吗<br />如果对程序计数器PC没的话何必用<br />MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;LR<br />MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;R0<br /><br />2.<br />程序如下:<br />………………………………………………<br />Reset<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;ResetAddr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;UndefinedAddr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;SWI_Addr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;PrefetchAddr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;DataAbortAddr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xb9205f80<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;[PC,&nbsp;#-0xff0]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;FIQ_Addr<br />………………………………………………<br />问:<br />这里的“LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;[PC,&nbsp;#-0xff0]”<br />能否用“LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;[0xfffff030]”<br />0x00000020-0xff0---&gt0xfffff030<br />
zlgARM 发表于 2007-3-28 08:38 | 显示全部楼层

space_12

&nbsp;&nbsp;&nbsp;&nbsp;1、SmartARM2200配套的《ARM嵌入式系统基础教程》P48,表3.5的第二行讲解了BL对应的入口。BL是调用子程序,将子程序的地址装入了PC,PC的值已经变化了——所以,为了在子程序结束后返回调用处,就必须将LR保存的值再重新载入PC;<br />  2、不可以。LDR指令没有这样的用法,汇编通不过。您用ADS试验一下。
 楼主| space_12 发表于 2007-3-28 20:53 | 显示全部楼层

还有如下SmartARM220上的问题再请周工解答

1.<br />在<br />《ARM嵌入式系统实验教程(二)》里的&nbsp;<br />第2章&nbsp;基础实验&nbsp;的&nbsp;2.7&nbsp;ARM微控制器工作模式实验&nbsp;其中的&nbsp;6.实验参考程序&nbsp;其中有这么一段代码<br />………………………………………………<br />;切换到用户模式<br />&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;CPSR_c,#0xd0<br />&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;R0,CPSR<br />;切换到管理模式<br />&nbsp;&nbsp;&nbsp;MSR&nbsp;CPSR_c,#0xdf<br />&nbsp;&nbsp;&nbsp;MRS&nbsp;R0,CPSR<br />………………………………………………<br />这里&nbsp;从用户模式可以直接切换到管理模式<br />而在《ARM嵌入式系统实验教程》的&nbsp;3.6处理器模式&nbsp;下却有这么一段话<br />“特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。”<br /><br />2.<br />在&nbsp;ADS1.2集成开发环境&nbsp;里调用&nbsp;主函数main()用&nbsp;<br />1)IMPORT&nbsp;&nbsp;&nbsp;&nbsp;main&nbsp;&nbsp;&nbsp;&nbsp;;在《ARM嵌入式系统实验教程(二)》的&nbsp;程序清单2.9里<br />2)IMPORT&nbsp;&nbsp;__main&nbsp;&nbsp;&nbsp;&nbsp;;在《ARM嵌入式系统实验教程(二)》其他程序的Startup.s里<br />问:<br />c程序主函数&nbsp;在汇编里调用具体格式是那中?还是需要设置什么关联?<br /><br />3.<br />关于PC和LR&nbsp;的问题<br />在ARM指令集&nbsp;状态下<br />&nbsp;&nbsp;PC&nbsp;&nbsp;&nbsp;&nbsp;指令从存储器中取出<br />&nbsp;&nbsp;PC-4&nbsp;&nbsp;对指令使用的寄存器进行译码<br />&nbsp;&nbsp;PC-8&nbsp;&nbsp;从寄存器组中读出寄存器&nbsp;执行&nbsp;移位和ALU操作&nbsp;寄存器写回到寄存器组<br />问:<br />在子程序&nbsp;调用的时候&nbsp;是下一条指令的地址&nbsp;PC+4&nbsp;写入LR吗<br />在异常发生时候&nbsp;是把&nbsp;PC+4&nbsp;或者&nbsp;PC+8&nbsp;写入LR吗
zlgARM 发表于 2007-3-29 08:57 | 显示全部楼层

space_12

1:您看看P64上的思考题。那一段程序就是为了说明用户模式之局限的。<br /><br />2:__main和main是两个不同的程序入口。启动文件是先跳入__main,完成了对C库函数的一些初始化工作,然后去执行C程序里的main。<br /><br />3:《ARM嵌入式系统基础教程》P48,表3.5,《ARM嵌入式系统基础教程》流水线相关章节。
 楼主| space_12 发表于 2007-3-31 18:56 | 显示全部楼层

谢谢周工的热情 解答

可惜还不能给我说明白,自己在琢磨吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

188

帖子

1

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