私が間違っていることを理解しようとしています-リンクリストY86の反復合計

ボニーマハジャン

私はクラスラボでこれを行っていますが、どこが間違っているのかわかりません。プログラムは、すべての命令にqの代わりにlを接尾辞として付けた場合(たとえば、andqの代わりに-andl、rrmovqの代わりにrrmovl)、qではなく動作します。私が間違っていることについてのいくつかの指針を本当に感謝します。

   .pos 0
    init:   irmovq  Stack, %rsp     # Set up stack pointer
    rrmovq  %rsp,%rbp       # Set up base pointer
    irmovq  ele1,%rax
    pushq   %rax
    call    sum_list        # Execute main program
    halt                    # Terminate program


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

  # int sum_list(list_ptr ls)
    sum_list:   pushq   %rbp
        rrmovq  %rsp,%rbp
        xorq    %rax,%rax       # val = 0
        mrmovq  8(%rbp),%rdx    # edx = ls
        andq    %rdx,%rdx       # Set condition codes
        je      End
    Loop:       mrmovq  (%rdx),%rcx     # ecx = ls->val
        addq    %rcx,%rax       # val += ls->val
        mrmovq  4(%rdx),%rdx    # ls = ls->next ------ tried +8 insetead of 4 also
        andq    %rdx,%rdx       # Set condition codes
        jne     Loop
    End:        rrmovq  %rbp,%rsp
        popq    %rbp
        nop                     # makes sure stop in 31 steps
        ret

 # The stack starts here and grows to lower addresses
    .pos 0x100

スタック:

ピーター・コーデス

関数の引数が正しく取得されていないと思います。mrmovq 8(%rbp),%rdx関数の差出人アドレスをに入れます%rdx

それはたまたま数バイト前ですele1。これは、クラッシュすることなく表示される「シフトされた」値を作成しているオフセット負荷を説明しています。ただし、IDKは、その直後にクラッシュしないようにします。


ポインタ引数は、呼び出し元によってpush %rax。を使用してスタックに配置されますその後call、リターンアドレス(8バイト)をプッシュします。

関数内で、にコピーする前にさらに8バイトpush %rbpずつデクリメント%rspします%rbpしたがって、呼び出し元によってプッシュされたポインタ引数はにあり16(%rsp)、これも16(%rbp)です。

mrmovq  16(%rbp),%rdx    # rdx = ls

デバッグするときは、常に仮定をテストするようにしてください。難しい部分は、あなたがを想定しいるのか理解することです。なぜなら、それはあなたがあなたを噛む可能性のある問題としてさえ考えていなかったものだからです。(たとえば、この場合、関数argsを取得します。)


64ビットx86コードのように、関数引数をレジスタに渡す方が簡単です。たとえば、最初のarg in %rdi、2番目のargは%rsix86-64 SystemVの呼び出し規約で使用されているものです。ただし、32ビットx86の呼び出し規約のように、スタックに引数を渡すことが「想定されている」場合push、それぞれの幅が8バイトであることを忘れないでください。

OTOH、スタックの使用方法を理解し、スタックに対して呼び出し/プッシュ/ポップが何を行っているかを追跡することが重要です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

私のJavaクラスで何が起こっているのかを理解しようとしています

分類Dev

動的なTestNGXMLの作成。間違ったXMLを取得しています。私が間違っているところ

分類Dev

私はこのjsonを解析しようとしていますが、ここで何が間違っているのかわかりません

分類Dev

ソースコードからすべてのhrefを取得しようとしています。私は自分が間違っていることを理解していません

分類Dev

ポインタを理解しようとしている間、私は次の懸念を持っています

分類Dev

私はこれをforループで間違って書いていることを知っていますが、複数の文字を受け入れることができるように正しく書くにはどうすればよいですか?

分類Dev

これらの画像を整列させようとしているflexboxで何が間違っていますか?

分類Dev

LinuxをPCにインストールしようとして燃え尽きてしまった.....私は何が間違っているのですか?

分類Dev

やあみんなこのコードで私が間違っているのは何ですか。13195のすべての素因数を空のリストに追加しようとしていますが、空のリストが表示されます

分類Dev

このPython関数で何が起こっているのかを理解しようとしています

分類Dev

EventEmitterとuseStateを同時に使用しようとしています。私は何が間違っているのですか?

分類Dev

私のホバーが私のウェブサイトで機能していないという私が間違ったことを理解できないようです

分類Dev

コンソールアプリを介してPSR-4の自動読み込みを理解しようとしています。私は何が間違っているのですか?

分類Dev

シンプルなジャージの安らかなWebサービスHelloWorldを実行しようとしていますが、機能しません。誰かが私が間違っているところを確認できますか?

分類Dev

