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

ARMv6汇编计算(x+y)²代码报错原因及修改版有效性咨询

ARMv6汇编代码问题分析:(x+y)²计算代码的错误原因与合法性验证

第一段代码失效的原因

第一段代码的核心问题是破坏了系统调用号的存储寄存器r7,且违反了ARM调用规范:

  • 在ARM Linux环境中,r7寄存器用于存放系统调用号,SWI #0触发系统调用时会读取r7的值来确定执行哪个系统调用。你在_start中将r7设为1(对应exit系统调用),但调用calc函数时,calc直接执行ADD r7, r0, r1把r7的值覆盖成了4+5=9。
  • 当从calc返回后执行SWI #0,此时系统调用号变成了9,而该调用号在你的运行环境中不被支持,因此触发了Unsupported ARM syscall: 0xffffffdf错误。
  • 另外,按照ARM APCS调用规范,r7属于被调用者保存寄存器,如果调用者(这里是_start)使用了该寄存器,被调用函数calc在修改它之前必须先保存其值,返回时恢复,但第一段代码完全没有做这个操作,破坏了调用上下文。

第二段代码的合法性与有效性

第二段代码可以正常运行并完成计算逻辑,但写法仍存在不规范之处:

  1. 功能有效性:
    • 代码完成了(4+5)²=81的计算,最终结果存放在r0中。
    • 新增的exit函数重新通过LDR r7, =1设置了正确的exit系统调用号,执行SWI 0时能正常触发退出系统调用,因此程序不会再出现系统调用错误。
  2. 不规范点:
    • calc函数仍然直接修改了r7寄存器,违反了ARM调用规范。如果后续代码在调用calc后需要使用r7的原有值,会出现上下文错误。正确的写法应该在calc中先保存r7的值(比如压入栈),返回前恢复,示例如下:
      calc:
          PUSH {r7, lr}  // 保存r7和链接寄存器
          ADD r7, r0, r1
          MUL r0, r7, r7
          POP {r7, pc}   // 恢复r7并返回
      

内容的提问来源于stack exchange,提问作者immi0815

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:15:33