C'è molta differenza tra il linguaggio Assembly X86 su Windows e Linux?

7

Sono un principiante assoluto all'Assemblea, e il mio obiettivo è quello di imparare quanto più posso fare con Assembly, che un giorno potrò raggiungere il livello di esperti (so che sono lontano, ma non si sa mai ). Il mio unico problema è questo: ho due libri che insegnano entrambi assembly, uno su Linux e l'altro su Windows. Sono Step by Step di Assembly of Step di Jeff Duntemann (quello di Linux) e Introduction to 80x86 Assembly Language and Computer Architecture (la versione di Windows). Se voglio ottenere il meglio dal montaggio, dovrei farlo su Linux e Windows? Inoltre, la sintassi è la stessa su Windows e Linux o mi insegnerò di nuovo quando imparerò sull'altro SO (che è la mia preoccupazione principale, voglio poter usare assembly su Windows e Linux).

    
posta Logan545 20.10.2013 - 13:30
fonte

4 risposte

7

Dipende da cosa vuoi scrivere.

Se tutto ciò che vuoi scrivere è una funzione specifica che verrà chiamata da un programma "driver" scritto in C, e se non hai bisogno di eseguire una chiamata di sistema, allora il compilatore C che usi è molto più importante di l'architettura, perché prescrive come devi esporre le tue funzioni.

Se invece sei interessato a scrivere applicazioni complete in assemblaggio e fare uso di chiamate di sistema - o scrivere driver di dispositivo - allora anche il sistema operativo è molto pertinente.

Quindi, in pratica, scegli quello per cui vuoi scrivere i programmi.

Nel manuale per gli sviluppatori di FreeBSD, c'è un capitolo dedicato alla programmazione degli assiemi. È breve e ben scritto e contiene esempi interessanti, che si concludono con un semplice script in CGI (!). Puoi leggerlo per avere un'idea:

link

P.S .: Assembly è una delle primissime lingue che ho imparato a metà degli anni Novanta. L'ho imparato su un sistema MS-DOS 6.22, usando l'assemblatore di shareware di Isaacson e l'elenco di interruzioni di Ralf Brown ... grazie a Virtual Box è probabile che tu riesca ad avere di nuovo quella sensazione! : -)

    
risposta data 20.10.2013 - 16:48
fonte
5

L'unica importante differenza tra la codifica in ASM su Win / Linux / OSX è la convenzione di chiamata . Non ce n'è uno più difficile da usare rispetto all'altro, sono solo diversi. È inoltre necessario fare attenzione al registro che deve essere conservato tra le chiamate.

WINDOWS: RCX, RDX, R8, R9

The Microsoft x64 calling convention is followed on Windows and pre-boot UEFI (for long mode on x86-64). It uses registers RCX, RDX, R8, R9 for the first four integer or pointer arguments (in that order), and XMM0, XMM1, XMM2, XMM3 are used for floating point arguments. Additional arguments are pushed onto the stack (right to left). Integer return values (similar to x86) are returned in RAX if 64 bits or less. Floating point return values are returned in XMM0. Parameters less than 64 bits long are not zero extended; the high bits are not zeroed.

LINUX / OSX: RDI, RSI, RDX, RCX, R8, R9

The calling convention of the System V AMD64 ABI is followed on Solaris, Linux, FreeBSD, OS X, and other UNIX-like or POSIX-compliant operating systems. The first six integer or pointer arguments are passed in registers RDI, RSI, RDX, RCX, R8, and R9, while XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6 and XMM7 are used for floating point arguments. For system calls, R10 is used instead of RCX. As in the Microsoft x64 calling convention, additional arguments are passed on the stack and the return value is stored in RAX.

STRUMENTI: Troverete praticamente gli stessi strumenti su Windows e amp; Linux.

La mia opinione personale:

  • FASM & NASM sono fantastici:)
  • Uso spesso Purebasic, è una versione commerciale di tipo closed-source (economica, con una versione limitata gratuita) che produce codice FASM piacevole leggibile / commentato e accetta Assemblatore in linea. Non produce mai il codice digitato, ma è uno strumento che mi piace. Ovviamente puoi farne a meno e scrivere semplicemente ASM puro da zero.
  • NON BOTHER con 386, passa a ASM x86_64. Molte più istruzioni (attenzione: le istruzioni MMX / SSE sono strane, (molto?) Difficili da usare) e molto più registri (fantastico!)!
  • Opzione Hardcore: installa BOCHS o QEMU (io uso QEMU) e inizio a scrivere ASM senza sistema operativo. Inizia con l'MBR, quindi con il bootloader Stage 1, Stage2, un kernel e così via ... Sentiti libero di dare un'occhiata al mio MBR / Bootloader molto documentato (funzionale ma incompleto) link se sei in vena:)
risposta data 26.11.2015 - 10:02
fonte
4

L'assemblaggio è diverso tra piattaforme e anche tra diversi assemblatori sulla stessa piattaforma. Le chiamate di sistema e gli interrupt saranno diversi, e c'è la questione della sintassi AT & T vs. Intel. Tuttavia, la differenza tra assembly Windows e Linux è molto più piccola della differenza tra l'assembly x86 e PIC, ad esempio. Se ne conosci uno, è banale imparare l'altro.

È molto più utile poter leggere assemblare piuttosto che scriverlo, e si migliora leggendolo provando diverse architetture. Non limitarti. Nel mio lavoro, l'assembly x86 non si presenta mai, ma occasionalmente eseguo il debug nell'assemblaggio di PowerPC.

    
risposta data 20.10.2013 - 16:56
fonte
0

Linux tende a preferire il codice assembly x86 di stile AT & T per qualche motivo. È abbastanza orribile. Per lo sviluppo di Windows probabilmente utilizzi Visual Studio che supporta la sintassi di stile Intel molto più leggibile. Il codice di esempio di Intel utilizza questo stile anche in generale. Si noti che non è possibile scrivere assembly inline per applicazioni a 64 bit con Visual Studio, funziona solo per le app a 32 bit. Si suppone che le applicazioni a 64 bit usino invece intrinseche. Non credo che gcc abbia questa restrizione.

    
risposta data 20.10.2013 - 13:52
fonte

Leggi altre domande sui tag