ARM汇编循环中Y最小值显示异常问题求助
问题排查与修复方案
核心问题:最小值初始值设置错误
你的代码中初始将最小值寄存器x20设为0,但0并不是x∈[-10,4]范围内任何x对应的Y值。当x从-10到-2时,计算出的Y值均为正数(比如x=-10时Y=123,x=-2时Y=3),这些值都大于初始的0,因此cmp x23, x20后b.lt条件不成立,最小值始终保持0,直到x=-1时Y=-84(小于0)才触发更新。
但程序的实际需求是跟踪所有计算出的Y值中的最小值,而非以0作为无意义的初始基准。
具体修复步骤
1. 调整最小值初始化逻辑
移除mov x20, 0的初始赋值,改为在第一次计算Y值后,将x20设置为第一个Y值(即x=-10对应的Y),确保最小值从实际计算结果开始跟踪。
修改后的代码示例(调整main和Loop部分):
.output: .string "X = %d, Y = %d Current Minimum of Y is:%d \n" .balign 4 .global main main: stp x29, x30, [sp,-16]! mov x29, sp mov x18, -10 // 初始化X为-10 mov x19, 0 // Y寄存器 // 移除x20的初始0赋值 // 第一次计算Y并初始化最小值 mov x19, 0 mov x21, 0 mov x22, 0 mov x23, 0 add x19, x19, -127 mov x24, -15 mul x24, x24, x18 add x21, x19, x24 mov x24, x18 mul x24, x24, x24 mov x25, 31 mul x24, x24, x25 add x22, x21, x24 mov x24, x18 mul x24, x24, x24 mul x24, x24, x18 mov x25, 3 mul x24, x24, x25 add x23, x24, x22 mov x20, x23 // 初始化最小值为第一个Y值 // 打印第一次结果 adrp x0, .output add x0, x0, :lo12: .output mov x1, x18 mov x2, x23 mov x3, x20 bl printf add x18, x18, 1 // X自增为-9 Loop: cmp x18, 4 b.gt end // 后续循环的Y计算逻辑不变 mov x19, 0 mov x21, 0 mov x22, 0 mov x23, 0 add x19, x19, -127 mov x24, -15 mul x24, x24, x18 add x21, x19, x24 mov x24, x18 mul x24, x24, x24 mov x25, 31 mul x24, x24, x25 add x22, x21, x24 mov x24, x18 mul x24, x24, x24 mul x24, x24, x18 mov x25, 3 mul x24, x24, x25 add x23, x24, x22 cmp x23, x20 b.lt update_min b print update_min: mov x20, x23 print: adrp x0, .output add x0, x0, :lo12: .output mov x1, x18 mov x2, x23 mov x3, x20 bl printf add x18, x18, 1 b Loop end: ldp x29, x30, [sp], 16 ret
2. 可选优化:封装计算逻辑
将Y的计算代码封装为子函数,减少重复代码,提高可维护性:
// 新增计算Y的子函数:输入x18为X,返回x23为Y calc_Y: mov x19, 0 mov x21, 0 mov x22, 0 mov x23, 0 add x19, x19, -127 mov x24, -15 mul x24, x24, x18 add x21, x19, x24 mov x24, x18 mul x24, x24, x24 mov x25, 31 mul x24, x24, x25 add x22, x21, x24 mov x24, x18 mul x24, x24, x24 mul x24, x24, x18 mov x25, 3 mul x24, x24, x25 add x23, x24, x22 ret
之后在main和Loop中通过bl calc_Y调用即可完成Y值计算。
额外验证点
- 确认有符号比较逻辑:
b.lt是ARM的有符号数小于判断,符合Y值可能为负的需求,这部分无需修改。 - 手动验证计算结果:
- x=-10时Y=123,x=-1时Y=-84,x=4时Y=501,可对照汇编运行结果确认计算正确性。
内容的提问来源于stack exchange,提问作者Dream Cloud
相关产品推荐
相关产品推荐

