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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:36:02