2

x64アセンブリを学習しているときに、2つの整数を追加し、アセンブリを使用して整数を返すaddメソッドを作成しようとしています。x86で動作するコードがあり、x64に変換しようとしました

レジスタの名前をx64の名前に変更し、オブジェクトファイルをエラーなしで生成しましたが、C関数内で使用すると、常にsum=0になります。

引数の場所に問題があると思いますが、そのような問題に関する適切なドキュメントは見つかりませんでした。

section .text
    global addi
addi:
    push    rbp
    mov     rbp, rsp
    mov     rax,[rbp+12]
    mov     rdx,[rbp+8]
    add     rax, rdx
    pop     rbp
    ret
4

2 に答える 2

2

x64 ABIは、最初のいくつかの引数がスタックではなくレジスタに渡されることを義務付けています。

わかりやすい説明については、 x86-64のスタックフレームレイアウトを参照してください。

于 2013-03-02T21:11:47.277 に答える
2

x86-64にはamdによって定義された呼び出し変換があり、このプラットフォームのすべてのツールチェーンは次のようになります。

  • 最初の引数->rdi
  • 2番目->rsi
  • 3番目->rdx
  • 4番目->rcx
  • 5日->ラックス

したがって、次のようになります。

section .text
    global addi
addi:
    mov rax, rsi
    add rax, rdi
    ret
于 2013-03-03T02:26:17.367 に答える