2013-11-01 26 views
12

Tôi đã cố gắng làm quen với việc lắp ráp trên máy Mac, và từ những gì tôi có thể nói, tài liệu thực sự thưa thớt, và hầu hết các cuốn sách về chủ đề này là dành cho windows hoặc linux. Tôi nghĩ rằng tôi sẽ có thể dịch từ Linux để mac khá dễ dàng, tuy nhiên điều này (linux)Sự khác biệt giữa lắp ráp trên mac và lắp ráp trên linux là gì?

.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 

có vẻ khá khác nhau từ này (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 

Các "bình thường" (vì thiếu một từ tốt hơn) hướng dẫn và đăng ký như pushq %rbp đừng lo lắng cho tôi. Nhưng những thứ "kỳ lạ" như .cfi_startprocLtmp2: là những hình ảnh nhỏ gọn ở giữa các hướng dẫn của máy không có ý nghĩa gì.

Tôi không biết phải đi đâu để tìm hiểu xem chúng là gì và ý nghĩa của chúng. Tôi chuẩn bị kéo tóc ra vì tôi đã cố gắng tìm một nguồn tài nguyên tốt cho người mới bắt đầu trong nhiều tháng. Bất kỳ đề xuất?

+0

Định dạng và ý nghĩa của chỉ thị sẽ phụ thuộc vào hương vị cụ thể của bộ lắp ráp bạn đang sử dụng. Giao diện với hệ điều hành sẽ có hương vị tương tự. –

+0

@MikeW Bạn có ý nghĩa gì với "hương vị"? Tôi có thể tìm thêm thông tin về điều này ở đâu? Tôi đang sử dụng GCC vì vậy tôi giả sử nó là người lắp ráp GNU. –

+0

Sự khác biệt chủ yếu là cụ thể đối với định dạng thực thi đích hoặc là thông tin biểu tượng gỡ lỗi. – zneak

Trả lời

12

Để bắt đầu, bạn so sánh 32-bit x86 lắp ráp với 64-bit x86-64. Trong khi OS X Mach-O ABI hỗ trợ IA32 32 bit, tôi nghi ngờ bạn muốn x86-64 SysV ABI. (Rất may, trang web x86-64.org dường như lại hoạt động trở lại). Mô hình Mach-O x86-64 về bản chất là một biến thể của ELF/SysV ABI, do đó, sự khác biệt là tương đối nhỏ đối với mã không gian người dùng, ngay cả với các trình lắp ráp khác nhau.

Các .cfi chỉ là DWARF chỉ thị gỡ lỗi mà bạn không nghiêm chỉnh cần để lắp ráp - chúng được sử dụng để biết thông tin khung cuộc gọi, vv Đây là một số ví dụ nhỏ:

ELF x64-64 lắp ráp:

.text 
    .p2align 4 

    .globl my_function 
    .type my_function,@function 

my_function: 
    ... 
.L__some_address: 

    .size my_function,[.-my_function] 

Mach-O x86-64 lắp ráp:

.text 
    .p2align 4 

    .globl _my_function 

_my_function: 
    ... 
L__some_address: 

ngắn viết một hướng dẫn asm, những khác biệt chính betwe vi các bộ lắp ráp là: các dấu gạch dưới hàng đầu cho các tên hàm Mach-O, .LL cho nhãn (đích). Bộ lắp ráp với OS X hiểu chỉ thị '.p2align'. .align 4, 0x90 về cơ bản cũng giống như vậy.

Không phải tất cả các chỉ thị trong mã do trình biên dịch tạo ra đều rất cần thiết cho trình lắp ráp để tạo mã đối tượng hợp lệ. Yêu cầu để tạo khung ngăn xếp (gỡ lỗi) và dữ liệu xử lý ngoại lệ. Tham khảo các liên kết để biết thêm thông tin.

+0

CẢM ƠN BẠN! Tôi đã nhận thức được sự khác biệt giữa 64 và 32, nhưng mặc dù câu trả lời đơn giản như thế nào, bạn sẽ ngạc nhiên về việc khó có được câu trả lời thẳng thắn như thế nào về các chỉ thị. Tốt của nó để biết rằng họ không ngay lập tức ảnh hưởng đến lắp ráp. Có cách nào tôi có thể tìm hiểu chính xác ý của chúng? –

1

Rõ ràng mã Linux là mã Linux 32 bit. Lưu ý rằng Linux 64 bit có thể chạy cả mã 32 và 64 bit!

Mã Mac chắc chắn là mã 64 bit.

Đây là sự khác biệt chính.

Dòng ".cfi_xxx" chỉ là thông tin được sử dụng cho định dạng tệp cụ thể của Mac.

Các vấn đề liên quan