ARM汇编循环中Y值最小值无法正确更新问题求助
ARM汇编多项式最小值计算问题排查
你遇到的最小值始终等于当前Y值的问题,大概率是最小值初始化逻辑错误或者比较更新的分支条件写反导致的,以下是具体排查点和修正思路:
常见错误点及排查步骤
1. 最小值初始化错误
如果代码没有在循环开始前给最小值设置合理初始值,而是每次循环直接将当前Y赋值给最小值,就会导致两者始终相同。
- 正确做法:
- 要么在循环前将最小值寄存器初始化为有符号整数最大值(比如ARM32位的
0x7FFFFFFF),确保第一个计算出的Y一定会比它小,完成第一次更新; - 要么在第一次计算Y后,将最小值直接设为这个初始Y值,再进行后续循环的比较。
- 要么在循环前将最小值寄存器初始化为有符号整数最大值(比如ARM32位的
2. 比较与更新的分支条件写反
计算出Y后,若比较分支逻辑搞反,会导致每次都把当前Y赋值给最小值:
- 错误示例:用
BGT/BGE(大于/大于等于时跳转)更新最小值,会导致只要当前Y比最小值大就替换,最终最小值始终是最新的Y; - 正确逻辑:应该用
BLT/BLE(小于/小于等于时跳转),只有当当前Y比最小值更小时,才更新最小值寄存器。
3. 最小值寄存器被意外覆盖
检查计算多项式Y的过程中,是否误用到了存储最小值的寄存器。比如计算3x³、31x²等中间值时,若不小心覆盖了最小值寄存器,会导致每次比较的都是当前Y和被覆盖后的寄存器值,结果自然相同。
4. 输出逻辑混淆寄存器
确认输出代码中,是否把当前Y的寄存器和最小值的寄存器搞混了,比如误将Y的寄存器值当作最小值输出,也会造成视觉上的“两者相同”。
正确逻辑示例片段
以下是核心逻辑的ARM汇编示例,供参考:
@ 初始化循环变量x = -10 MOV r4, #-10 @ 初始化最小值为32位有符号极大值 LDR r5, =0x7FFFFFFF loop_start: @ -------------------------- @ 计算Y = 3x³ + 31x² -15x -127 @ 计算x²: r0 = x*x MUL r0, r4, r4 @ 计算x³: r1 = x²*x MUL r1, r0, r4 @ 3x³: r2 = 3*x³ MOV r2, #3 MUL r2, r2, r1 @ 31x²: r3 =31*x² MOV r3, #31 MUL r3, r3, r0 @ -15x: r6 = -15*x MOV r6, #-15 MUL r6, r6, r4 @ 汇总计算Y: r7 = 3x³ +31x² + (-15x) -127 ADD r7, r2, r3 ADD r7, r7, r6 SUB r7, r7, #127 @ -------------------------- @ 比较当前Y(r7)与最小值(r5) CMP r7, r5 @ 若Y更小,更新最小值 BLT update_min_val @ 跳过更新,直接输出 B print_result update_min_val: MOV r5, r7 @ 将最小值更新为当前Y print_result: @ 此处添加输出x(r4)、Y(r7)、最小值(r5)的代码 @ ... @ x自增1,准备下一次循环 ADD r4, r4, #1 @ 判断是否遍历到4(包含4,所以当x=5时退出循环) CMP r4, #5 BLT loop_start
内容的提问来源于stack exchange,提问作者Jarvis
相关产品推荐
相关产品推荐

