Differenze tra set di istruzioni (architettura) e linguaggio macchina?

2

L'organizzazione del computer strutturato di Tanenbaum dice:

Every computer has an ISA (Instruction Set Architecture), which is a set of registers, instructions, and other features visible to its low-level programmers.

This ISA is commonly referred to as machine language, although the term is not entirely accurate.

A program at this level of abstraction is a long list of binary numbers, one per instruction, telling which instructions to execute and what their operands are.

Le mie domande sono:

  1. ISA include istruzioni e registri. Per quanto ne so, un'istruzione consiste in un opcode (cioè un'operazione) e un operando (s). Un codice operativo è troppo piccolo per essere membro dell'ISA?

  2. Per quanto ne so, un linguaggio di programmazione è un insieme di alcuni programmi. Quindi un linguaggio macchina è anche un insieme di alcuni programmi?

  3. Qual è la differenza tra ISA e linguaggio macchina? È che un linguaggio macchina è un insieme di programmi, mentre un ISA non è un insieme di programmi ma un insieme di più unità di base (ad esempio registri, istruzioni) che insieme formano programmi?

posta Tim 04.03.2015 - 00:15
fonte

3 risposte

5

Sembra che tu abbia preso in prestito un po 'di vocabolario dall'informatica teorica (riguardo le parole "set" e "lingua"), e ho cercato di usarlo per interpretare la descrizione da manuale dei sistemi di computer di livello inferiore (CPU e hardware). / p>

La parola "set" come in "instruction set architecture" si riferisce all'insieme di opcode predefiniti che sono validi per la specifica architettura della CPU.

Ad esempio, questa pagina (elenchi di istruzioni x86, su Wikipedia) elenca gli opcode che ci si possono aspettare su varie generazioni di l'architettura IA32. Ogni opcode è un membro di questo "set di istruzioni".

Quando l'autore dice "... non è del tutto preciso", suppongo che si riferisca al fatto che nessuna grammatica ci si potrebbe aspettare da una sequenza di istruzioni della macchina.

Per chiarire ulteriormente, la CPU legge i byte di istruzioni e, se è un'istruzione di macchina valida, verrà eseguita. In caso contrario, verrà generata un'eccezione hardware di "istruzione non valida", che interromperà l'esecuzione corrente e il controllo del trasferimento su un altro programma (probabilmente appartenente al sistema operativo).

Tuttavia, non esiste una grammatica che definisca quale sia una sequenza valida di istruzioni della macchina. In un certo senso, non esiste una struttura o una gerarchia che ci si possa aspettare che tutte le sequenze valide delle istruzioni della macchina siano conformi.

Le istruzioni della macchina trovate nella maggior parte dei programmi software compilati sono formate con una certa struttura; tuttavia, non tutti lo fanno. La CPU eseguirà felicemente una "sequenza spaghetti di istruzioni macchina", eseguendo salti incondizionati o condizionali mentre incontra ognuno; e fino a poco tempo fa, è possibile che una sequenza di istruzioni macchina modificasse parti di se stessa.

Alcune istruzioni della CPU sono progettate per facilitare la programmazione strutturata:

  • il registro dello stack e le istruzioni push / pop
  • il registro dell'indirizzo di ritorno e le istruzioni di call / return per l'esecuzione di subroutine (note anche come procedure o funzioni)
  • istruzioni loop (incrementa o decrementa un registro, controlla un limite, quindi salta a un indirizzo specificato se il limite non è stato raggiunto)
  • istruzioni di copia delle stringhe (un'istruzione di ciclo che copia ripetutamente i byte da un intervallo di indirizzi a un altro intervallo di indirizzi)

Anche se alcune di queste istruzioni sembrano formare coppie (push vs pop, call vs return), in realtà una sequenza valida di istruzioni della macchina non deve necessariamente corrispondere a queste coppie. Cioè, si potrebbe scrivere il successivo valore del contatore del programma nell'indirizzo di memoria indicato dal registro stack (simulando una spinta), e quindi eseguire un salto all'inizio di una subroutine (che, insieme alla spinta precedente, diventa una simulazione di una chiamata di subroutine). La subroutine potrebbe usare le normali istruzioni di ritorno.

    
risposta data 04.03.2015 - 05:04
fonte
1

Si noti che Tanenbaum parla di ciò che viene esposto ai programmatori di basso livello, non di ciò che accade a livello dei cicli di esecuzione della CPU. Giù a quel livello ci sono varie micro operazioni coinvolte nella previsione delle branche, prefetch, pipelining, ecc.

Le istruzioni sul codice macchina vengono scomposte in blocchi più piccoli dopo il punto in cui i programmatori hanno accesso diretto.

    
risposta data 04.03.2015 - 05:07
fonte
1

Il punto è che lo stesso set di istruzioni può essere usato in modo diverso.

E in pratica, per motivi di efficienza, potrebbe essere molto importante. Un compilatore ottimizzante può (e, ad esempio, GCC con -O2 -mtune=native ) produrre diversi codice macchina per lo stesso ISA, a seconda del processore di destinazione. Quindi il codice ottimizzato per un processore Intel non è lo stesso del codice ottimizzato per un processore AMD, anche se utilizza lo stesso ISA. Il codice macchina ottimizzato per uno non sarà il codice più veloce sull'altro.

    
risposta data 04.03.2015 - 06:58
fonte

Leggi altre domande sui tag