from armasm to gnu arm assembler

Khem Raj kraj@mvista.com
Mon Apr 30 09:01:00 GMT 2007



salut! said the following on 4/27/2007 8:17 AM:
> 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'
>  
>   
I have tried to insert corrected statements in the assembly below. You 
were not using .macro directive correctly
and secondly you did not declare SVC_STACK_TOP as a label. I think it 
does not have to global.

Hope this helps.


>
> ************************************************************************
> 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, CPSR
>     MOV     R1, R0
>     AND     R1, R1, #0x1F       
>     BIC     R0, R0, #0x1F       
>     ORR     R0, R0, #mode 
 ORR     R0, R0, #\mode

>      
>     MSR     CPSR_csfx, R0       
>     LDR     R13,=$stack_pointer
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
>   
SVC_STACK_TOP:
> .section IRQ_STACK, "w" 
>     .space    256
>     .global IRQ_STACK_TOP
>   
IRQ_STACK_TOP:

> .section FIQ_STACK, "w"
>     .space    256
>     .global FIQ_STACK_TOP
>   
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



More information about the crossgcc mailing list