This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Asm programming

Hello
Where can I find some example programs only in asm to be compiled inder Keil MDK?
I can't compile simple programs as:

STACK_TOP   EQU   0x20002000         ; constant for SP starting value
            AREA  |Header Code|, CODE
            DCD    STACK_TOP  ; Stack top
            DCD    Start      ; Reset vector
            ENTRY             ; Indicate program execution start here
Start       ; Start of main program
            ; initialize registers
            MOV   r0,  #10    ; Starting loop counter value
            MOV   r1,  #0     ; starting result
            ; Calculated 10+9+8+...+1
loop
            ADD   r1,  r0     ; R1R1 + R0
            SUBS  r0,  #1     ; Decrement R0, update fl ag (“S†sufï¬ x)
            BNE   loop        ; If result not zero jump to loop
            ; Result is now in R1
deadloop
            B     deadloop    ; Inï¬ nite loop
            END               ; End of ï¬ le

Keil gives an error:
Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.

How to change this program? How to change linker control string?

I tried also to add startup code fo nxp1766 but then i still have an error that label __main is missing.

Could You help me and give me some simple programs just to compile it properly?

Parents Reply Children
  • must generate an access fault...

    this is not true for all ARM processors. in fact, STR is documented to have the ability to handle unaligned accesses on ARM7 and Cortex M3 !

  • STR R2, [R3, #0] doesn't work also. Fro me the problem is not the instruction but one additional line in the code.
    I copied the code from:
    embeddedfreak.wordpress.com/.../
    It is the same board.

  • Finally I wrote a program which can be compiled in Keil:

    ; <h> Stack Configuration
    ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ; </h>
    
    Stack_Size      EQU     0x00000200
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    __initial_sp
    
    
    ; <h> Heap Configuration
    ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ; </h>
    
    Heap_Size       EQU     0x00000000
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem        SPACE   Heap_Size
    __heap_limit
    
                    PRESERVE8
                    THUMB
    
    ; Vector Table Mapped to Address 0 at Reset
    
                    AREA    RESET, DATA, READONLY
                    EXPORT  __Vectors
    
    __Vectors       DCD     __initial_sp              ; Top of Stack
                    DCD     Reset_Handler             ; Reset Handler
    
    
    
                    AREA    Program, CODE, READONLY
    
                                    EXPORT Reset_Handler            ;Defines the program starting point
    
    ;Program start
    
    Reset_Handler
    
                            MOV             R1, #0
    
                            MOVW    R3, #0xC040             ;P2.2, P2.3, P2.4, P2.5, and P2.6 function mode is located at FP2DIR (0×2009_C040).
                            MOVT    R3, #0x2009
    
                            MOVW    R2, #0x007C             ;P2.2  -> Bit[2] * P2.3  -> Bit[3]* P2.4  -> Bit[4]* P2.5  -> Bit[5]* P2.6  -> Bit[6] -> Output dir : 1
                            MOVT    R2, #0x0000             ;/* b0000_0000_0000_0000_0000_0000_0111_1100 */
                            STR     R2, [R3, #0]
    
    
    loop
    
                            B       loop
    
                            END
    


    The first part was copied from build-in startup file.
    But it didn't fix the problem....

  • Gp F wrote:
    > R3 contains an unaligned address

    Really? The value in r3 is 0x2009C040. Looks aligned to me.

    MOVW assigns the lower half-word and clears the upper. MOVT assigns
    the upper half-word. Easier to use here would be the pseudo
    instruction

    MOV32 r3, #0x2009C040
    

    Tamir wrote:
    > in fact, STR is documented to have the ability to handle unaligned
    > accesses on ARM7 and Cortex M3 !

    Depends on what is meant by "handle". ARM7 has a rather creative way
    of dealing with unaligned accesses -- the results would be unexpected
    to most people who are unfamiliar with architecture details.

    Cortex-M3 does handle unaligned accesses but not in all
    situations. Check out the documentation.

    --
    Marcus
    http://www.doulos.com/arm/

  • I found the sollution. Probabely the program code was in reserver region. I copied all startup code (all vector table) and now it is working properly. I found it in dissasembled code. In all built in projects the first instruction was in higher address than 0x18 in my code.
    Now I use build in startup file but I have to comment one line:

     User Initial Stack & Heap
    
                    IF      :DEF:__MICROLIB
    
                    EXPORT  __initial_sp
                    EXPORT  __heap_base
                    EXPORT  __heap_limit
    
                    ELSE
    
    ; IMPORT  __use_two_region_memory
                    EXPORT  __user_initial_stackheap
    __user_initial_stackheap
    
                    LDR     R0, =  Heap_Mem
                    LDR     R1, =(Stack_Mem + Stack_Size)
                    LDR     R2, = (Heap_Mem +  Heap_Size)
                    LDR     R3, = Stack_Mem
                    BX      LR
    
                    ALIGN
    
                    ENDIF
    


    because i get following messages:
    blinky.axf: Warning: L6665W: Neither Lib$$Request$$armlib Lib$$Request$$cpplib defined, not searching ARM libraries.
    blinky.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_lpc17xx.o).