0

私はCコードを取り、それをx86-64アセンブリに変換してからY86に変更するクラスプロジェクトを行っています。これで、リンクされたリスト内の要素の合計を 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 $24,%rdx
        subq %rdx,%rsp
        irmovq $0,%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 $0,%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;
}
4

1 に答える 1

2

コードを見ると、ノードへのポインタは 24(rbp) ではなく 16(rbp) にあるようです。0(rbp) = 保存された rbp 値、8(rbp) = 戻りアドレス、16(rbp) = ノードへのポインター (リンクされたリストへ)。rbp が保存される前に、余分な 8 バイトがスタックにプッシュされる場所がわかりません。

プログラムは停止命令で終了します。これが発生したときに rax の内容を特定できますか (デバッガーを使用するなど)?

于 2016-10-10T00:08:45.027 に答える