You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keil uVision环境下Arm汇编实现(x-y)+z运算的问题咨询

ARM汇编result = (x-y) + z实现问题排查与修正

核心错误点

  • 指令功能搞反:LDR是从内存加载数据到寄存器,STR是把寄存器数据写入内存。你当前代码中用STR操作会把未初始化的寄存器值覆盖内存里的X、Y变量值,完全不符合从内存取x、y的需求。
  • 未完成变量取值操作:你提到已经把x、y加载到R0、R1,但现有代码仅把X、Y的地址赋值给了寄存器,没有真正把内存中存储的数值加载到寄存器,参与减法运算的R1、R3都是未初始化的随机值,运算结果自然不符合预期。
  • 变量定义位置错误:你把X、Y变量定义在了只读代码段(AREA Demo, CODE, READONLY)中,该段不允许写入操作,你执行的STR写内存操作本身会失效。
  • 运算逻辑不匹配:当前加法指令ADD R3, R3, #1和你要实现的(x-y)+z逻辑完全无关,且Z变量已经被注释,无法参与运算。

修正后代码(完整实现目标运算)

AREA RESET, DATA, READONLY
    EXPORT __Vectors
__Vectors
    DCD 0x20001000
    DCD Reset_Handler ; reset vector
    ALIGN
    ; 新增可写数据段存储变量
    AREA MyData, DATA, READWRITE
X DCD 7
Y DCD 2
Z DCD 4
result DCD 0

    AREA Demo, CODE, READONLY
    ENTRY
    EXPORT Reset_Handler
Reset_Handler
    ; 加载X的数值到R0
    LDR R0, =X
    LDR R0, [R0]
    ; 加载Y的数值到R1
    LDR R1, =Y
    LDR R1, [R1]
    ; 计算x-y,结果存到R2
    SUB R2, R0, R1
    ; 加载Z的数值到R3
    LDR R3, =Z
    LDR R3, [R3]
    ; 计算(x-y)+z,结果存到R4
    ADD R4, R2, R3
    ; 存储结果到内存的result变量
    LDR R5, =result
    STR R4, [R5]

stop B stop
    END

运行验证说明

  1. 单步调试时可观察寄存器数值变化:正常运行时R0=7、R1=2、R2=5、R3=4、R4=9
  2. 运算结果同时会写入内存的result变量地址,可在内存窗口查看对应位置的数值
  3. 如果仅需验证括号内x-y部分,注释Z相关加载、加法代码即可,减法结果保存在R2寄存器

内容的提问来源于stack exchange,提问作者Connor Meek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:24:03