2401_84419825 2024-04-26 11:33 采纳率: 58.8%
浏览 2
已结题

arm嵌入式有关问题

img


R1~6分别是多少?思考回答,上机使用ADS1.2软件,验证答案。

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-26 11:34
    关注

    引自免费微信小程序:皆我百晓生

    在ARM汇编语言中,指令LDMIA(Load Multiple Immediate with Auto-increment)用于从内存中加载多个寄存器,并且在每次加载后自动递增地址。该指令格式如下:

    LDM[!]{<registers>} <address>
    

    其中,<registers> 是要装载的寄存器列表,<address> 是起始地址。如果在指令前有感叹号(!),表示地址会在每次加载操作后自动增加一个寄存器宽度(通常为4个字节)。

    根据题目描述,指令 LDMIA R1!, {R2-R4, R6} 的含义是从地址R1开始,连续读取四个寄存器大小的数据到R2、R3、R4和R6,然后将R1的值加4。由于R5没有包含在装载列表中,它的值不会改变。

    初始状态:

    • R1 = 0x40000000
    • R2 = 0x40000001
    • R3 = 0x40000002
    • R4 = 0x40000003
    • R5 = 0x40000004
    • R6 = 0x40000005

    内存内容:

    • 0x40000000: 0x11 (R2)
    • 0x40000004: 0x22 (R3)
    • 0x40000008: 0x33 (R4)
    • 0x4000000C: 0x44 (R6)

    执行LDMIA R1!, {R2-R4, R6}后:

    • R1会变为0x40000008,因为地址自动增加了4个字节
    • R2会变为0x11,因为从0x40000000读取了这个值
    • R3会变为0x22,因为从0x40000004读取了这个值
    • R4会变为0x33,因为从0x40000008读取了这个值
    • R5保持不变,仍然是0x40000004
    • R6会变为0x44,因为从0x4000000C读取了这个值

    为了验证这个结果,你可以在ADS1.2软件中设置这些寄存器的初始值,并写入相应的代码进行测试。但请注意,ADS1.2是一个较老的版本,可能已经不被广泛支持,建议使用更新的Keil MDK或其他现代开发工具。然而,如果你确实需要在ADS1.2中进行测试,可以创建一个新的项目,添加以下伪代码并设置断点:

            .equ R1, 0x40000000
            .equ R2, 0x40000001
            .equ R3, 0x40000002
            .equ R4, 0x40000003
            .equ R5, 0x40000004
            .equ R6, 0x40000005
            
            ldr r0, =0x40000000
            str r1, [r0]
            ldr r0, =0x40000004
            str r2, [r0]
            ldr r0, =0x40000008
            str r3, [r0]
            ldr r0, =0x4000000C
            str r4, [r0]
    
            ldmia R1!, {R2-R4, R6}
    
            // 设置断点和观察寄存器值
            b .
    

    然后运行调试器,在断点处检查R1至R6的值是否符合预期。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月26日
  • 创建了问题 4月26日