15

私は Mac でのアセンブリに慣れようとしてきましたが、私が知る限り、ドキュメントは非常にまばらであり、このテーマに関するほとんどの本は Windows または Linux 用です。LinuxからMacへの変換はかなり簡単にできると思っていましたが、これは(linux)

.file   "simple.c"
.text
.globl simple
.type   simple, @function
simple:
      pushl   %ebp
      movl    %esp, %ebp
      movl    8(%ebp), %edx
      movl    12(%ebp), %eax
      addl    (%edx), %eax
      movl    %eax, (%edx)
      popl    %ebp
      ret
.size   simple, .-simple
.ident  "GCC: (Ubuntu 4.3.2-1ubuntu11) 4.3.2"
.section        .note.GNU-stack,"",@progbits

これとはかなり違うようです(mac)

.section    __TEXT,__text,regular,pure_instructions
.globl  _simple
.align  4, 0x90
_simple:                                ## @simple
    .cfi_startproc
## BB#0:
pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    addl    (%rdi), %esi
    movl    %esi, (%rdi)
    movl    %esi, %eax
    popq    %rbp
    ret
    .cfi_endproc


.subsections_via_symbols

「通常の」(より適切な言葉がないため)命令やレジスタなどpushq %rbpは心配しないでください。しかし、「奇妙な」もの.cfi_startprocLtmp2:、機械命令の真ん中にあるものは意味がありません。

これらが何であり、何を意味するのかを知るためにどこに行けばよいかわかりません。何ヶ月もの間、初心者向けの良いリソースを見つけようとしてきたので、私は髪を引っ張ろうとしています. 助言がありますか?

4

2 に答える 2

0

明らかに、Linux コードは 32 ビット Linux コードです。64 ビット Linux は 32 ビット コードと 64 ビット コードの両方を実行できることに注意してください。

Mac コードは間違いなく 64 ビット コードです。

これが主な違いです。

「.cfi_xxx」行は、Mac 固有のファイル形式に使用される情報のみです。

于 2013-11-01T08:26:28.510 に答える