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

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

关键修改点说明

  1. 读取下一节点地址
    每个链表节点是16字节结构:前8字节是节点值,后8字节是下一节点的地址。通过mrmovq 8(%rax), %rax可以直接从当前节点的偏移8字节位置读取下一节点的地址,并更新%rax寄存器,让下一次循环处理新节点。

  2. 调整循环终止逻辑顺序
    原代码先判断再更新节点地址,会导致漏掉最后一个节点的判断。修正后先更新%rax为下一节点地址,再判断是否为0(链表末尾标记),确保所有节点都被处理后才退出循环。

  3. 移除无用指令
    删掉了未使用的irmovq $8, %rdx,以及endState中无意义的rrmovq %rcx, %rax,精简代码逻辑。

遍历流程验证

按修正后的代码执行,累加顺序为:0x100 → 0x1000 → 0x10 → 0x100 → 0x10000,最终%rbx的结果为0x11210,符合链表节点值的总和。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:57:40