Domanda teorica indirizzo MOV

di il
8 risposte

Domanda teorica indirizzo MOV

Ciao a tutti,
continuando gli studi di assembly mi sono imbattuto in un'altra questione.

Se ho i seguenti registri espressi in esadecimale:
CP=181E, DS=180E, SS=1826, AX=4C77, BX=A3F9, BP=B939
l'istruzione MOV AX,[BX] a che indirizzo legge dalla memoria?

Non capisco proprio da dove partire. So che quello è un indirizzamento diretto ma come faccio a dedurre l'indirizzo? Devo far qualche somma? Se si, di cosa? E soprattutto perché?

Grazie in anticipo a chiunque voglia aiutarmi

8 Risposte

  • Re: Domanda teorica indirizzo MOV

    Su quale manuale stai studiando il linguaggio Assembly?
    L'indirizzamento esemplificato non è diretto, ma register indexed. Il registro di segmento associato per default a BX è DS. E un manuale degno di tale definizione dovrebbe spiegare nel modo più ampio come comporre un indirizzo di memoria assoluto partendo da segmento e offset...
  • Re: Domanda teorica indirizzo MOV

    M.A.W. 1968 ha scritto:


    Su quale manuale stai studiando il linguaggio Assembly?
    L'indirizzamento esemplificato non è diretto, ma register indexed. Il registro di segmento associato per default a BX è DS. E un manuale degno di tale definizione dovrebbe spiegare nel modo più ampio come comporre un indirizzo di memoria assoluto partendo da segmento e offset...
    Sto studiando la teoria dei calcolatori da un libro specifico e le istruzioni/nomenclatura/altro di assembly dalle (penose, come avrai notato) slide del prof. Quel che non trovo cerco di trovarlo su internet ma su questa parte mi sono proprio bloccato.

    Sarebbe troppo chiederti di spiegarmi brevemente come procedere?
  • Re: Domanda teorica indirizzo MOV

    La segmentazione è un orrendo kludge inventato in fretta e furia dai progettisti Intel a fine anni Settanta, durante il parto dei core 8088 e 8086 senza riflettere sulle possibili conseguenze.

    In linea generale, avendo segmento e offset, si procede come segue:
    1) Si moltiplica per sedici il valore del segmento, con uno shift logico a sinistra di quattro posizioni (una cifra esadecimale);
    2) Si somma il valore dell'offset, ottenendo un indirizzo assoluto di memoria a 20 bit (cinque cifre esadecimali).

    Esempio: DS=0812h, BX=0009h, indirizzo assoluto 08129h.
  • Re: Domanda teorica indirizzo MOV

    M.A.W. 1968 ha scritto:


    La segmentazione è un orrendo kludge inventato in fretta e furia dai progettisti Intel a fine anni Settanta, durante il parto dei core 8088 e 8086 senza riflettere sulle possibili conseguenze.

    In linea generale, avendo segmento e offset, si procede come segue:
    1) Si moltiplica per sedici il valore del segmento, con uno shift logico a sinistra di quattro posizioni (una cifra esadecimale);
    2) Si somma il valore dell'offset, ottenendo un indirizzo assoluto di memoria a 20 bit (cinque cifre esadecimali).

    Esempio: DS=0812h, BX=0009h, indirizzo assoluto 08129h.
    Ok inizio a "capire" qualcosa, ma mi sono venuti altri dubbi:
    1) In questo caso il valore del segmento quindi è DS? Non è BX? (scusa le domande banali ma preferisco esser sicuro visto che sto apprendendo da poco)

    2) Ogni registro di segmento è "legato" ad un registro generale? Cioè:
    CS registro di segmento di AX
    DS registro di segmento di BX
    ES di CX e SS di DX ?

    3) se avessi avuto invece MOV AX,[BP] quale sarebbe stato il valore del segmento e il suo offset?


    Grazie ancora per la pazienza
  • Re: Domanda teorica indirizzo MOV

    I registri di segmento su un 8088/8086 sono CS, SS, DS, ES.
    Il primo punta al segmento di codice, il secondo è riservato allo stack (vedi anche i registri SP e BP). DS è il segmento dati general purpose accoppiato per default a tutti i registri AX, BX, CX, DX, SI, DI, mentre ES (Extra Segment) è usato come segmento ausiliario.

    Ricapitolando, per le istruzioni di indirizzamento register-indexed di tipo MOV <dest>, [<src>] il registro <src> può appartenere solamente all'insieme di BX, DI, SI (accoppiati per default con DS) oppure BP (accoppiato per default con SS), salvo esplicita specificazione di un altro registro di segmento.
  • Re: Domanda teorica indirizzo MOV

    Hai delle gravi lacune sul funzionamento dell'indirizzamento nei processori x86.

    Se avessi studiato attentamente i metodi di indirizzamento indiretti, sapresti che si basano su un offset (da sommare eventualmente all'offset di una variabile) che può essere memorizzato solo in determinati registri, e in particolare:
    - BX, SI e DI nel caso di offset all'interno del DS;
    - BP nel caso di offset all'interno dello SS;

    Questo è il comportamento di default, che può essere modificando anteponendo l'operatore REGISTRO_DI_SEGMENTO: all'operando indirizzato.

    Inoltre, quando, per lo stesso operando, sommi gli offset contenuti in due registri (non mi ricordo come si chiama quel metodo), non possono essere entrambi registri base (BX e BP) o indice (SI e DI), ma devi usare un registro base + uno indice.
  • Re: Domanda teorica indirizzo MOV

    Repetita juvant: due post con quasi le medesime informazioni, sovrappostisi nel giro di pochi minuti...

    Per memorizzare facilmente i 17 modi di indirizzamento indiretto x86 esiste un banale schema.
    
         | [BX] | [SI]
    base |      |
         | [BP] | [DI]
    
    Un indirizzo valido si ottiene solamente scegliendo da uno a tre elementi in totale, con l'obbligo di selezionarne esattamente zero oppure uno per ciascuna colonna. Ad esempio, base[BP] oppure base[BX][SI] sono indirizzi validi (la sintassi specifica può ammettere variazioni secondo le idiosincrasie dell'assembler utilizzato, ma poco importa), mentre [BP][CX] non lo è.

    Non posso che ribadire il consiglio già implicito: butta via le slide e prendi uno o due testi sull'Assembly. Preferibilmente scelti nella prima sezione di questa bibliografia ragionata (comunque chiedi qui prima di acquistare un qualsiasi titolo). Ti serviranno anche in futuro.
  • Re: Domanda teorica indirizzo MOV

    Okk penso di aver capito. In ogni caso approfondirò meglio l'argomento perché credo mi "manchi" ancora qualcosa su questa parte:)

    Grazie ad entrambi!
Devi accedere o registrarti per scrivere nel forum
8 risposte