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
运行验证说明
- 单步调试时可观察寄存器数值变化:正常运行时R0=7、R1=2、R2=5、R3=4、R4=9
- 运算结果同时会写入内存的
result变量地址,可在内存窗口查看对应位置的数值 - 如果仅需验证括号内x-y部分,注释Z相关加载、加法代码即可,减法结果保存在R2寄存器
内容的提问来源于stack exchange,提问作者Connor Meek
相关产品推荐
相关产品推荐

