Mettiamo che voglia creare un linguaggio di programmazione partendo dal codice assembly del processore.
Come si fa il passaggio ?
Come si costruisce la semantica e eventuali compilatori linker ?
compilatori e linker sono mediamente programmati utilizzando sempre un basso linguaggio di programmazione ? (Come assembly)
Qualche testo che potrebbe schiarirmi questo tipo di dubbi?Possibilmente qualche cosa di soft che faccia capire in panoramica generale per poi approfondire solo dopo architetture precise (!!?)!
Non ho capito che cosa intendi in realtà. I linguaggi di programmazione hanno come target l'architettura, e quindi producono del codice assembly in base al target.
Compilatori e linker sono scritti con linguaggio di "alto livello" (come dice theprogrammer99, C/C++ sono tra questi). Dovresti creare un parser, occuparti dell'analisi semantica etc etc. e solo in ultimo step produrre codice macchina eseguibile sul target.
Il libro più famoso è quello del draghetto, "Compilers: Principles, Techniques, and Tools", ma è un testo avanzato sull'argomento. Io conosco anche "Language implementation patterns".
Ma in generale puoi guardare ad esempio
Lexical Analysis o sempre Wiki, per farti un'idea
Compiler - Three stage compiler structure.
Dall'oggetto del topic invece si comprende la cosa contraria, ovvero che dall'assembly vuoi fare il procedimento inverso (un pò come fa Hex Rays).
Se il caso è questo dipende dal codice macchina che stai analizzando, e quindi dipende dall'architettura (o dalla famiglia). In questo caso dipende, se è un codice macchina ARM è relativamente più semplice in quanto la lunghezza delle istruzioni è sempre la medesima; con Intel (x86/x64) il discorso cambia molto, in quanto l'effettiva lunghezza la riconosci solo decodificando alcuni byte o addirittura bits.
Sto facendo una cosa analoga in un progetto che ormai rilascerò... a giorni (?). Non ho ancora introdotto la conversione in mnemonici (assembly) nè tantomeno in uno pseudo linguaggio di alto livello (e me ne guardo bene, per ora...), ma riconosco le lunghezze ed i campi che compongono le istruzioni.
Un estratto preso dal readme, giusto per fare un esempio concreto.
Data questa istruzione:
MOV DWORD PTR SS:[LOCAL.38],0
La decodifico come:
Codice:
RAW bytes (hex): C7 85 68 FF FF FF 00 00 00 00
Instr. length: 10
Print instruction fields:
Located Prefixes 0:
OP: 0xC7
mod_reg_rm: 0x85
disp (4): 0xFFFFFF68
Iimm: 0x0
Data quest'altra, ad esempio:
MOVUPS DQWORD PTR SS:[ECX+EBP-94],XMM0
Viene decodificata come:
Codice:
RAW bytes (hex): 0F 11 84 0D 6C FF FF FF
Instr. length: 8
Print instruction fields:
Located Prefixes 1:
0xF
OP: 0x11
mod_reg_rm: 0x84
SIB byte: 0xD
disp (4): 0xFFFFFF6C
"raw bytes" sono i singoli bytes che compongono l'istruzione.