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
  • I compiled above program from command line and it is working. In Keil i can't compile it. It still needs Reset_Handler label even if I changed Start to Reset_Handler.

  • 1 - Find an example program from Keil for your processor.
    2 - Change the 'main' function to a do nothing.
    3 - Compile the project.
    4 - Now examine, understand and learn from the startup.

    Simple.

  • There is no pure assembler project in Keil MDK.

  • Another problem. I don't know why the board executes only specified number of instructions. Here is the example:

    STACK_TOP   EQU   0x10000200         ; 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
    
                            MOV             R1, #10
    
                            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
                            STR     R2, [R3]
    
    loop
    
                            B       loop
    
    END
    


    This program executes correctly. It defines the GPIO ports as output. On board leds are off (after reset state normally all leds are on).
    Then I modified the program by adding the same line

    STACK_TOP   EQU   0x10000200         ; 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
    
                            MOV             R1, #10
                         MOV             R1, #10
    
                            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
                            STR     R2, [R3]
    
    loop
    
                            B       loop
    
    END
    


    So normally the program does the same but now leds are still on so the instruction STR R2, [R3] is not executing.
    Where is the problem?
    I'm using keil compilers as follows:

    "C:\Program Files\keil\ARM\BIN40\armasm" --device darmp1 -o .\blinky.o .\blinky.s
    "C:\Program Files\keil\ARM\BIN40\armlink" --device darmp1 --rw_base 0x10000000 --ro_base 0x0 --map -o .\blinky.elf .\blinky.o
    "C:\Program Files\keil\ARM\BIN40\fromelf" --bin --output .\blinky.bin .\blinky.elf
    "C:\Program Files\keil\ARM\BIN40\fromelf" --i32 --output .\blinky.hex .\blinky.elf
    

  • "There is no pure assembler project in Keil MDK."

    Who suggested there was?

    The startup code is in assembler - So there would be the starting point.

  • Time to add a data-abort handler and reading about data alignments - R3 contains an unaligned address so

    STR R2,[R3]
    

    must generate an access fault...

  • 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).