2009-05-29 25 views
6

Vedo codice come:Perché l'istruzione mov utilizza direttamente ax anziché due registri di segmenti?

mov ax, cs 
mov ds, ax 
mov es, ax 

Perché non è possibile comprimere solo questo:

mov ds, cs 
mov es, cs 

è il primo modo più veloce sin dal suo utilizzo registro accumulatore? Ma ciò non sembrerebbe intuitivo dal momento che cs e ds sono segmenti registri. O c'è qualche restrizione di cui non sono a conoscenza?

Sto usando nasso comunque.

risposta

9

Non è possibile spostare il registro dei segmenti sul registro dei segmenti: non sono disponibili istruzioni.

+0

Quando ho. prima leggi la tua risposta non l'ho fatto vi assicuro, ma nella documentazione NASM, abbastanza sicuro, nessuna istruzione reg_dseg, reg_cseg. – samoz

+0

Questo non è il motivo, è il risultato. –

+1

Cosa? Non capisco cosa intendi per Neil. – samoz

1

C'è solo tanto spazio in un processore per il microcodice per tutte le sue istruzioni. Quindi, un'istruzione generale è spesso preferita a più di uno scopo speciale per le operazioni raramente utilizzate. Inoltre, per alcuni processori il numero di istruzioni è assolutamente limitato dall'architettura - ad esempio, il processore 8080 originale era limitato a 256 istruzioni poiché tutti dovevano avere il codice operativo codificato in un singolo byte.

+0

+1 per spiegare il motivo alla base del motivo – dss539

1

Non è il linguaggio assembly in realtà ma il linguaggio macchina sottostante che impedisce queste operazioni.

Mentre l'assemblaggio è composto da parole o mnemonici facili da leggere, in realtà rappresentano direttamente gli 1 e gli 0 del codice macchina. Sulle CPU x86 ogni istruzione è tipicamente costituita da una sequenza di byte con byte singoli o anche bit all'interno dei byte che hanno un significato. Alcuni bit rappresentano l'istruzione, altri rappresentano lo addressing mode. Nel registro che indirizza le modalità come i vostri esempi alcuni bit rappresentano quali registri specifici devono essere utilizzati come origine e destinazione dell'istruzione mov.

Ora la famiglia di processori x86 risale agli anni '70 quando l'architettura della CPU era più semplice. In quei giorni il concetto di era di fondamentale importanza: ax è l'accumulatore x86 a 16 bit. Tutti i calcoli sono stati accumulati o "accumulati" in questo registro, quindi erano disponibili per tutte le istruzioni. Altri registri di uso generale avevano un intervallo di utilizzo più ristretto.

Poiché le istruzioni erano basate sui byte che si desideravano come pochi byte per rappresentare un'istruzione il più possibile per mantenere rapidamente la decodifica dell'istruzione. Per mantenere il maggior numero di istruzioni il più breve possibile, l'uso dell'accumulatore è centrale.

Su CPU più moderne come i registri Motorola 680x0 più generici hanno più capacità che in precedenza erano il dominio dell'accumulatore. Sulle CPU RISC tutti i registri sono flessibili come gli accumulatori. Ho sentito che nella modalità a 64 bit il set di istruzioni x86/amd64 corrente è ora molto meno limitato.

+0

Non fino a x86_64 che i registri possono essere utilizzati in questo modo. Poiché la maggior parte dei registri x86 a 32 bit può agire più o meno come registro generale –

+0

Sembra che non sapessi che la domanda riguardava i registri di segmento e l'accumulatore. Non sono mai entrato nell'assemblaggio x86 a causa del modo orribile in cui la memoria funzionava, ma poi con i registri di segmento e roba del genere. Credo che sia molto più bello lavorare ora che c'è un bel modello di memoria piatta. – hippietrail

+0

Anche se l'assembly x86 non funziona molto. Ma ci sono ancora istruzioni di segmento su x86. Lo spazio degli indirizzi di x86 non è piatto –

1

Guardare la colonna "MOV Move" colonna "Istruzioni" Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015.

L'unico 16 bit MOV registri è codificato in:

mov r/m16, Sreg 

E "3.1.1.3 Istruzioni Colonna nella Tabella riassuntiva" Opcode spiega:

  • r/m16 - A operando registro di parole di uso generale o memoria utilizzata per le istruzioni cui operando size attributo è 16 bit I registri parola di uso generale sono. :.. AX, CX, DX, BX, SP, BP, sI, dI
  • Sreg - Un registro segmento

così mov ds, cs non è codificabile, come non esiste una versione mov Sreg, Sreg