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]

from armasm to gnu arm assembler


Hello !

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       
    MRS     R0, CPSR
    MOV     R1, R0
    AND     R1, R1, #0x1F       
    BIC     R0, R0, #0x1F       
    ORR     R0, R0, #$mode      
    MSR     CPSR_csfx, R0       
    LDR     R13,=$stack_pointer 
    BIC     R0, R0, #0x1F       
    ORR     R0, R0, R1          
    MSR     CPSR_csfx, R0        
.endm

.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    256
    .global IRQ_STACK_TOP

.section FIQ_STACK, "w"
    .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 !


-- 
View this message in context: http://www.nabble.com/from-armasm-to-gnu-arm-assembler-tf3658251.html#a10221073
Sent from the gcc - cross compiler mailing list archive at Nabble.com.


--
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]