【问题标题】:ARM Assembly storing registers to memoryARM 程序集将寄存器存储到内存
【发布时间】:2014-04-26 23:50:31
【问题描述】:

我有以下对两个向量执行操作的简单程序; 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,所以我不明白为什么内存没有更新。非常感谢任何帮助。

【问题讨论】:

  • 这段代码是从 RAM 还是从 FLASH 运行的?一个简单的STR 不会改变FLASH。我不确定 armasm 是否乐意拥有两个名称相同但属性不同的区域;我认为您缺少VecC 中的一些元素;你可以使用STR R5, [R2], #4
  • 不知道你应该将 VecC 定义为漂亮的 0 而不是一个单一的?
  • @auselen 已经试过了。没用。
  • @scott 我在 KEIL 上运行它,所以它是从 RAM 运行的。另外,如果我更改了两个部分的名称,它甚至都无法编译……移到下一个单词也无济于事。
  • 你确定模拟器是在模拟代码所在的内存吗?如果更改区域名称,则需要将 ADR rN, VecX 更改为 LDR rN, =VecX,因为直到链接时间才会知道偏移量。

标签: assembly arm


【解决方案1】:

我想出了问题所在。我正在使用 Keil 模拟器,显然我必须手动映射我要写入的内存段。我通过在程序运行时单击Debug -> Memory Map... 菜单来做到这一点,然后我映射了一个段范围并赋予它Read, Write, Execute 权限。

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多