Assembly, facciamoun po' di chiaezza

Stato
Discussione chiusa ad ulteriori risposte.

fraesem

Utente Silver
1 Ottobre 2008
4
1
0
59
Da pochi giorni ho cominciato ad interessarmi e a muovere i primi passi con l'assembly.
Devo dire che sono rimasto un po' spiazzato a capire come girarmi per il fatto che non vi sia uno standard come per il linguaggio C,C++,PYTHON ecc.
E non mi riferisco al fatto che ogni famiglia di processori ne abbia uno proprio (anzi questo è ovvio, dato che interagisce a livello hardware che sarà vviamente differente da tipo a tipo) mi riferisco piuttosto a ben altre cose.
Ad esempio programmando per l' 8088 il linguaggio cambia già solo se si utilizza un differente assemblatore (nasm,tasm,masm); e poi ancora, c'è la sintassi intel, la sintassi AT&T (vedo molto usata da BlackLight e che da quel che ho capito utilizzata da linux).
Infine un'altra domanda magari un po' banale: modalità reale o protetta?
sinceramente se i sistemi di oggi utilizzano tutti la modalità protetta ha ancora senso imparare l'altra?? ritenete che siano basi che sono assolutamente necessarie da acquisire?

insomma io mi sono informato abbastanza, ma non ho ancora trovato qualcuno o qulcosa che mi chiarisca bene bene le idee. Qualcuno può schiarirmi le idee?

Se non chiedo troppo vorrei anche il titolo di un libro di assembly che ritenete "tra i migliori"

grazie a tutti :)
 
La protected mode è implementata a livello hardware a partire dal 286 in poi, a basso livello si riduce al far partire la CPU in real mode per retrocompatibilità e poi settare il PE bit sul registro CR0 per poi saltare alla parte di codice associata al protected mode

Codice:
mov eax, cr0
or eax, 1
mov cr0, eax

jmp cs:@pm

La protected mode consente di fare roba foga (per la prima metà degli anni '80) come gestire la memoria virtuale, introdurre un sistema di privilegi per l'accesso all'hardware numerati da 0 a 3 (i drivers dei dispositivi girano in ring 0, le applicazioni in ring 3), il supporto per il multitasking e il supporto per la segmentazione della memoria. Ma tutte queste novità sono introdotte a un livello più basso dell'Assembly, a livello hardware, e dal tuo codice Assembly non vedi la differenza fra una CPU che ti fa girare l'applicazione in real o protected mode.

Per il fatto che non esiste uno standard non si può neanche dire che sia vero. Ovvio, la sintassi CISC di una macchina Intel sarà completamente diversa da quella RISC usata da una macchina SPARC, o da una sintassi per una macchina completamente CISC come un VAX, dato che i registri sono diversi, il modo di indirizzare la memoria è diverso e l'instruction set è diverso. Ma se rimani in ambito Intel gli opcode quelli sono e quelli rimangono. Quello che cambia è il "flavour" della sintassi, ad esempio la sintassi Intel standard, per dire, di NASM non prevede suffissi e prefissi per operandi e registri mentre quella AT&T, per chiarezza, vuole che si distinguano i registri dai valori scalari usando come prefissi rispettivamente % e $, e permette di usare i suffissi per gli operandi per specificare se si vuole operare su byte, word o long word, e mentre la sintassi Intel standard è del tipo [operando dst, src] quella AT&T è del tipo [operando src,dst], ma tutto qui. Questo codice in sintassi Intel (NASM, TASM o MASM)

Codice:
mov   eax,4
push   eax
pop    ebx
or     ebx,1

diventerebbe in sintassi AT&T (GAS, GCC)

Codice:
movl    $4,%eax
push    %eax
popl     %ebx
orl     $1,%ebx

ma come vedi il passaggio è quasi immediato una volta che conosci le differenze fra le due sintassi, e il codice a livello logico è lo stesso. È solo una questione di gusti.
 
se vuoi un (a mio avviso) buon libro introduttorio all'asm x86 sintassi at&t in ambiente linux, ti consiglio "programming from the ground up"
 
@Blacklight: Grazie del chiarimento !!

@Bronsa: Ho scaricato il lbro consigliato, a prima vista proprio ben fatto, grazie ;) . Sapresti consigliarmene anche uno avanzato per il "dopo"?
 
grazie Dragunov ora sono riuscito a scaricarlo!!
mooolto interessante, tra l'altro tratta anche parecchi argomenti interessanti. Grazie davvero della segnalazione ;)
 
se ti interessa asm sotto windows, indiscutibilmente usa masm e sintassi Intel.
Su linux, non me la sento di darti un consiglio.
Come preferenza personale preferisco tantissimo la sintassi Intel in quanto è piu' pulita, mentre la AT&T è piena di % e $ inutili.
Inoltre, sempre a mio personale parere, è meglio stare vicini ad Intel... "che detta un po' le regole".
Inoltre se ti attrae il reversing (in windows), troverai esclusivamente materiale con sintassi intel.

se ti interessa tempo fa iniziai a scrivere una guida per chi inizia da zero con l'asm...
http://www.infernet.ws/showthread.php?tid=12245
putroppo il tempo non mi ha ancora permesso di continuarla, ma è un inizio :)
 
Beh i prefissi e i suffissi nella sintassi AT&T non sono poi tanto inutili, consentono di disambiguare completamente i tipi di dati che si vogliono maneggiare (per dire, in AT&T posso chiamare una variabile nel codice edx, dato che $edx sarà distinto dal registro, che è %edx, mentre in sintassi Intel classica non si può fare). Inoltre con i suffissi per gli operandi si può specificare esplicitamente se si vuole che una certa scrittura o la lettura operi con word, short word o byte, cosa che è difficile fare con la sintassi Intel classica. Per il resto, al di là di questa maggiore precisione semantica offerta dall'AT&T, è solo una questione di gusti. Anche se la maggior parte del materiale che si trova in giro è pensato per sintassi Intel fare il passaggio alla sintassi AT&T è immediato, basta scrivere bene i vari suffissi e prefissi, usare () invece di [] e passare dalla convenzione <dst,src> a <src,dst>. È solo questione di gusti e abitudini.
 
si e' solo questione di gusti dopotutto.
personalmente ritengo i suffissi inutili per due motivi:
1- le variabili sono talmente poche che è da masochista usare una variabile con il nome di registro,
e' un po' come voler usare in vb una variabile e chiamarla Integer/String pure in C voler usare una variabile chiamandola int
2- ritengo che il voler usare il nome di una variabile come il nome di un registro incrementa il rischio di errori e il disordine mentale, sinceramente lo ritengo un pregio e non un limite :)
in ogni caso concordo che è solo questione di gusti ed abitudini.
 
Stato
Discussione chiusa ad ulteriori risposte.