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。
相关产品推荐
相关产品推荐

