This is the mail archive of the crossgcc@sourceware.org mailing list for the crossgcc project.
See the CrossGCC FAQ for lots more information.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hello !I have tried to insert corrected statements in the assembly below. You were not using .macro directive correctly
I have tried to translate a short code in armasm into a code in "gnu arm
assembler". It compiles well with arm-elf-as.
Then, I have written a simple "HelloWorld" program in C, which also compiles
with arm-elf-gcc.
Now, I try to link them with arm-elf-ld and I have the following errors :
boot_code2.o(EXCEPTION_VECTORS+0xc4):boot_code2.s:84: undefined reference to
`$stack_pointer'
boot_code2.o(EXCEPTION_VECTORS+0xc8):boot_code2.s:84: undefined reference to
`SVC_STACK_TOP'
************************************************************************
The armasm code is the following :
; ARM processor modes.
SVC_MODE EQU 0x13 IRQ_MODE EQU 0x12 FIQ_MODE EQU 0x11
MACRO proc_SwitchMode $mode, $stack_pointer MRS R0, CPSR MOV R1, R0 AND R1, R1, #0x1F ; Store the previous mode. BIC R0, R0, #0x1F ; Clear the mode bits. ORR R0, R0, #$mode ; Set the new mode bits. MSR CPSR_csfx, R0 ; Set the processor mode. LDR R13,=$stack_pointer ; Set the stack. BIC R0, R0, #0x1F ; Clear the mode bits again. ORR R0, R0, R1 ; Restore the mode. MSR CPSR_csfx, R0 ; Set the processor mode back. MEND
; Area definitions.
AREA EXCEPTION_VECTORS, CODE, READONLY ENTRY CODE32
IMPORT main
B ResetHandler
B UndefinedHandler B SWIHandler B PrefetchHandler
B AbortHandler
NOP
B IRQHandler
B FIQHandler
ResetHandler
; Switch the processor to the FIQ mode & set the stack pointer.
proc_SwitchMode FIQ_MODE, FIQ_STACK_TOP
; Switch the processor to the IRQ mode & set the stack pointer.
proc_SwitchMode IRQ_MODE, IRQ_STACK_TOP
; Switch the processor back to the SVC mode & set the stack pointer.
LDR R13, =SVC_STACK_TOP
Start
; Jump to the main program
BL main
TestEnd B TestEnd
UndefinedHandler B UndefinedHandler
SWIHandler B SWIHandler
PrefetchHandler B PrefetchHandler
AbortHandler B AbortHandler
IRQHandler STMDB R13!,{R0-R1} LDR R0, =NumberOfIRQs LDR R1, [R0] ADD R1, R1, #0x1 STR R1, [R0] LDMIA R13!,{R0-R1} SUBS PC, R14, #0x4
FIQHandler STMDB R13!,{R0-R1} LDR R0, =NumberOfFIQs LDR R1, [R0] ADD R1, R1, #0x1 STR R1, [R0] LDMIA R13!,{R0-R1} SUBS PC, R14, #0x4
AREA |!!!!DSEG|, DATA, READWRITE EXPORT MemoryErrors EXPORT MemoryWordErrors EXPORT MemoryHWordErrors EXPORT MemoryByteErrors EXPORT NumberOfIRQs EXPORT NumberOfFIQs MemoryErrors DCD 0 MemoryWordErrors DCD 0 MemoryHWordErrors DCD 0 MemoryByteErrors DCD 0 NumberOfIRQs DCD 0 NumberOfFIQs DCD 0
SPACE 232
AREA |!!!SVC_STACK|, DATA, READWRITE SPACE 256 SVC_STACK_TOP
AREA |!!IRQ_STACK|, DATA, READWRITE SPACE 256 IRQ_STACK_TOP
AREA |!FIQ_STACK|, DATA, READWRITE SPACE 256 FIQ_STACK_TOP
END
*********************************************************************************
The "gnu arm assembler" code I have written is the following :
.extern main
.equ SVC_MODE, 0x13 .equ IRQ_MODE, 0x12 .equ FIQ_MODE, 0x11
.macro proc_SwitchMode $mode, $stack_pointer
the above like could be .macro proc_SwitchMode mode, stack_pointer
MRS R0, CPSRORR R0, R0, #\mode
MOV R1, R0
AND R1, R1, #0x1F BIC R0, R0, #0x1F ORR R0, R0, #mode
MSR CPSR_csfx, R0 LDR R13,=$stack_pointerLDR R13,=\stack_pointer
BIC R0, R0, #0x1F ORR R0, R0, R1 MSR CPSR_csfx, R0 .endmSVC_STACK_TOP:
.section EXCEPTION_VECTORS .code 32
main:
B ResetHandler
B UndefinedHandler B SWIHandler B PrefetchHandler
B AbortHandler
NOP
B IRQHandler
B FIQHandler
.global ResetHandler ResetHandler: proc_SwitchMode FIQ_MODE, FIQ_STACK_TOP proc_SwitchMode IRQ_MODE, IRQ_STACK_TOP LDR R13, =SVC_STACK_TOP
.global Start
Start: BL main
.global TestEnd
TestEnd:
B TestEnd
.global UndefinedHandler UndefinedHandler: B UndefinedHandler
.global SWIHandler SWIHandler: B SWIHandler
.global PrefetchHandler PrefetchHandler: B PrefetchHandler
.global AbortHandler AbortHandler: B AbortHandler
.global IRQHandler IRQHandler: STMDB R13!,{R0-R1} LDR R0, =NumberOfIRQs LDR R1, [R0] ADD R1, R1, #0x1 STR R1, [R0] LDMIA R13!,{R0-R1} SUBS PC, R14, #0x4
.global FIQHandler FIQHandler: STMDB R13!,{R0-R1} LDR R0, =NumberOfFIQs LDR R1, [R0] ADD R1, R1, #0x1 STR R1, [R0] LDMIA R13!,{R0-R1} SUBS PC, R14, #0x4
.section DSEG, "w"
.global MemoryErrors .global MemoryWordErrors .global MemoryHWordErrors .global MemoryByteErrors .global NumberOfIRQs .global NumberOfFIQs
MemoryErrors: .word 0 MemoryWordErrors: .word 0 MemoryHWordErrors: .word 0 MemoryByteErrors: .word 0 NumberOfIRQs: .word 0 NumberOfFIQs: .word 0
.space 232
.section SVC_STACK, "w"
.space 256
.global SVC_STACK_TOP
.section IRQ_STACK, "w" .space 256IRQ_STACK_TOP:
.global IRQ_STACK_TOP
.section FIQ_STACK, "w"FIQ_STACK_TOP:
.space 256
.global FIQ_STACK_TOP
.end
I would be very grateful If someone could help me or just give me an advice. Thank you in advance !
-- Khem Raj <kraj@mvista.com> MontaVista Software Inc.
-- For unsubscribe information see http://sourceware.org/lists.html#faq
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |