Come da te osservato, nel linguaggio assembly, mentre sono standard gli mnemonici corrispondenti agli opcode del processore (LDA, STA, RTS, ...), possono non esserlo le direttive per l'assembler (byte, origine, ecc.), così come le convenzioni per identificare le etichette (label) e quant'altro. Perciò, in linea di massima, occorre sapere a priori per quale assembler sia stato scritto un particolare blocco di codice assembly; o comunque essere in grado di riconoscere il "dialetto" con il quale abbiamo a che fare.
Il problema non si pone, a meno della necessità di rappresentare porzioni di memoria (per tabelle dati, sprite, musica, ecc.), per un "disassemblato", che è sostanzialmente codice macchina presentato in forma di mnemonici, ma con tutte le etichette e gli indirizzi già risolti.
Per intenderci, questa è una porzione di disassemblato
C000 LDA $0400
C003 CMP #$20
C005 BEQ $C020
...
C020 ...altra istruzione...
ecc.
mentre la seguente è una porzione di assembly
*= $C000
LDA $0400
CMP #$20
BEQ etichetta
...
etichetta:
...altre istruzioni...
ecc.
la quale, nel "dialetto" di un assembler differente, potrà comparire in forma diversa, ad esempio
ORG $C000
LDA $0400
CMP #$20
BEQ etichetta
...
LBL etichetta
...altre istruzioni...
ecc.
In conclusione, come hai già intuito, occorre leggere il contesto e cercare il riferimento all'assembler utilizzato. Nelle riviste dell'epoca compariva spesso un disassemblato commentato, piuttosto che un vero programma in assembly. Alternativamente, i programmi in assembly potevano essere stati scritti sempre per un assembler "di riferimento" a cui la stessa pubblicazione faceva sempre capo.