1

リンクされたリストの値を合計することになっている CMU の Architecture lab からの次の y86-64 プログラムがあります。

    # Adam Cooper ac251190

init:
        .pos 0x0
        irmovq Stack, %rsp  # set up stack pointer
        irmovq Stack, %rbp   # set up base pointer
        call Main
        halt

# Sample linked list
.align 8
ele1:
        .quad 0x00a
        .quad ele2
ele2:
        .quad 0x0b0
        .quad ele3
ele3:
        .quad 0xc00
        .quad 0

Main:
        irmovq ele1, %rax
        pushq  %rax        # Pointer to list pushed to stack
        call   Sum
        ret

Sum:
        pushq  %rbp           # Push %rbp onto the stack
        rrmovq %rsp, %rbp
        mrmovq 8(%rbp), %rdx  # Move ele1 into %rdx
        irmovq $0, %rax       # Set up a base to add eles to
        andq   %rdx, %rdx     # Is this the end of the list?
        je     End            # If it is, jump to the end
        irmovq $8, %rcx       # Turn %rcx into a index mover

Loop:
        mrmovq (%rdx), %rbx   # Move ls into %rbx
        addq   %rbx, %rax     # val += ele
        addq   %rcx, %rdx     # Move to next value in the list
        mrmovq (%rdx), %rdx
        andq   %rdx, %rdx     # Are we at the last ele?
        jne    Loop           # If not, go again

End:
        popq %rbp # TEAR! DOWN! THE STACK!
        ret       # Return the original call to Main

        .pos 0x400
Stack:

プログラムは、行である行のステータス"ADR"で停止します0x093

Loop: 
        mrmovq (%rdx), %rbx 

"ADR"さて、エラーはプログラムがより高いアドレスにアクセスしようとしていることを意味するというドキュメントを信じるようになりましたが、0xFFFそうではありません。スタックも初期化され、正しく設定されているようです。私が書いた他のいくつかのプログラムと同じ方法を使用しましたが、うまくいきました。ここで何が問題なのかよくわかりません。

4

1 に答える 1