whileループを使用して、文字列がなくなるまで文字列から文字を削除しようとしています。私はここで何が間違っているのですか?

分類Dev

最長と最短の単語の長さを印刷しようとしていますが、どこが間違っているのかわかりません

分類Dev

画像の中央にテキストを配置しようとしています。ここで何が間違っているのかわかりません

分類Dev

私はこれらの一時変数が何を意味するのか理解しようとしています

分類Dev

どこが間違っているのですか?1桁を返す前に、数値が追加された回数を印刷しようとしています

分類Dev

作業単位の呼び出しでコントローラーをテストしようとして、私が間違っていることを誰かに見せてもらえますか?

分類Dev

このエラーを拾うために私が間違っていることはありますか?

分類Dev

おじいちゃんについて話している変数に、彼は年を取っていると言いたいのですが、それは彼が年をとっていないと言っています。私が間違っていることは何ですか?前もって感謝します

分類Dev

間違った型を使用していると言うこの型クラスのエラーを理解するにはどうすればよいですか?

分類Dev

私はここで何が悪いのかを理解しようとしています

分類Dev

descによるpgSQLの順序が正しく機能しない、または私がしたことは間違っていますか?

分類Dev

この再帰コードを理解しようとしていますが、行き詰まっています

分類Dev

現在までの日数を追加しようとしていますが、形式が間違っています

分類Dev

私は複利計算式でここで何か間違ったことをしていることを知っています

分類Dev

2つのnumpy配列をプロットしようとすると、何が間違っていますか?

Related 関連記事

  1. 1

    私のJavaクラスで何が起こっているのかを理解しようとしています

  2. 2

    動的なTestNGXMLの作成。間違ったXMLを取得しています。私が間違っているところ

  3. 3

    私はこのjsonを解析しようとしていますが、ここで何が間違っているのかわかりません

  4. 4

    ソースコードからすべてのhrefを取得しようとしています。私は自分が間違っていることを理解していません

  5. 5

    ポインタを理解しようとしている間、私は次の懸念を持っています

  6. 6

    私はこれをforループで間違って書いていることを知っていますが、複数の文字を受け入れることができるように正しく書くにはどうすればよいですか?

  7. 7

    これらの画像を整列させようとしているflexboxで何が間違っていますか?

  8. 8

    LinuxをPCにインストールしようとして燃え尽きてしまった.....私は何が間違っているのですか?

  9. 9

    やあみんなこのコードで私が間違っているのは何ですか。13195のすべての素因数を空のリストに追加しようとしていますが、空のリストが表示されます

  10. 10

    このPython関数で何が起こっているのかを理解しようとしています

  11. 11

    EventEmitterとuseStateを同時に使用しようとしています。私は何が間違っているのですか?

  12. 12

    私のホバーが私のウェブサイトで機能していないという私が間違ったことを理解できないようです

  13. 13

    コンソールアプリを介してPSR-4の自動読み込みを理解しようとしています。私は何が間違っているのですか?

  14. 14

    シンプルなジャージの安らかなWebサービスHelloWorldを実行しようとしていますが、機能しません。誰かが私が間違っているところを確認できますか?

  15. 15

    whileループを使用して、文字列がなくなるまで文字列から文字を削除しようとしています。私はここで何が間違っているのですか?

  16. 16

    最長と最短の単語の長さを印刷しようとしていますが、どこが間違っているのかわかりません

  17. 17

    画像の中央にテキストを配置しようとしています。ここで何が間違っているのかわかりません

  18. 18

    私はこれらの一時変数が何を意味するのか理解しようとしています

  19. 19

    どこが間違っているのですか?1桁を返す前に、数値が追加された回数を印刷しようとしています

  20. 20

    作業単位の呼び出しでコントローラーをテストしようとして、私が間違っていることを誰かに見せてもらえますか?

  21. 21

    このエラーを拾うために私が間違っていることはありますか?

  22. 22

    おじいちゃんについて話している変数に、彼は年を取っていると言いたいのですが、それは彼が年をとっていないと言っています。私が間違っていることは何ですか?前もって感謝します

  23. 23

    間違った型を使用していると言うこの型クラスのエラーを理解するにはどうすればよいですか?

  24. 24

    私はここで何が悪いのかを理解しようとしています

  25. 25

    descによるpgSQLの順序が正しく機能しない、または私がしたことは間違っていますか?

  26. 26

    この再帰コードを理解しようとしていますが、行き詰まっています

  27. 27

    現在までの日数を追加しようとしていますが、形式が間違っています

  28. 28

    私は複利計算式でここで何か間違ったことをしていることを知っています

  29. 29

    2つのnumpy配列をプロットしようとすると、何が間違っていますか?

ホットタグ

アーカイブ