0

私は再学習して、初心者向けの非常に基本的なアセンブリ コードを作成しています。x86_64 で Ubuntu を実行していますが、従うチュートリアルは 32 ビット x86 で行われました。

アセンブルとリンクは正常に行われますが、実行時に segfault が発生する短いアセンブリ プログラムを以下に示します。私のエラーは、32ビットと64ビットの命令の間の行とメモリ使用量に関する混乱/混乱であると確信しています。たとえば、すべてのレジスタ (収集したものからの 32 ビット レジスタの x86_64 バージョン) でmovq命令を使用していますが、おそらくそれは誤りです。r**

誰かがここで問題を説明できれば本当にありがたいです。原因をよりよく理解できれば、将来この種の問題を回避するのに本当に役立つと思います.

 .data
Bash:
    .asciz "/bin/bash"
Null1:
    .int 0
AddrToBash:
    .int 0
Null2:
    .int 0

.text
.globl _start

_start:
movq $Bash, AddrToBash
movq $59, %rax
movq $Bash, %rbx
movq $AddrToBash, %rcx
movq $Null2, %rdx
syscall 

Exit:
movq $60, %rbx
movq $1, %rax
syscall

前もって感謝します!

4

1 に答える 1

3
  1. syscall の引数は , %rsi,%rdiにあり%rdxます。x86-64 での UNIX および Linux システム コールの呼び出し規約は何ですか を参照してください。
  2. .int 0は短すぎ.quad 0ます。3 つの場所すべてに配置する必要があります。
于 2013-01-26T22:55:38.380 に答える