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在修改它之前必须先保存其值,返回时恢复,但第一段代码完全没有做这个操作,破坏了调用上下文。
第二段代码的合法性与有效性
第二段代码可以正常运行并完成计算逻辑,但写法仍存在不规范之处:
- 功能有效性:
- 代码完成了
(4+5)²=81的计算,最终结果存放在r0中。 - 新增的
exit函数重新通过LDR r7, =1设置了正确的exit系统调用号,执行SWI 0时能正常触发退出系统调用,因此程序不会再出现系统调用错误。
- 代码完成了
- 不规范点:
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
相关产品推荐
相关产品推荐

