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

uVision4 Debugger's "Memory 1" Window doesn't show the updated value

I tried to write a simple program that can find the 1's complement of a number and store the result in memory.

This is my program:

;Find the one's complement (inverse) of a number

        TTL     Ch4Ex2 - invert
        AREA    Program, CODE, READONLY
        ENTRY

Main
        LDR     R1, Value       ; Load the number to be complemented
        MVN     R1, R1          ; take 1's complement of R1
        STR     R1, Result      ; Store the result
        SWI     &11

Value   DCD     &FF             ; Value to be complemented
Result  DCD     &ABCD1234       ; Storage for result

        END

When I ran the debugger, I used "Memory 1" window to check the content of Result. But the content of Result didn't change. It kept remained as 0xABCD1234. Can anybody tell me what did I do wrong here?

I am using Keil uVision4 and LPC2368 as my device.

Thank you,
Khai

Parents
  • No I didn't use any startup code. I guess maybe that's why the contents weren't initialized correctly. However I tried to manually initialize the contents by adding the following code at the beginning of the program that you gave me:

                    LDR             R0,=Value
                    MOV             R1,#0xFF
                    STR             R1,[R0]
    
                    LDR             R0,=Result
                    MOV             R1,#0xABCD1234
                    STR             R1,[R0]
    

    But then I got an error message like this:

    Build target 'Target 1'
    assembling One_compl_main.asm...
    One_compl_main.asm(14): error: A1510E: Immediate 0xABCD1234 cannot be represented by 0-255 and a rotation
    Target not created
    

    Could you tell me why I got this error message? I thought registers in the ARM are 32-bit long. Why did it say "cannot be represented by 0-255"?

Reply
  • No I didn't use any startup code. I guess maybe that's why the contents weren't initialized correctly. However I tried to manually initialize the contents by adding the following code at the beginning of the program that you gave me:

                    LDR             R0,=Value
                    MOV             R1,#0xFF
                    STR             R1,[R0]
    
                    LDR             R0,=Result
                    MOV             R1,#0xABCD1234
                    STR             R1,[R0]
    

    But then I got an error message like this:

    Build target 'Target 1'
    assembling One_compl_main.asm...
    One_compl_main.asm(14): error: A1510E: Immediate 0xABCD1234 cannot be represented by 0-255 and a rotation
    Target not created
    

    Could you tell me why I got this error message? I thought registers in the ARM are 32-bit long. Why did it say "cannot be represented by 0-255"?

Children
  • You need to look at your ARM reference guide for details on that one.

    Esentially, the immediate data is contained within the instruction itself. The instruction and data fit into a 32 bit wide instruction - there are only a small proportion of those bits available for the immediate data.

    The following should work:

        LDR             R0,=Value
        MOV             R1,#0xFF       ; You can leave alone (data fits into instruction)
        STR             R1,[R0]
    
        LDR             R0,=Result
        MOV             R1,=0xABCD1234 ; Use a pseudo-op
        STR             R1,[R0]