Se si pensa "PC == Windows", l'aggiunta di assembler a un programma in C non danneggia molto. Se entri nel mondo Unix, avrai molte CPU diverse: PPC in PS3 o XBox, vecchi Mac e molti server potenti. Per molti piccoli dispositivi, avrai ARM. I dispositivi integrati (che rappresentano la maggior parte delle CPU installate oggi) usano solitamente la propria CPU personalizzata con un set di istruzioni speciali.
Così mentre molti PC oggi saranno in grado di eseguire il codice Intel, ciò rappresenta solo una piccola parte di tutte le CPU disponibili.
Detto questo, il codice x86 non è sempre lo stesso. Esistono due motivi principali per il codice assembly: è necessario accedere a funzioni speciali (come i registri di interrupt) o si desidera ottimizzare il codice. Nel primo caso, il codice è abbastanza portatile. Nel secondo caso, ogni CPU è leggermente diversa. Alcuni di loro hanno SSE. Ma SSE è stato presto sostituito con SSE2 che è stato sostituito con SSE3 e SSE4. AMD ha il proprio marchio. Presto, ci sarà AVX. A livello di opcode, ognuno di questi ha un timing leggermente diverso sulle varie versioni di CPU.
Per peggiorare le cose, alcuni codici operativi hanno bug corretti in specifici passaggi di una CPU. Inoltre, alcuni opcode sono molto più veloci su determinate versioni di CPU rispetto ad altre.
Successivamente, sarà necessario interfacciare questo codice di assieme con la parte C. Questo di solito significa che devi risolvere i problemi con ABI.
Così puoi vedere che questo può diventare arbitrariamente complesso.
fonte
2009-09-18 07:49:14
+1, anche se suppongo che chiamare convenzioni e strutture dati non sia importante a meno che il tuo programma non interagisca con altri processi. Per quanto riguarda il layout della memoria - cosa succede se hai collegato il tuo programma con la libreria C standard della piattaforma di destinazione, e hai usato 'malloc()' etc? –
@Carson: anche le convenzioni di chiamata per le funzioni sono importanti, poiché probabilmente si vorrebbe poter richiamare una funzione scritta in C dall'assemblaggio misto e viceversa. – unwind
sì, buon punto. –