ARM Assembly хранит регистры в памяти

У меня есть следующая простая программа, которая выполняет операцию над двумя векторами; A и B (которые хранятся в памяти) и сохраняют результат обратно в память, указанную вектором C:

        AREA MyProgram, CODE, READONLY
        ENTRY

Start   ADR R0, VecA
        ADR R1, VecB
        ADR R2, VecC

        ; R6 is a counter
        MOV R6, #1

Loop    ; Get the value R0 is pointing to
        LDR R3, [R0], #4

        ; Get the value R1 is pointing to
        LDR R4, [R1], #4

        ; Add the values
        ADD R5, R4, R3

        ; Divide the value by 2 (i.e. shift right by 1)
        LSR R5, #1

        ; Store the resut to memory for C
        STR R5, [R2]

        ; Increment R2 to point to the next memory location
        ADD R2, R2, #4

        ; Increment the counter. If it's 9, we're done
        ; (since the vector has 8 elements)
        ADD R6, R6, #1

        CMP R6, #9
        BNE Loop
        B Done

Done    b Done ; Loop forever


        AREA MyProgram, DATA, READWRITE

VecA    DCD 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9
VecB    DCD 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9
VecC    DCD 0x0


        END

Все работает хорошо до STR R5, [R2] инструкция. Инструкция не обновляет память (адрес, на который указывает R2 остается неизменной; то есть 0x00). Я пытался понять это в течение нескольких часов и абсолютно не знаю, что происходит не так. Раздел данных явно говорит READWRITE, поэтому я не понимаю, почему память не обновляется. Любая помощь с благодарностью.

1 ответ

Решение

Я понял, в чем проблема. Я использую симулятор Keil и, видимо, мне пришлось вручную сопоставлять сегменты памяти, в которые я буду записывать. Я сделал это, нажав на Debug -> Memory Map... меню во время работы программы, а затем я сопоставил диапазон сегментов и дал ему Read, Write, Execute привилегии.

введите описание изображения здесь

Другие вопросы по тегам