linguaggio assembly

rob25111

Nuovo Utente
38
0
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?
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 

rob25111

Nuovo Utente
38
0
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?
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 
  • Mi piace
Reazioni: _Achille

rob25111

Nuovo Utente
38
0
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?
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 
  • Mi piace
Reazioni: rob25111

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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:
  • Mi piace
Reazioni: fabio93

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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. :)
 

pabloski

Utente Èlite
2,868
916
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.
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 

rob25111

Nuovo Utente
38
0
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?
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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:

pabloski

Utente Èlite
2,868
916
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.
 

rob25111

Nuovo Utente
38
0
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:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili