linguaggio assembly

Pubblicità

rob25111

Nuovo Utente
Messaggi
39
Reazioni
0
Punteggio
26
ho una curiosità.
il linguaggio assembly è il linguaggio più vicino possibile al linguaggio macchina.
...ma puo essere comunque considerato un "linguaggio alto" in quanto non si scrive mica in 1-0 (binario)
la macchina deve comunque avere un compilatore giusto?
mettiamo che io ho un pc anni 80 e non ho internet per scaricare un compilatore..
come faccio a "programmarne uno?"
nel senso come si crea il compilatore di un linguaggio cosi basso?
 
ho una curiosità.
il linguaggio assembly è il linguaggio più vicino possibile al linguaggio macchina.
...ma puo essere comunque considerato un "linguaggio alto" in quanto non si scrive mica in 1-0 (binario)
la macchina deve comunque avere un compilatore giusto?
mettiamo che io ho un pc anni 80 e non ho internet per scaricare un compilatore..
come faccio a "programmarne uno?"
nel senso come si crea il compilatore di un linguaggio cosi basso?
Un compilatore, generalmente, trasforma il codice in assembly. Quello che servirebbe a te è un assembler, cioè un programma, concettualmente molto semplice, che trasforma i codici mnemonici dell'assembly nel microcodice corrispondente della CPU.
Per farlo devi avere la tabella dei codici delle istruzioni e una mappa di memoria del computer.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Un compilatore, generalmente, trasforma il codice in assembly. Quello che servirebbe a te è un assembler, cioè un programma, concettualmente molto semplice, che trasforma i codici mnemonici dell'assembly nel microcodice corrispondente della CPU.
Per farlo devi avere la tabella dei codici delle istruzioni e una mappa di memoria del computer.

Inviato dal mio Nexus 6P utilizzando Tapatalk
per codici delle istruzioni si intendono le ISA? se si le isa dove sono presenti "fisicamente"? vengono salvate in qualche registro fisico non volatile della cpu?
 
Se per ISA intendi Instruction Set Architecture, si è il microcodice interno della CPU, non è che viene salvato. devi avere un manuale di riferimento.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Se per ISA intendi Instruction Set Architecture, si è il microcodice interno della CPU, non è che viene salvato. devi avere un manuale di riferimento.

Inviato dal mio Nexus 6P utilizzando Tapatalk
sisi intendo le Instruction Set.. ma la loro "conversione" avviene grazie a registri interni della cpu credo (?) se si mi sa dire come si chiama il registro che contiene le ISA?
 
Non ti devi preoccupare di questo. Il codice binario del linguaggio macchina contiene i codici delle istruzioni ed i dati.. ciò che devi convertire non sono queste ma le istruzioni in linguaggio assembly nei relativi codici macchina.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
sisi intendo le Instruction Set.. ma la loro "conversione" avviene grazie a registri interni della cpu credo (?) se si mi sa dire come si chiama il registro che contiene le ISA?

In architetture CISC (come Intel) per altro non è nemmeno così semplice. Gli opcode sono molto, e i set anche complessi (sto pensando ad esempio ad AVX e SSE). Un elenco completo lo trovi sul manuale di Intel per sviluppatori; se non ricordo male è "Software Developer Manual 2".

In un mio progetto, uno dei componenti, fa l'operazione invesa; la prima sezione dell'articolo descrive i campi che compongono l'istruzione, che sarebbero poi quelli che dovresti generare tu.
Altri screen più sotto mostrano anche le codifiche interne: di fatto tu da uno mnemonico come ADD EAX, EBX, dovresti generare l'istruzione (in questo caso è composta da 2byte, opcode + mod_reg_rm).
Ti lascio il link (e ti confermo che è il secondo libro): https://forum.tomshw.it/threads/codice-metamorfo-modificare-un-file-eseguibile-exe.797605/

Oltretutto sempre in riferimento a Intel, ad un livello più basso, viene usato il micro-codice (che è pur sempre parte dell'instruction set architecture). Quindi qui si: il microcodice è contenuto in una ROM (per velocizzare l'accesso è presente anche della cache con le istruzioni più utilizzate/accedute).
Aggiornando l'OS talvolta vai anche ad aggiornare questo microcodice, per altro.


