Domanda

sto attraversando qualche esempio di codice assembly per la modalità reale a 16 bit.

ho incontrato le righe:

    mov    bx, cs
    mov    ds, bx
    mov    si, OFFSET value1
    pop    es
    mov    di, OFFSET value2

Che cos'è questo facendo? Che cosa significa aver 'OFFSET' lì che fare?

È stato utile?

Soluzione

Come alcune delle altre risposte dicono, la parola chiave offset si riferisce allo spostamento dal segmento in cui è definito. Si noti, tuttavia, che i segmenti possono sovrapporsi e l'offset in un segmento possono essere diverse in un altro segmento. Per esempio, si supponga di avere il seguente segmento in modalità reale

data SEGMENT USE16 ;# at segment 0200h, linear address 2000h

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS

L'assemblatore vede che foo è 0100h compensato dalla base di data SEGMENT, così ovunque vede offset foo inserisce l'0100h valore, indipendentemente dal valore della DS al momento.

Ad esempio, se cambiamo DS a qualcosa di diverso alla base del segmento data l'assemblatore sta assumendo:

mov ax, 200h            ; in some assemblers you can use @data for the seg base
mov ds, ax

mov bx, offset foo          ; bx = 0100h
mov byte ptr [bx], 10       ; foo = 10


mov ax, 300h
mov ds, ax

mov bx, offset foo          ; bx = 0100h
mov byte ptr [bx], 10       ; bar = 10, not foo, because DS doesn't match what we told the assembler

Nel secondo esempio DS è 0300h, quindi la base del segmento puntato da DS è 03000h. Ciò significa che i punti ds:[offset foo] al 03000h + 0100h indirizzo che è lo stesso come 02000h + 01100h, che indica bar.

Altri suggerimenti

E 'solo significa che l'indirizzo di quel simbolo. E 'un po' come l'operatore & in C, se si ha familiarità con questo.

offset significa che registro si sarà uguale all'offset della variabile valore1 (non al suo valore effettivo). Offset è l'indirizzo a partire dall'inizio del segmento di memoria in cui è memorizzato il variabile. L'offset è di solito rispetto al ds segmento (nel tuo caso ds e cs registri siano rivolti allo stesso segmento).

Da di MASM Programmer Guide 6.1 (Microsoft Macro Assembler)

  

Il OFFSET Operatore

     

Una costante di indirizzo è un particolare tipo di operando immediato che si compone di un valore di offset o segmento. L'operatore OFFSET restituisce l'offset di una locazione di memoria, come illustrato di seguito:

    mov     bx, OFFSET var  ; Load offset address
     

Per informazioni sulle differenze tra MASM 5.1 comportamento e MASM 6.1 comportamenti relativi a OFFSET, vedere l'Appendice A.

     

Poiché i dati in diversi moduli possono appartenere ad un singolo segmento, l'assembler non può sapere per ogni modulo i veri offset all'interno di un segmento. Così, l'offset per var, anche se un valore immediato, non è determinato fino al momento di collegamento.

Se si legge con attenzione, il valore finale è determinato dopo aver "link" il codice oggetto per creare una DLL / EXE. Prima di collegamento, tutto quello che hai è un valore immediato che rappresenta l'offset dall'indirizzo base del segmento.

In modalità 16bit x86, spazio di indirizzi non è piatta; invece, gli indirizzi sono composti da un offset e un "segmento". I punti di "segmento" ad uno spazio 64K, offset è all'interno di quello spazio.

http://en.wikipedia.org/wiki/Memory_segmentation

Offset è fondamentalmente la distanza dal punto di segmento (detto anche punto di riferimento). per esempio indirizzo di segmento è 0000 e l'indirizzo di offset o logica è 0100 quindi l'indirizzo fisico può essere conteggiato sommando le due coppie. Indirizzo fisico = 0000 + 0100 = 0100 Significa che la nostra posizione è necessaria sull'indirizzo del 0100. Allo stesso modo se l'indirizzo di segmento è 1DDD e offset è 0100, allora: indirizzo fisico è: 1DDD + 0100 = 1EDD

Significa che la nostra destinazione è 1EDD.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top