Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7194013
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 28, 20262026-05-28T20:17:08+00:00 2026-05-28T20:17:08+00:00

Is it possible to auto-increment the base address of a register on a STR

  • 0

Is it possible to auto-increment the base address of a register on a STR with a [Rn]!? I’ve peered through the documentation but haven’t been able to find a definitive answer, mainly because the command syntax is presented for both LDR and STR – in theory it should work for both, but I couldn’t find any examples of auto-incrementing on a store (the loading works ok).

I’ve made a small program which stores two numbers in a vector. When it’s done the contents of out should be {1, 2} but the store overwrites the first byte, as if the auto-increment isn’t working.

#include <stdio.h>

int main()
{
        int out[]={0, 0};
        asm volatile (
        "mov    r0, #1          \n\t"
        "str    r0, [%0]!       \n\t"
        "add    r0, r0, #1      \n\t"
        "str    r0, [%0]        \n\t"
        :: "r"(out)
        : "r0" );
        printf("%d %d\n", out[0], out[1]);
        return 0;
}

EDIT:
While the answer was right for regular loads and stores, I found that the optimizer messes up auto-increment on vector instructions such as vldm/vstm. For instance, the following program

#include <stdio.h>

int main()
{
        volatile int *in = new int[16];
        volatile int *out = new int[16];

        for (int i=0;i<16;i++) in[i] = i;

        asm volatile (
        "vldm   %0!, {d0-d3}            \n\t"
        "vldm   %0,  {d4-d7}            \n\t"
        "vstm   %1!, {d0-d3}            \n\t"
        "vstm   %1,  {d4-d7}            \n\t"
        :: "r"(in), "r"(out)
        : "memory" );

        for (int i=0;i<16;i++) printf("%d\n", out[i]);
        return 0;
}

compiled with

g++ -O2 -march=armv7-a -mfpu=neon main.cpp -o main

will produce gibberish on the output of the last 8 variables, because the optimizer is keeping the incremented variable and using it for the printf. In other words, out[i] is actually out[i+8], so the first 8 printed values are the last 8 from the vector and the rest are memory locations out of bounds.

I’ve tried with different combinations of the volatile keyword throughout the code, but the behavior changes only if I compile with the -O0 flag or if I use a volatile vector instead of a pointer and new, like

volatile int out[16];
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-28T20:17:09+00:00Added an answer on May 28, 2026 at 8:17 pm

    For store and load you do this:

    ldr r0,[r1],#4
    str r0,[r2],#4
    

    whatever you put at the end, 4 in this case, is added to the base register (r1 in the ldr example and r2 in the str example) after the register is used for the address but before the instruction has completed it is very much like

    unsigned int a,*b,*c;
    ...
    a = *b++;
    *c++ = a;
    

    EDIT, you need to look at the disassembly to see what is going on, if anything. I am using the latest code sourcery or now just sourcery lite from mentor graphics toolchain.

    arm-none-linux-gnueabi-gcc (Sourcery CodeBench Lite 2011.09-70) 4.6.1

    #include <stdio.h>
    int main ()
    {
            int out[]={0, 0};
            asm volatile (
            "mov    r0, #1          \n\t"
            "str    r0, [%0], #4       \n\t"
            "add    r0, r0, #1      \n\t"
            "str    r0, [%0]        \n\t"
            :: "r"(out)
            : "r0" );
            printf("%d %d\n", out[0], out[1]);
            return 0;
    }
    
    
    arm-none-linux-gnueabi-gcc str.c -O2  -o str.elf
    
    arm-none-linux-gnueabi-objdump -D str.elf > str.list
    
    
    00008380 <main>:
        8380:   e92d4010    push    {r4, lr}
        8384:   e3a04000    mov r4, #0
        8388:   e24dd008    sub sp, sp, #8
        838c:   e58d4000    str r4, [sp]
        8390:   e58d4004    str r4, [sp, #4]
        8394:   e1a0300d    mov r3, sp
        8398:   e3a00001    mov r0, #1
        839c:   e4830004    str r0, [r3], #4
        83a0:   e2800001    add r0, r0, #1
        83a4:   e5830000    str r0, [r3]
        83a8:   e59f0014    ldr r0, [pc, #20]   ; 83c4 <main+0x44>
        83ac:   e1a01004    mov r1, r4
        83b0:   e1a02004    mov r2, r4
        83b4:   ebffffe5    bl  8350 <_init+0x20>
        83b8:   e1a00004    mov r0, r4
        83bc:   e28dd008    add sp, sp, #8
        83c0:   e8bd8010    pop {r4, pc}
        83c4:   0000854c    andeq   r8, r0, ip, asr #10
    

    so the

    sub sp, sp, #8
    

    is to allocate the two local ints out[0] and out[1]

    mov r4,#0
    str r4,[sp]
    str r4,[sp,#4]
    

    is because they are initialized to zero, then comes the inline assembly

    8398:   e3a00001    mov r0, #1
    839c:   e4830004    str r0, [r3], #4
    83a0:   e2800001    add r0, r0, #1
    83a4:   e5830000    str r0, [r3]
    

    and then the printf:

    83a8:   e59f0014    ldr r0, [pc, #20]   ; 83c4 <main+0x44>
    83ac:   e1a01004    mov r1, r4
    83b0:   e1a02004    mov r2, r4
    83b4:   ebffffe5    bl  8350 <_init+0x20>
    

    and now it is clear why it didnt work. you are didnt declare out as volatile. You gave the code no reason to go back to ram to get the values of out[0] and out[1] for the printf, the compiler knows that r4 contains the value for both out[0] and out[1], there is so little code in this function that it didnt have to evict r4 and reuse it so it used r4 for the printf.

    If you change it to be volatile

        volatile int out[]={0, 0};
    

    Then you should get the desired result:

    83a8:   e59f0014    ldr r0, [pc, #20]   ; 83c4 <main+0x44>
    83ac:   e59d1000    ldr r1, [sp]
    83b0:   e59d2004    ldr r2, [sp, #4]
    83b4:   ebffffe5    bl  8350 <_init+0x20>
    

    the preparation for printf reads from ram.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Is it possible to have an auto-increment property but not an ID in JPA?
Is it possible to find out what the next auto increment will be for
Is It Possible to have a primary key and auto increment key associated to
Is it possible to set the value of an auto-increment field? If a record
Possible Duplicate: MySQL - Auto Increment after delete I want to delete the last
Possible Duplicate: Push-Notification Badge auto increment. I have implemented Push Notification for my iPhone
Is it possible to have an integer property of a class auto increment managed
Is it possible to attach a letter in front of an auto-increment in MySQL.
Is it possible to natively auto-increment letters in MySql? If not can you suggest
I cant use auto increment in phpmyadmin for this but I would like to

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.