?? lpc2xxx_cstartup.s79
字號:
;-------------------------------------------------------------------------------
;文件中標號命名規則:
; ?xxx 僅能由匯編語言訪問的外部標號。
; __xxx 可由C 語言訪問或定義的外部標號。
; xxx 單個模塊中的局部標號(注意,本文件包含多個模塊)。
; main 用戶程序起始點。
;
;-------------------------------------------------------------------------------
; 適用于整個文件的宏和定義
;-------------------------------------------------------------------------------
; 模式,對應于CPSR寄存器的0-5位
MODE_BITS DEFINE 0x1F ; 用于CPSR模式位的位屏蔽
USR_MODE DEFINE 0x10 ; 用戶模式
FIQ_MODE DEFINE 0x11 ; 快中斷請求模式
IRQ_MODE DEFINE 0x12 ; 中斷請求模式
SVC_MODE DEFINE 0x13 ; 管理模式
ABT_MODE DEFINE 0x17 ; 中止模式
UND_MODE DEFINE 0x1B ; 為定義指令模式
SYS_MODE DEFINE 0x1F ; 系統模式
;
;-------------------------------------------------------------------------------
; ?RESET
; 復位向量。通常INTVEC段被連接到0地址,為程序調試方便,也可以將其放在其它地址。
;-------------------------------------------------------------------------------
MODULE ?RESET
COMMON INTVEC:CODE:NOROOT(2)
PUBLIC __program_start
EXTERN ?cstartup
EXTERN undef_handler, swi_handler, prefetch_handler
EXTERN data_handler, irq_handler, fiq_handler
CODE32 ; Always ARM mode after reset
org 0x00
__program_start
ldr pc,[pc,#24] ; 絕對跳轉可以到達4 GByte
; ldr b,?cstartup ; 相對跳轉允許重映射(remap),限于32 MByte
; 可以去掉以下指令前面的注釋分號來允許異常向量,
; 也可以在C語言中采用預編譯命令#pragma vector。
org 0x04
; ldr pc,[pc,#24] ; 跳轉到undef_handler
org 0x08
; ldr pc,[pc,#24] ; 跳轉到swi_handler
org 0x0c
; ldr pc,[pc,#24] ; 跳轉到prefetch_handler
org 0x10
; ldr pc,[pc,#24] ; 跳轉到data_handler
org 0x18
; ldr pc,[pc,#24] ; 跳轉到irq_handler
org 0x1c
; ldr pc,[pc,#24] ; 跳轉到fiq_handler
; 用于ldr pc指令的常數表入口定位于0x20,
; 異常向量可以用C語言的預編譯命令#pragma vector指定,也可以在以下DC32指令后面填入向
; 量地址。向量地址為:ARM向量號+0x20。
org 0x20
dc32 ?cstartup
org 0x24
; dc32 undef_handler
org 0x28
; dc32 swi_handler
org 0x2c
; dc32 prefetch_handler
org 0x30
; dc32 data_handler
org 0x38
; dc32 irq_handler
org 0x3c
; dc32 fiq_handler
LTORG
; ENDMOD __program_start
ENDMOD
;
;---------------------------------------------------------------
; ?CSTARTUP
;---------------------------------------------------------------
MODULE ?CSTARTUP
RSEG IRQ_STACK:DATA(2)
RSEG ABT_STACK:DATA:NOROOT(2)
RSEG UND_STACK:DATA:NOROOT(2)
RSEG FIR_STACK:DATA:NOROOT(2)
RSEG SVC_STACK:DATA:NOROOT(2)
RSEG CSTACK:DATA(2)
RSEG ICODE:CODE:NOROOT(2)
PUBLIC ?cstartup
EXTERN ?main
; 從這里開始執行。
; 復位后為ARM管理模式,禁止中斷
CODE32
?cstartup
; 需要時在這里加入建立堆棧指針之前的初始化指令
; 初始化堆棧指針。
; 以下方式可用于任何異常堆棧:FIQ, IRQ, SVC, ABT, UND, SYS。
; 用戶模式使用與系統模式相同的堆棧。
; 堆棧段必須在連接器命令文件中定義,并已經在上面聲明。
mrs r0,cpsr ; 原 PSR 值
bic r0,r0,#MODE_BITS ; 清0模式位
orr r0,r0,#IRQ_MODE ; 置1 IRQ 模式位
msr cpsr_c,r0 ; 改變模式
ldr sp,=SFE(IRQ_STACK) & 0xFFFFFFF8 ; IRQ_STACK結束
bic r0,r0,#MODE_BITS ; 清0模式位
orr r0,r0,#ABT_MODE ; 置1 Abort模式位
msr cpsr_c,r0 ; 改變模式
ldr sp,=SFE(ABT_STACK) & 0xFFFFFFF8 ; ABT_STACK結束
bic r0,r0,#MODE_BITS ; 清0模式位
orr r0,r0,#SVC_MODE ; 置1 Supervisor模式位
msr cpsr_c,r0 ; 改變模式
ldr sp,=SFE(SVC_STACK) & 0xFFFFFFF8 ; SVC_STACK結束
bic r0,r0,#MODE_BITS ; 清0模式位
orr r0,r0,#UND_MODE ; 置1 Undefined 模式位
msr cpsr_c,r0 ; 改變模式
ldr sp,=SFE(UND_STACK) & 0xFFFFFFF8 ; UND_STACK結束
bic r0,r0,#MODE_BITS ; 清0模式位
orr r0,r0,#FIQ_MODE ; 置1 FIQ 模式位
msr cpsr_c,r0 ; 改變模式
ldr sp,=SFE(FIR_STACK) & 0xFFFFFFF8 ; FIR_STACK結束
bic r0,r0,#MODE_BITS ; 清0模式位
orr r0,r0,#SYS_MODE ; 置1 System模式位
msr cpsr_c,r0 ; 改變模式
ldr sp,=SFE(CSTACK) & 0xFFFFFFF8 ; CSTACK結束
#ifdef __ARMVFP__
; 允許 VFP 協處理器。
mov r0, #0x40000000 ; 置1 VFP 的EN位
fmxr fpexc, r0 ; FPEXC,清除其它
; 將緩沖區清0以禁止下溢出。為完全滿足IEEE 754標準,應刪除該指令并安裝合適的異常句柄。
mov r0, #0x01000000 ; 置1 VFP 的FZ位
fmxr fpscr, r0 ; FPSCR, 清除其它
#endif
; 在這里添加更多初始化指令。
ldr r0,=?main
bx r0
LTORG
ENDMOD
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -