我是一名linux嵌入式初学者,现在在看ARM处理器。
使用的是一块S3C2440的开发板,目前的开发调试环境是KEIL4。
我在一个添加了启动代码的工程中添加一个自己编写的简单汇编文件。然后在启动代码的C入口点处修改,import添加的简单汇编文件中的程序段,并使其跳转到该程序段。
编译不能通过,错误提示的我编写的汇编文件中定义的label没有定义。想知道如何解决。
我想在启动代码执行结束后调用一个定义在其他文件中的汇编程序。
以下是我自己写的可以用的S3C2440汇编启动代码:
; .include "/SystemInit/LowLevelInit.s"
INTOFFSET EQU 0x4A000014
SVC_STACK_LEGTH EQU 0 ;;;;;;;;;;;;;;;;;;
FIQ_STACK_LEGTH EQU 0 ;;;;;;;;;;;;;;;;;;
IRQ_STACK_LEGTH EQU 256 ;;;;;;;;;;;;;;;;;;
ABT_STACK_LEGTH EQU 0 ;;;;;;;;;;;;;;;;;;
UND_STACK_LEGTH EQU 0 ;;;;;;;;;;;;;;;;;;
NoInt EQU 0x80
NoFIQ EQU 0x40
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
; IMPORT __use_no_semihosting_swi
; IMPORT FIQ_Exception
IMPORT __main
IMPORT SystemInit
IMPORT LowLevelInit
; IMPORT _ClockInit
; IMPORT _LedInit
; IMPORT _LedOn
; IMPORT _LedOff
; IMPORT LedInit
; IMPORT LedOn
; IMPORT LedOff
; IMPORT Delay
IMPORT IRQHandle
; IMPORT Timer4_IRQ
IMPORT StartHandle
EXPORT bottom_of_heap ;;;;;;;;;;;;;;;;;;
EXPORT StackUsr;;;;;;;;;;;;;;;;;;
EXPORT Reset
EXPORT __user_initial_stackheap;;;;;;;;;;;;;;;;;;
PRESERVE8
;CODE32
AREA os,CODE,READONLY
ARM
; ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
Undefined
B Undefined
SoftwareInterrupt
CMP R0, #4
LDRLO PC, [PC, R0, LSL #2]
MOVS PC, LR
SwiFunction
DCD IRQDisable ;0
DCD IRQEnable ;1
DCD FIQDisable ;2
DCD FIQEnable ;3
; DCD Enable ;4
IRQDisable
MRS R0, SPSR
ORR R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR
IRQEnable
MRS R0, SPSR
BIC R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR
FIQDisable
MRS R0, SPSR
ORR R0, R0, #NoFIQ
MSR SPSR_c, R0
MOVS PC, LR
FIQEnable
MRS R0, SPSR
BIC R0, R0, #NoFIQ
MSR SPSR_c, R0
MOVS PC, LR
;Enadle
PrefetchAbort
B PrefetchAbort
DataAbort
B DataAbort
FIQ_Handler
STMFD SP!, {R0-R4, LR}
; BL FIQ_Exception
LDMFD SP!, {R0-R4, LR}
SUBS PC, LR, #4
IRQ_Handler
; ÒÔºóÓÐʱ¼ä£¬Ö±½ÓÓûã±à²é±íµÄ·½·¨À´×ö£¬²»ÒªÒÀÀµCº¯Êý·½Ê½£¬ÌáÉýЧÂÊ
STMFD SP!, {R0-R4, LR}
;Ìø×ªµ½ÍⲿÖжϵĴ¦Àíº¯Êý
;Á½¸ö±ê¼ÇλµÄÇå³ýÒ²¿ÉÔÚÕâÀïÍê³É£¬µ«Ä¿Ç°ÏÈÓÉÓû§Íê³É°É
; LDR R1,=INTOFFSET
; LDR R0,[R1]
; LDR R2,=IRQHandle
; LDR R1,[R2,R0,LSL #2] ; MOV R1,#4; MLA R3,R0,R1,R2;
; LDR R3,[R1]
; MOV LR,PC
; BX R3
BL StartHandle
LDMFD SP!, {R0-R4, LR}
SUBS PC, LR, #4
InitStack
MOV R0, LR
MSR CPSR_c, #0xd3
LDR SP, StackSvc
MSR CPSR_c, #0xd2
LDR SP, StackIrq
MSR CPSR_c, #0xd1
LDR SP, StackFiq
MSR CPSR_c, #0xd7
LDR SP, StackAbt
MSR CPSR_c, #0xdb
LDR SP, StackUnd
MSR CPSR_c, #0xdf
LDR SP, =StackUsr-32
BX R0; ²»ÄÜʹÓÃLR·µ»Ø£¬LR¿ÉÄÜÒѾ±»ÐÞ¸ÄÁË£¬ËùÒÔ½èÓÉR0·µ»Ø ; MOV PC, R0 ;
ResetInit
BL LowLevelInit
BL InitStack ;ÔÚÕâÖ®ºó£¬¿ÉÒÔʹÓÃCº¯Êý
BL SystemInit
; BL _ClockInit
; BL LedInit
LOOP
; BL LedOn
; LDR R0,=0x100
; BL Delay
; BL LedOff
; LDR R0,=0x100
; BL Delay
; B LOOP
_Delay
; LDR R3,=0x100000
; STMFD SP!, {R0-R4, LR}
; BL SystemInit
; LDMFD SP!, {R0-R4, LR}
; B .
; BL TargetResetInit
BL IRQ_Handler
B __main
__user_initial_stackheap
LDR r0,=bottom_of_heap ;;;;;;;;;;;;;;;;;;
; LDR r1,=StackUsr ;;;;;;;;;;;;;;;;;;
BX LR; MOV pc,lr ;
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
AREA MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration Mode ¹ÜÀíģʽ¶ÑÕ»¿Õ¼ä
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode ÖжÏģʽ¶ÑÕ»¿Õ¼ä
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode ¿ìËÙÖжÏģʽ¶ÑÕ»¿Õ¼ä
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode ÖÐÖ¹Òåģʽ¶ÑÕ»¿Õ¼ä
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 䶨Òåģʽ¶ÑÕ»
AREA Heap, DATA, NOINIT
bottom_of_heap SPACE 1
AREA Stacks, DATA, NOINIT
StackUsr
END