Y86-64汇编实现链表:无法获取下一节点地址指针求助
Y86-64链表遍历:获取下一节点地址的解决方案
你的核心问题是缺少读取下一节点地址的指令,同时循环终止逻辑的顺序有误。以下是修正后的代码及关键说明:
修正后的完整代码
irmovq list, %rax # 获取链表第一个节点的地址 irmovq $0, %rbx # 初始化运行总和为0 loop: # 读取当前节点的值 mrmovq (%rax), %rsp # 将值累加到总和寄存器 addq %rsp, %rbx # 读取下一节点的地址:当前节点偏移8字节处存储着下一个节点的指针 mrmovq 8(%rax), %rax # 判断是否到达链表末尾(下一节点地址为0) irmovq $0, %rcx subq %rax, %rcx je endState jmp loop endState: halt # 程序终止,%rbx中存储最终累加总和 .align 8 list: ele1: .quad 0x100 .quad ele4 ele2: .quad 0x10 .quad ele3 ele3: .quad 0x100 .quad ele5 ele4: .quad 0x1000 .quad ele2 ele5: .quad 0x10000 .quad 0
关键修改点说明
读取下一节点地址
每个链表节点是16字节结构:前8字节是节点值,后8字节是下一节点的地址。通过mrmovq 8(%rax), %rax可以直接从当前节点的偏移8字节位置读取下一节点的地址,并更新%rax寄存器,让下一次循环处理新节点。调整循环终止逻辑顺序
原代码先判断再更新节点地址,会导致漏掉最后一个节点的判断。修正后先更新%rax为下一节点地址,再判断是否为0(链表末尾标记),确保所有节点都被处理后才退出循环。移除无用指令
删掉了未使用的irmovq $8, %rdx,以及endState中无意义的rrmovq %rcx, %rax,精简代码逻辑。
遍历流程验证
按修正后的代码执行,累加顺序为:0x100 → 0x1000 → 0x10 → 0x100 → 0x10000,最终%rbx的结果为0x11210,符合链表节点值的总和。
内容的提问来源于stack exchange,提问作者Jtrom2021
相关产品推荐
相关产品推荐

