Se le istruzioni nell'assembly "generico"?

5

Sto leggendo un libro relativamente "amichevole" e semplice sui compilatori chiamati "Costruiamo un compilatore" (in origine una serie di articoli).

Il compilatore scritto nel libro genera istruzioni in alcuni assembly (68000 assembly).

Dato che non conosco questo linguaggio assembly, ho deciso che il mio compilatore genererà anche istruzioni di 'assembly' (ad esempio MOVE #4,D0 ha lo stesso significato: "metti il numero 4 nel registro D0 "), solo loro verrà eseguito da un programma che scriverò, anziché da un computer fisico. Una sorta di "macchina virtuale".

Finora penso che questo non dovrebbe essere un problema, ma ho una domanda su questo:

Che cos'è un modo "generico" per gestire le dichiarazioni di if in assembly? Ad esempio, quale sarebbe la traduzione di assemblaggio più semplice per questo codice:

if(a>b){
    // do stuff
}
    
posta Aviv Cohn 28.07.2014 - 00:19
fonte

2 risposte

10

Nell'assemblaggio comune, viene eseguito da vari salti condizionali, ad es.

cmp %eax, 1; 
je label

Che traducono approssimativamente in "confronta registro eax e costante 1; se uguale, passa all'etichetta." In caso contrario, viene eseguita l'istruzione successiva.

Il risultato di cmp è memorizzato nel registro di stato . È un registro contenente i risultati di operazioni aritmetiche come lo zero flag ZF o il flag di segno SF .

cmp è implementato come un sotto astratto. Se entrambi gli operandi erano uguali, viene impostato ZF . Se il flag del segno è impostato, significa che il risultato dell'operazione è negativo, quindi quel secondo operando è più grande del primo.

Le varie istruzioni di salto leggono il segno e le zero flag ed eseguono il salto in base al loro valore.

AFAIK esiste un solo registro di stato.

    
risposta data 28.07.2014 - 00:34
fonte
5

Consente di tornare a un giorno precedente, quando le cose erano semplici.

Consente di tornare ai giorni del MOS 6502 che alimentava Atari, Apple II e molti altri sistemi da alla fine degli anni '70. È ancora possibile trovarlo nei sistemi embedded e apparentemente è ancora prodotto in volumi di centinaia di milioni (mentre questa è vecchia tecnologia, non è obsoleto). Comprendendo come funzionava questo sistema, diventa più facile capire come funzionano i sistemi più moderni e complessi.

Il 6502 aveva solo pochi registri:

  • Contatore programmi
  • Puntatore dello stack
  • Accumulatore (questo è l''importante')
  • X e Y 'indice' registri
  • Stato del processore (questa è l'altra "importante" in questa situazione)
    • C Carry flag
    • Z Zero flag (imposta se l'ultima operazione ha avuto un risultato di 0 )
    • D Modalità decimale
    • I Abilita / disabilita interput
    • B Break
    • V Overflow
    • S Segno (l'insieme del risultato di un'operazione è negativo - a volte è indicato come N come negativo)

Quando hai fatto un CMP #$44 questo confrontava l'Accumulatore con il valore 0x44. In tal modo, imposterà le flag ZCS in modo appropriato. C è impostato se l'Accumulatore è maggiore o uguale al valore e Z è impostato se i due sono uguali. Questo non era molto più che fare A - M dove M è il valore (letto dalla memoria, o un valore strong), imposta i flag e butta via il risultato (confronta con SBC che memorizzerebbe il risultato nell'accumulatore) .

A questo punto, hai impostato il registro di stato, ma devi fare qualcosa con esso. C'erano due istruzioni per questo. BEQ (diramazione se EQual) e BNE (diramazione se non uguale). Queste due istruzioni testerebbero ogni Z del registro di stato - BNE si diramerebbe se Z era 0, BEQ si diramerebbe se Z era 1. Mentre CMP fa imposta più flag, BEQ e BNE non ti interessano, solo Z .

E davvero, questo è il modo in cui i condizionali funzionano quando sei giù a quel livello. C'è un registro di stato che gira da qualche parte molte volte. Questo registro non esiste quando entrate nei processori pipeline, superscalari e speculativi. Questi tendono ad avere istruzioni di diramazione più esplicite o usano registri arbitrari per il risultato dello stato piuttosto che un registro dedicato (vedi il set di istruzioni MIPS e guarda bgt , blt , beqz e simili).

Per inciso, se stai curiosando su macchine virtuali e assemblaggi, approfondisci un po ' Core War e la macchina virtuale MARS.

    
risposta data 28.07.2014 - 01:43
fonte

Leggi altre domande sui tag