Istruzioni 8 bit "apparenti"

di il
4 risposte

Istruzioni 8 bit "apparenti"

Iniziando a studiare l'Assembly in una dispensa noto la seguente istruzione:
OPCODEB 0x34768912 (ESI)
Si afferma che l'operando è a 16 bit e si trova nella doppia locazione il cui indirizzo viene ottenuto sommando, modulo 2^32, il numero naturale 0x34768912 con il contenuto del registro ESI moltiplicato per il fattore di scala uno.

Il registro è a 32 bit ed il codice operativo dell'istruzione è 8 bit (lettera 'B') per cui mi verrebbe da dire che c'e' un errore.
Però poi penso che si riferisca al contenuto della locazione di memoria 0x34768912 (fattore di scala 1) che è un valore che viene interpretato su 8 bit, è giusta la mia interpretazione?

4 Risposte

  • Re: Istruzioni 8 bit "apparenti"

    Io non ho capito molto il problema... è un assembler specifico di una CPU (penso x86/x64 a giudicare da ESI)?
    Hai il testo originale del quesito/esercizio?
  • Re: Istruzioni 8 bit "apparenti"

    oregon ha scritto:


    Io non ho capito molto il problema... è un assembler specifico di una CPU (penso x86/x64 a giudicare da ESI)?
    Si è un calcolatore didattico C86.32 a 32 bit che si ispira alla famiglia delle cpu Intel 32 bit.
    Hai il testo originale del quesito/esercizio?
    Non è un esercizio ma un punto dove si spiega l'indirizzamento con displacement e registro di modifica, dicendo che l'esempio prima indicato chiarisce come questa modalità di indirizzamento viene indicata a livello di linguaggio mnemonico.
    Fa anche questo esempio:
    OPCODEW 0x95F5B936 (,ESI, 2)
    L'operando è a 16 bit e si trova nella doppia locazione il cui indirizzo viene ottenuto sommando, modulo 2^32, il numero naturale 0x95F5B936 con il contenuto del registro ESI, moltiplicato per il fattore di scala 2.

    Questo mi torna.
    Ma vorrei esser sicuro di aver ben interpretato il primo esempio
  • Re: Istruzioni 8 bit "apparenti"

    Dire che abbiamo capito e' spararla grossa

    MA

    i concetto coinvolti sono BANALI:

    1) c''e' di mezzo un VETTORE V. Un vettore ha un indirizzo, dove e' allocato, una lunghezza N, anche se non serve in questo caso, ed al vettore si accede per INDICE i. Gli indici vanno da 0 a N-1. In qualunque linguaggio di programmazione scriveremmo:

    V i-mo elemento del vettore

    2) ma quale e' l'indirizzo dell'elementi i-mo del vettore? DIPENDE dalla dimensione di OGNI elemento del vettore (che DEVE essere CONOSCIUTA e LA STESSA).

    QUINDI se il vettore e' all'indirizzo 0x95F5_B936 e ogni elemento e' di 1 BYTE, l'indirizzo dell'i-mo elemento e':

    0x95F5_B936 + 1*i

    SE ogni elemento e' composto da DUE byte (una WORD), l'i-mo elemento si trova all'indirizzo

    0x95F5_B936 + 2*i

    SE ogni elemento e' composto da 123456 byte (una struttura dati arbitrariamente compless), l'i-mo elemento si trova all'indirizzo

    0x95F5_B936 + 123456*i

    PROBLEMA: l'indirizzo di memoria e' a 32 bit, QUINDI il massimo indirizzo possibile e'

    0xFFFFFFFF

    MA CHE SUCCEDE se a 0xFFFF_FFFF aggiungo 1? questo sarebbe uguale a 0x1_0000_0000

    MA questo numero e' composto da 32+1=33 bit, MA noi ne abbiamo SOLO 32, quindi che succede?

    BANALE viene TRONCATO a 32. E quindi cosa resta?

    0x00000000

    cioe' ZERO!!!
  • Re: Istruzioni 8 bit "apparenti"

    migliorabile ha scritto:


    MA questo numero e' composto da 32+1=33 bit, MA noi ne abbiamo SOLO 32, quindi che succede?

    BANALE viene TRONCATO a 32. E quindi cosa resta?

    0x00000000

    cioe' ZERO!!!
    Tutto quello che hai detto è molto chiaro, ho compreso il concetto di vettore ed il suo utilizzo nel caso di accesso ai suoi elementi in memoria ma
    ma ancora non capisco questo significato:
    Si afferma che l'operando è a 16 bit e si trova nella doppia locazione il cui indirizzo viene ottenuto sommando, modulo 2^32, il numero naturale 0x34768912 con il contenuto del registro ESI moltiplicato per il fattore di scala uno.


    la locazione di memoria supponiamo che sia appunto 0x34768912 e il registro di ESI contenga il valore decimale 1.
    Il codice operativo prende in considerazione un valore di 8 bit (ho un B finale nell'opcode) per cui dovrei prendere in considerazione il contenuto di 0x34768912 ma solo su 8 bit troncando l'eccedenza no ?
Devi accedere o registrarti per scrivere nel forum
4 risposte