PS. tutto ciò è valido se parliamo di 32/64bit e in riferimento a Intel (e anche 16bit, come 8086, ma la cosa è più semplice in quel caso). Con altre architetture i concetto di base rimane il medesimo, ma dovresti dotarti del manuale di quella specifica architettura.
 
Ultima modifica da un moderatore:
Mah. Io cercavo di farla semplice, hai parlato di computer anni 80, io spero che tu non abbia intenzione di scrivere un assemblatore per x86! Da quanto avevo capito, mi riferivo a cose a 8 bit, tipo Z80 o MOS6502 o M6800.

Il fatto è che altrimenti la cosa si complica notevolmente e il numero di opcode inizia a diventare eccessivo. Un 8bit può essere alla portata di un neofita e può essere un'esperienza interessante..
Di quale computer anni 80 stiamo parlando??

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Nel primo topic anche io ho pensato alla stessa cosa, proseguendo non mi era però più chiaro se volesse solo "sapere come funziona" oppure realizzare proprio una conversione da asm -> linguaggio macchina (magari 8086 o altro ancora).
Per questo ho preso il giro alla larga (ma ho aggiunto il PS)...

Comunque le considerazioni sulle trasformazioni da asm -> codice macchina dovrebbero valere più o meno allo stesso modo; ma dovrà appunto dotarsi di un apposito manuale.

Non ci resta che attendere l'OP a questo punto. :)
 
Ah ragazzi, mi avete ricordato il mio primo assemblatore scritto in GW-Basic. All'epoca internet andava a scatti ( con scatto alla risposta!! ) e col 33k. I programmi si vendevano a peso d'oro. Dovevi arrangiarti. Il libro di Coffron e tanto olio dei gomiti.

La prima prova ( per capire se avevo capito ) la feci a mano, traducendo l'assembly in stringhe di 8 bit, che poi traducevo in decimale ed inserivo sotto forma di DATA, che poi scrivevo su file ( .com, erano i tempi del DOS ) trasformandoli con Chr$(). Bei tempi!

Comunque penso che la domanda dell'OP fosse generica. E gli consiglio l'assembly del 6502 ( può usare un emulatore Atari 2600 ) per divertirsi. Se parte da x86, abbandonerà l'informatica entro questa settimana.

Interessante l'ultima domanda però, quella sul compilatore ( che poi sarebbe assemblatore ). Se ho capito bene, vuole sapere come hanno creato il primo assembler senza aver a disposizione un assembler, compilatore o interprete di altro linguaggio.
 
Beh.. scrivendo direttamente il codice macchina e "traducendo" a mano. Con il vic20 facevo anch'io così... un bel quadernone a quadretti!

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
grazie mille a tutti per le risposte.
leggendo tutto non mi è chiarissima una cosa: (ho cercato di leggere qualcosa in rete ma mi è poco chiaro): a questo punto cosa sono gli opcode? possono essere considerati come delle istruzioni "intermedie" che vanno a richiamare le ISA vere e proprie? sono diciamo "dei traduttori" ?

scusate per le domande forse troppo da noob e vaghe ma sto cercando di crearmi ora un immagine mentale

rispondendo a @rctimelines e @DispatchCode :
senza un assembler a disposizione bisognerebbe scrivere tutto quindi in binario.. ma come fare? guardando direttamente all'architettura della cpu o in riferimento sempre alle ISA?
 
grazie mille a tutti per le risposte.
leggendo tutto non mi è chiarissima una cosa: (ho cercato di leggere qualcosa in rete ma mi è poco chiaro): a questo punto cosa sono gli opcode? possono essere considerati come delle istruzioni "intermedie" che vanno a richiamare le ISA vere e proprie? sono diciamo "dei traduttori" ?

scusate per le domande forse troppo da noob e vaghe ma sto cercando di crearmi ora un immagine mentale

rispondendo a @rctimelines e @DispatchCode :
senza un assembler a disposizione bisognerebbe scrivere tutto quindi in binario.. ma come fare? guardando direttamente all'architettura della cpu o in riferimento sempre alle ISA?

Gli opcode non sono una cosa intermedia, ma i codici numerici che individuano l'istruzione della CPU (ISA).

