You need to enable JavaScript to run this app. x86_64汇编实现10个int元素数组求和函数输出随机数求助
优惠活动
大模型
产品
解决方案
定价
更多

x86_64汇编实现10个int元素数组求和函数输出随机数求助

代码问题排查

1. 段归属完全错位

你写的代码从开头声明.section .data开始,就没切回存放可执行代码的.text段,直接把func、main的所有机器指令全塞到.data数据段里了。
x86_64 Linux环境下的ELF程序,.data段的加载基址就在0x400000附近(十进制就是4194304开头的区间),刚好对应你看到的4195600~4195700的输出范围。再加上*.data段默认属性是可读可写、不可执行*,你现在程序能跑纯粹是调试环境临时关闭了权限检查,本身代码结构完全不符合规范。

  • 修正:iarr数组定义写完之后,立刻加.section .text切回代码段,再编写func和main的所有指令。

2. 累加寄存器未初始化

求和结果存在%eax寄存器里,但你进入func之后从头到尾没把这个寄存器清0。函数入口处%eax的值是上一层代码残留的随机垃圾值,哪怕循环逻辑算得再对,最终结果也是错的。

  • 修正:在func的最开头加movl $0, %eax,让累加器从0开始计算。

3. 程序执行流完全漂移

你在main里写完call func就没有后续逻辑了。func最后执行ret指令时,会跳回call指令的下一条位置,因为没有明确的跳转逻辑,执行流会顺着内存里的原始数据随机运行,根本进不到老师提供的框架自带的打印、退出流程,自然会输出一堆数据段范围内的随机地址值。

  • 修正:call func拿到求和结果后,按照老师框架的约定把结果放到指定的输出位置,再跳转到框架的标准退出流程,避免执行流随机乱跑。

循环逻辑无问题

你现在写的计数逻辑本身是对的:进func先跳去边界判断,初始%rcx是0,判断不到10次循环上限就跳进循环体累加元素、递增索引,刚好能遍历完10个数组元素,这块不需要调整。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 06:24:03