2013-11-01 10 views
12

Ho cercato di familiarizzare con assembly su mac, e da quello che posso dire, la documentazione è davvero scarsa, e la maggior parte dei libri sull'argomento sono per windows o linux. Ho pensato di essere in grado di tradurre da Linux a Mac abbastanza facilmente, ma questo (linux)Qual è la differenza tra assembly su mac e assembly su 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 

sembra abbastanza diverso da questo (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 

Il "normale" (per mancanza di una parola migliore) istruzioni e registri come pushq %rbp non ti preoccupare. Ma quelli "bizzarri" come .cfi_startproc e Ltmp2: che si trovano nel bel mezzo delle istruzioni della macchina non hanno alcun senso.

Non ho idea di dove andare per scoprire cosa sono e cosa significano. Sto per strapparmi i capelli mentre cerco di trovare una buona risorsa per i principianti per mesi. Eventuali suggerimenti?

+0

Il formato e il significato delle direttive dipenderanno dal particolare sapore dell'assembler che si sta utilizzando. L'interfaccia con il sistema operativo sarà similmente aromatizzata. –

+0

@MikeW Cosa intendi per "sapore"? Dove posso trovare ulteriori informazioni a riguardo? Sto usando GCC quindi presumo sia l'assemblatore GNU. –

+0

Le differenze sono principalmente specifiche del formato eseguibile di destinazione o sono informazioni sui simboli di debug. – zneak

risposta

12

Per iniziare, si sta confrontando l'assembly x86 a 32 bit con x86-64 a 64 bit. Mentre l'OS X Mach-O supporta 32 bit IA32, sospetto che tu voglia il x86-64 SysV ABI. (Per fortuna, il sito x86-64.org sembra essere di nuovo attivo). Il modello Mach-O x86-64 è essenzialmente una variante dell'ABI ELF/SysV, quindi le differenze sono relativamente minori per il codice spazio utente, anche con diversi assemblatori.

I .cfi direttive sono DWARF direttive di debug che non strettamente necessari per il montaggio - sono utilizzati per le informazioni frame di chiamata, ecc Ecco alcuni esempi: minime

ELF x64-64 assembler:

.text 
    .p2align 4 

    .globl my_function 
    .type my_function,@function 

my_function: 
    ... 
.L__some_address: 

    .size my_function,[.-my_function] 

Mach-O x86-64 assembler:

.text 
    .p2align 4 

    .globl _my_function 

_my_function: 
    ... 
L__some_address: 

corto di scrivere un tutorial ASM, le principali differenze betwe it gli assemblatori sono: trattini di sottolineatura per i nomi delle funzioni di Mach-O, .L rispetto a L per le etichette (destinazioni). L'assemblatore con OS X comprende la direttiva ".p2align". .align 4, 0x90 essenzialmente fa la stessa cosa.

Non tutte le direttive nel codice generato dal compilatore sono essenziali affinché l'assemblatore generi un codice oggetto valido. Loro sono necessari per generare il frame dello stack (debug) e i dati di gestione delle eccezioni. Fare riferimento ai collegamenti per ulteriori informazioni.

+0

GRAZIE! Ero consapevole delle differenze tra 64 e 32, ma nonostante la semplice risposta fosse, saresti sorpreso di quanto fosse difficile ottenere una risposta così diretta sulle direttive. È bene sapere che non influenzano immediatamente l'assemblaggio. C'è un modo per scoprire esattamente cosa significano? –

1

Ovviamente il codice Linux è codice Linux a 32 bit. Nota che Linux a 64 bit può eseguire sia il codice a 32 che a 64 bit!

Il codice Mac è sicuramente codice a 64 bit.

Questa è la differenza principale.

Le righe ".cfi_xxx" sono solo informazioni utilizzate per il formato di file specifico per Mac.