0

私は本Professional Assembly Language on Mac OS X Monttain Lionに従おうとしています。Google で次の URL に Mac OS X 用のポートを見つけました: Assembly on MacOS X

Vim でファイルを作成し、GAS でコンパイルしました: as -g -arch i386 -o cpuid.o cpuid.s gcc を使用してコードをリンクしました: gcc -m32 -arch i386 -o cpuid cpuid.o

結果の実行可能 cpuid はエラーなしで実行されますが、最後に gdb でデバッグしようとすると、プログラムが正常に終了したのではなく、プログラムがコード 044 で終了したと表示されます。

正しく終了させる方法を見つけようとして、C で hello world の例を作成し、次のアセンブリ コードを生成しました: gcc -Wall -03 -m32 -fno-PIC hello_pf.c -S -o hello_pf.s 結果アセンブリコードは次のとおりです。


.section        __TEXT,__text,regular,pure_instructions
        .globl  _main
        .align  4, 0x90
_main:  
        pushl   %ebp 
        movl    %esp, %ebp
        subl    $24, %esp
        leal    L_.str, %eax
        movl    %eax, (%esp)
        call    _puts
        movl    $0, -8(%ebp)
        movl    -8(%ebp), %eax
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        addl    $24, %esp
        popl    %ebp
        ret

        .section        __TEXT,__cstring,cstring_literals
L_.str: 
        .asciz   "Hello world!\n"


.subsections_via_symbols

  • 誰かがこの問題に関して助けを提供できますか?
  • IA-32 mac ox s アセンブリを使用して、上記のリンクから cpuid の作業バージョンを作成するにはどうすればよいですか?
  • Mac OS X でのスタック アラインの問題の詳細な説明はどこで確認できますか? Apple のサイトを読んだことがありますが、初心者にとってはあまり役に立ちません。
  • 上記サンプルコードのcall _puts以降の命令は何ですか?
  • アセンブリからのlibc関数の呼び出しは実際にはどのように機能しますか? このトピックに関する詳細な記事はありますか?

ありがとうございました!

4

1 に答える 1

0

まず、呼び出し規約でのレジスタの使用法を理解する必要があります。そのための適切な場所は次のとおりです。

http://www.agner.org/optimize/calling_conventions.pdf

Mac OS X 64 ビットでは、「int」を返す関数 (main() など) の戻り値が %rax にあることがわかります。32 ビットの実行可能ファイルを使用したいようです。その場合、戻り値は %eax になります。レジスタをゼロにする便利な方法の 1 つは、それ自体と XOR することです。そのため、これをルーチンの最後に追加する必要があります。

xorl  %eax,%eax

これにより %eax がゼロに設定され、それが終了コードになります。

于 2012-08-04T16:37:42.693 に答える