Scrivere in binario, significa in realtà inserire i valori nelle singole celle di memoria. In realtà non scrivi 1 e 0 ma, per praticità, inserisci valori esadecimali. In pratica fai manualmente ciò che farebbe il software "assemblatore".
Per farlo devi conoscere prima di tutto gli opcode (vedi sopra). Ma per sapere quali sono devi avere la documentazione tecnica della specifica CPU.
Vabbè, poi ci sono altre cosette da sapere in merito all'architettura della CPU (registri, indirizzamenti, gestione della memoria) e alle specifiche della macchina.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Ultima modifica:
cosa sono gli opcode?

La parte della stringa binaria che identifica l'istruzione. A cui vanno aggiunte altre componenti, che determinano il tipo di strutture su cui l'istruzione andrà ad operare, eventuali istruzioni ulteriori da accoppiare a quella corrente ( penso ai processori ARM ) ed altri elementi utili. Ma questo è chiarito nei manuali del processore.

richiamare le ISA vere e proprie?

Occhio che per ISA s'intende Instruction Set Architecture, cioè l'insieme di tutte le istruzioni che costituiscono il linguaggio macchina del processore. Perchè se non è ancora chiaro, il linguaggio macchina non è una cosa universale, ma cambia da famiglia a famiglia di processori e spesso anche all'interno della stessa famiglia ( con aggiunte o modifiche ).

Cioè l'ISA non è una cosa fisica, è un'etichetta che si dà all'insieme di tutte le istruzioni del linguaggio macchina. Ed è quella cosa che consente l'interoperabilità tra processori diverse. Pensa ad Intel e AMD. Dal punto di vista elettronico, i loro processori sono completamente diversi. Eppure implementano la stessa ISA, tranne per qualche sporadica e piccola differenza.

senza un assembler a disposizione bisognerebbe scrivere tutto quindi in binario.. ma come fare? guardando direttamente all'architettura della cpu o in riferimento sempre alle ISA?

Allora era questa la vera domanda, come immaginavo. Se non hai un sistema automatico, ovviamente fai a mano. Come scrivevo, se vai nei manuali Intel, troverai per ogni istruzione, il codice mnemonico assembly e le relative traduzioni in binario ( sono più di una perchè per ogni opcode ci sono varie rappresentazioni che esprimono le operazioni su vari tipi di operandi ).

Quindi puoi benissimo scrivere un programma in assembly e lo traduci a mano. Poi devi solo trovare il modo di scrivere quelle stringhe di bit su un file. Il tipo e la struttura di file dipendono dal contesto. Cioè, Linux capisce il formato eseguibile ELF e ovviamente il tuo eseguibile dovrà essere in questo formato. Windows capisce il PE. DOS capisce il formato EXE/MZ, oppure COM ( che è un binario puro ).

E poi c'è la possibilità, se si fa girare un programma senza sistema operativo, di usare un formato binario puro. Cioè prendi la tua codifica in linguaggio macchina e la scrivi così com'è sul file. Senza fronzoli, senza modifiche di alcun tipo.

Occhio che, come scrivevo nell'altro post, non è che 10101001 va scritto sul file così. Se aprendolo con un editor riesci a leggere tutti gli uno e gli zero, allora non hai fatto bene. Quella stringa va messa in una variabile, byte in quel caso perchè sono 8 bit. E il numero che rappresenta va scritto sul file. Non in formato ASCII!!! Cioè 169. Ma, leggendo con un editor, deve uscire questo simbolo ©

E' confusionario lo so. Ma è più semplice a farsi che a dirsi.
 
un ultima cosa poi non rompo più:
ho visto per esempio che gli opcode nell'architettura MIPS sono a 6bit..

6 5 5 5 5 6 bit
[ op | rs | rt | address/immediate] tipo I
[ op | target address ] tipo J
[ op | rs | rt | rd |shamt| funct] tipo R
cio vuol dire che a livello fisico ogni 6 bit ce qualche componente elettronico che "switcha" per proseguire e specificare rs,rt, address ecc.. ? o ciò avviene ancora a livello software e non tanto "elettronico" ?

p.s ce differenza tra isa e microcodice?queste possono essere considerte parte del firmware di una cpu giusto?
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top