2015-03-09 34 views
5

Sto prendendo una lezione in linguaggio assembly x86 e sta iniziando a muoversi piuttosto velocemente. C'è una cosa che il libro continua a fare senza menzionare come funziona, e cioè usando gli operatori equ e = quando si definiscono i dati.assembly x86 equ =

Quindi sembra che equ sia usato per definire le costanti, ma è = la stessa cosa? Se avessi avuto un po 'di codice:

.data 
    count = 100   ; Is this a constant? Of what data type is this? 
    array WORD count DUP(?) 
    x_param EQU [EBP + 8] ; Is this a constant? 

Sto chiedendo perché fino ad ora abbiamo definito i dati dichiarando che è il tipo, ma come funziona quando non c'è nessun tipo dichiarato (come count = 100)

I Sono stati googlando e cercando forum su questi operatori negli ultimi giorni (Spring break), e non riesco a inventarmi nulla, quindi immagino che dovrei chiedermelo.

EDIT Sto usando l'assembler x86 MASM

+1

Hai dimenticato di menzionare quale assemblatore usi. Si prega di aggiungere anche un tag. Inoltre, non utilizzare google o forum, ma prima consulta il manuale ufficiale del tuo assemblatore. – Jester

+0

Vedere il manuale su [EQU] (https://msdn.microsoft.com/en-us/library/xkfsh225.aspx) e [=] (https://msdn.microsoft.com/en-us/library/ s3te6td9.aspx). TL; DR: 'EQU' può definire un testo numerico o riassegnabile costante,' = 'numerica riassegnabile. – Jester

+0

OK, quindi se ho dichiarato a = 1 o b equ 1, sarebbero entrambi tipi di dati a 32 bit (DWORD)? – Backwardsman

risposta

6

In primo luogo, la risposta immediata alla tua domanda ...

Equ Imposta il numero in pietra.

= Imposta il numero finché non lo si modifica in seguito.

Attenzione !!! La definizione di "più tardi" può confondere le luci viventi di te; in particolare con più file sorgente.

Ecco un trucco utile che è possibile utilizzare con queste due direttive per definire una serie di numeri quando ...

  • Volete nomi che rappresentano un valore unico (cioè, matematicamente "unico", come in, si vuole garantire che nessuno di loro sono gli stessi)
  • in realtà non importa quello che sono
  • si può decidere di aggiungere o eliminare questi valori come il vostro sviluppo progredisce
  • non lo sai sapere (quando inizi) esattamente quanti di questi si vorrà

    The_Counter    =    0 
    The_Counter    =    The_Counter + 1 
    
    
    Fred     =    The_Counter 
    The_Counter    =    The_Counter + 1 
    
    Barney     =    The_Counter 
    The_Counter    =    The_Counter + 1 
    
    Dino     =    The_Counter 
    The_Counter    =    The_Counter + 1 
    
    Arnold     =    The_Counter 
    The_Counter    =    The_Counter + 1 
    
    Mr_Slate    =    The_Counter 
    The_Counter    =    The_Counter + 1 
    

Ora, come si può vedere, Fred, Barney, Dino, Arnold, Mr_Slate potrebbero cambiare i loro valori con questo schema, e che potrebbe essere una cosa negativa; quindi, se vuoi assicurarti che Fred et.al. non avere cambiato da qualcun altro (o voi stessi, per errore) in un'altra parte del file di origine, quindi è possibile combinare la = e la Equ nello schema di cui sopra come questo ...

The_Counter    =    0 
    The_Counter    =    The_Counter + 1 


    Fred     Equ    The_Counter 
    The_Counter    =    The_Counter + 1 

    Barney     Equ    The_Counter 
    The_Counter    =    The_Counter + 1 

    Dino     Equ    The_Counter 
    The_Counter    =    The_Counter + 1 

    Arnold     Equ    The_Counter 
    The_Counter    =    The_Counter + 1 

    Mr_Slate    Equ    The_Counter 
    The_Counter    =    The_Counter + 1 

In questo caso, saranno ancora tutti diversi l'uno dall'altro, ma i loro valori effettivi non saranno candidati al cambiamento.

Anche se questo esempio utilizza i personaggi di Flintstone per il nome, può essere facilmente modificato per qualcosa di più utile, come ...

  • assegnazione di più gestori di interrupt e la loro priorità. È possibile spostare la posizione di due linee in quel codice sorgente e sperimentare con un sistema che consente di osservare le differenze quando un gestore di interruzioni riceve la priorità su un'altra e quindi accenderlo.
  • Modificare i valori che si scelgono in una tabella di ricerca
  • Assegnare un nome costante che tutti in uno sviluppo di gruppo possono utilizzare (come un'etichetta di testo, si spera che sia ovvio nel suo nome) senza mai doversi preoccupare esattamente di cosa quel valore intero specifico è

... e circa 47 altri buoni motivi che non riesco a pensare in questo momento.

Oh, solo un suggerimento; se si desidera utilizzare questo tipo di schema, trovo estremamente vantaggioso inserire queste direttive Equ e = nel proprio includendo il file; generalmente chiamato SomeFile.Equ o qualsiasi altra cosa. Personalmente ho scoperto che, separando questo tipo di direttive assembler e cose simili dalle istruzioni del linguaggio macchina reale, scoprirai che il tuo codice è molto più leggibile, oltre che più manutenibile; molto altro tempo. (Solo il mio suggerimento.)

Buona domanda, e una che mi ha dato settimane di smarrimento me stesso.