打印
[ZLG-ARM]

请那位仁兄赐教

[复制链接]
1789|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
space_12|  楼主 | 2007-3-26 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下所说的都是在ARM7TDMI处理器下的
1.
1)
AREA   Example,CODE,READONLY ;声明代码段Example
       ENTRY                 ;标识程序入口
       CODE32                ;声明32位ARM指令
………………………………………………………………
2)
       CODE32
AREA   Vector,CODE,READONLY
       ENTRY
………………………………………………………………
问:为什么“CODE32”的位置不同, 对整体程序有不同吗?

2.
在ARM里 工作模式的改变 是否 程序计数器PC的值是否 也会改变

3.
在ARM里 寄存器R0~~R7,R8~R15 和CPSR、SPSR的绝对地址是多少

4.
PC与lR之间的关系
1)子程序调用的时候,LR保存的值是什么(用PC来表示) 
2)当异常发生的时候,LR保存的值是什么(用PC来表示)
说明:
     LR存放子程序或者异常返回的地址
     PC 指向被取指的指令,而不是正在执行的指令

相关帖子

沙发
zlgARM| | 2007-3-27 08:59 | 只看该作者

space_12

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

使用特权

评论回复
板凳
space_12|  楼主 | 2007-3-27 21:04 | 只看该作者

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

我刚刚学ARM,在看了 周立功 的smartARM2200的开发板以及所带的一些书籍后 才感到以上的疑问。

能不能请周工给我详细的解答
1.
在初时化堆栈时候 要保存PC值
如下代码:
……………………………………………………
InitStack    
        MOV     R0, LR
;Build the SVC stack
;设置管理模式堆栈
        MSR     CPSR_c, #0xd3
        LDR     SP, StackSvc
;Build the IRQ stack            
;设置中断模式堆栈
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq
;Build the FIQ stack
;设置快速中断模式堆栈
        MSR     CPSR_c, #0xd1
        LDR     SP, StackFiq
;Build the DATAABORT stack
;设置中止模式堆栈
        MSR     CPSR_c, #0xd7
        LDR     SP, StackAbt
;Build the UDF stack
;设置未定义模式堆栈
        MSR     CPSR_c, #0xdb
        LDR     SP, StackUnd
;Build the SYS stack
;设置系统模式堆栈
        MSR     CPSR_c, #0x5f
        LDR     SP, =StackUsr
        MOV     PC, R0
………………………………………………………………
如果不保存返回的PC 会有什么后果呢
只不过 在初时化堆栈时候 改变了模式吗
如果对程序计数器PC没的话何必用
MOV     R0, LR
MOV     PC, R0

2.
程序如下:
………………………………………………
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80
        LDR     PC, [PC, #-0xff0]
        LDR     PC, FIQ_Addr
………………………………………………
问:
这里的“LDR     PC, [PC, #-0xff0]”
能否用“LDR     PC, [0xfffff030]”
0x00000020-0xff0--->0xfffff030

使用特权

评论回复
地板
zlgARM| | 2007-3-28 08:38 | 只看该作者

space_12

    1、SmartARM2200配套的《ARM嵌入式系统基础教程》P48,表3.5的第二行讲解了BL对应的入口。BL是调用子程序,将子程序的地址装入了PC,PC的值已经变化了——所以,为了在子程序结束后返回调用处,就必须将LR保存的值再重新载入PC;
  2、不可以。LDR指令没有这样的用法,汇编通不过。您用ADS试验一下。

使用特权

评论回复
5
space_12|  楼主 | 2007-3-28 20:53 | 只看该作者

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

1.

《ARM嵌入式系统实验教程(二)》里的 
第2章 基础实验 的 2.7 ARM微控制器工作模式实验 其中的 6.实验参考程序 其中有这么一段代码
………………………………………………
;切换到用户模式
   MSR  CPSR_c,#0xd0
   MRS  R0,CPSR
;切换到管理模式
   MSR CPSR_c,#0xdf
   MRS R0,CPSR
………………………………………………
这里 从用户模式可以直接切换到管理模式
而在《ARM嵌入式系统实验教程》的 3.6处理器模式 下却有这么一段话
“特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。”

2.
在 ADS1.2集成开发环境 里调用 主函数main()用 
1)IMPORT    main    ;在《ARM嵌入式系统实验教程(二)》的 程序清单2.9里
2)IMPORT  __main    ;在《ARM嵌入式系统实验教程(二)》其他程序的Startup.s里
问:
c程序主函数 在汇编里调用具体格式是那中?还是需要设置什么关联?

3.
关于PC和LR 的问题
在ARM指令集 状态下
  PC    指令从存储器中取出
  PC-4  对指令使用的寄存器进行译码
  PC-8  从寄存器组中读出寄存器 执行 移位和ALU操作 寄存器写回到寄存器组
问:
在子程序 调用的时候 是下一条指令的地址 PC+4 写入LR吗
在异常发生时候 是把 PC+4 或者 PC+8 写入LR吗

使用特权

评论回复
6
zlgARM| | 2007-3-29 08:57 | 只看该作者

space_12

1:您看看P64上的思考题。那一段程序就是为了说明用户模式之局限的。

2:__main和main是两个不同的程序入口。启动文件是先跳入__main,完成了对C库函数的一些初始化工作,然后去执行C程序里的main。

3:《ARM嵌入式系统基础教程》P48,表3.5,《ARM嵌入式系统基础教程》流水线相关章节。

使用特权

评论回复
7
space_12|  楼主 | 2007-3-31 18:56 | 只看该作者

谢谢周工的热情 解答

可惜还不能给我说明白,自己在琢磨吧

使用特权

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

本版积分规则

17

主题

188

帖子

1

粉丝