Y86 代码 - 不 return 或显示 rax

Y86 Code - doesn't return or show rax

我正在做一个 class 项目,我将采用 C 代码,将其转换为 x86-64 汇编,然后将其更改为 Y86。在此我假设 return 链接列表中元素的总和到 rax。然而,当我尝试使用 y86 编译器时,它并没有出现。我制作的 y86 看起来像这样:

.pos 0
irmovq Stack,%rsp
irmovq Stack,%rbp
jmp Main

Main:
        irmovq ele1,%rax
        pushq %rax
        call sum_list
        halt

sum_list:
        pushq %rbp
        rrmovq %rsp,%rbp
        irmovq ,%rdx
        subq %rdx,%rsp
        irmovq [=11=],%rdx
        rmmovq %rdx,-8(%rbp)
        jmp L2
L3:
        mrmovq 24(%rbp),%rax
        mrmovq (%rax),%rax
        mrmovq -8(%rbp),%rdx
        addq %rax,%rdx
        rmmovq %rdx,-8(%rbp)
        mrmovq 24(%rbp),%rax
        mrmovq -8(%rax),%rax
        rmmovq %rax,24(%rbp)
L2:
        irmovq [=11=],%rcx
        mrmovq 24(%rbp),%rdx
        subq %rcx,%rdx
        jne L3
        mrmovq -8(%rbp),%rax
        rrmovq %rbp,%rsp
        popq %rbp
        ret

#linked-list
.align 8
ele1:
        .quad 0x00d
        .quad ele2
ele2:
        .quad 0x0e0
        .quad ele3
ele3:
        .quad 0xf00
        .quad 0

.pos 0x500
Stack:

所以 rax 应该有 0xfed,但在我的结果中,什么也没有出现。

这是我从中得到的 C 代码:

typedef struct ELE{
  long val;
  struct ELE *next;
} *list_ptr

long sum_list(list_ptr ls){
  long val = 0;
  while(ls){
    val += ls->val;
    ls = ls->next;
  }
  return val;
}

看代码,好像指向节点的指针应该在16(rbp),而不是24(rbp)。 0(rbp) = 保存的 rbp 值,8(rbp) = return 地址,16(rbp) = 节点指针(指向链表)。在保存 rbp 之前,我没有看到额外的 8 个字节被压​​入堆栈的位置。

程序以暂停指令结束。发生这种情况时(例如使用调试器),您是否能够确定 rax 的内容?