ARM汇编实现int8_t数组求最大值始终返回0问题求助
代码错误原因分析
你的代码存在3个核心错误,直接导致结果不符合预期:
- 数组元素读取逻辑错误:你使用
LDR R3, [R2], #4每次读取4字节数据,且地址偏移+4,但数组元素是int8_t(单字节有符号数),应该每次读取1字节、地址偏移+1。同时需要用LDRSB(有符号字节加载指令)做符号扩展,保证负数的比较逻辑正确,普通LDR加载单字节会保留高位垃圾值,完全干扰比较结果。 - 最大值初始值逻辑错误:你直接将返回寄存器
R0初始化为0,如果数组所有元素都是负数,最终会错误返回0而非数组内的最大值,正确做法是将数组第一个元素作为初始最大值。 - 边界处理逻辑漏洞:如果传入的
entries参数为0,你的代码会直接返回0,属于未定义行为,可根据需求添加判空分支提前返回。
修正后的汇编代码
arrayMaxValue: MOV R2, R0 @ 把数组基址从R0转存到R2,R0用来存返回值 @ 先判断条目数为0的边界情况,可根据需求调整返回值 CMP R1, #0 BEQ exitFunc @ 条目数为0直接返回,此时R0值可自定义 @ 加载第一个元素作为初始最大值 LDRSB R0, [R2], #1 SUBS R1, R1, #1 @ 已经读了第一个元素,剩余计数减1 BEQ exitFunc @ 如果只有1个元素直接返回 arrayMaxValueLoop: LDRSB R3, [R2], #1 @ 加载当前有符号字节,地址+1 CMP R3, R0 MOVGT R0, R3 @ 如果当前值更大就更新最大值 SUBS R1, R1, #1 BNE arrayMaxValueLoop exitFunc: BX LR
内容的提问来源于stack exchange,提问作者Judari Loona
相关产品推荐
相关产品推荐

