打印
[ZLG-ARM]

ARM汇编

[复制链接]
1206|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leonlais|  楼主 | 2008-11-30 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Reset_Handler   

; Setup Stack for each mode
                LDR     R0, =Stack_Top

;  Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit             ; :OR:     Mode_UND,I_Bit,F_Bit之间按位作逻辑或操作,设置未定义模式,禁止FIQ,IRQ
                MOV     SP, R0                                          ;堆指针指向栈顶
                SUB     R0, R0, #UND_Stack_Size

;  Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

;  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size

;  Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_USR
                MOV     SP, R0
                SUB     SL, SP, #USR_Stack_Size
                
                IMPORT    TargetResetInit
                BL        TargetResetInit

; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0


; User Initial Stack & Heap
                AREA    |.text|, CODE, READONLY

                IMPORT  __use_two_region_memory
                EXPORT  __user_initial_stackheap
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
                LDR     R2, = (Heap_Mem +      Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR

                END
定义各模式堆栈的时候 为什么都有一个类似这样的减法语句
SUB     R0, R0, #UND_Stack_Size
还有,定义完一个模式后,该模式下的RO的值都付给下模式的的堆栈指针?请注意下面的语句
Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

下面语句的目的是?
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
                LDR     R2, = (Heap_Mem +      Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR
为什么要把堆栈的顶和底赋给不同的寄存器?

相关帖子

沙发
ZLG_Dengz| | 2008-12-1 00:03 | 只看该作者

RE:

    你好啊!如果不减R0 的值不变,各模式的SP指向同一个值,各处理器模式就对应着同一段存储空间。那样模式切换时,就可能会有数据被覆盖。
   其实很简单,通过上面那段代码,就是在将一段连续的存储空间作为各个模式的栈。各模式的栈首尾相连。
   堆是堆,栈是栈。

使用特权

评论回复
板凳
leonlais|  楼主 | 2008-12-1 10:06 | 只看该作者

re

下面语句的目的是?
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
                LDR     R2, = (Heap_Mem +      Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR
为什么要把堆栈的顶和底赋给不同的寄存器?

使用特权

评论回复
地板
ZLG_Dengz| | 2008-12-1 22:48 | 只看该作者

RE:

  如果,你愿意单步调试,一直到main,你肯定会知道它是做什么用的了。

使用特权

评论回复
5
bluergreen| | 2008-12-3 09:18 | 只看该作者

ARM汇编指令中LDR使用

在程序的阅读中,老是可以看到LDR的使用,其中我不能够下面这样的表达有什么不同。
LDR R1,=0x3FF5000
LDR R1,0x3FF5000
还有就是在LDR中只能够进行寄存器与内存之间的传送吗,MOV指令可以进行寄存器与内存之间的传送吗

使用特权

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

本版积分规则

17

主题

26

帖子

0

粉丝