Pregunta

Voy a través de algún ejemplo de código de montaje de modo real de 16 bits.

Me he encontrado con las líneas:

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

¿qué está haciendo esto? ¿Qué significa tener 'compensar' no hacer?

¿Fue útil?

Solución

Como algunas de las otras respuestas decir, la palabra clave offset se refiere al desplazamiento desde el segmento en el que se define. Nótese, sin embargo, que los segmentos pueden solaparse y el desplazamiento en un segmento pueden ser diferentes en otro segmento. Por ejemplo, suponga que tiene el segmento siguiente en modo real

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

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS

El ensamblador ve que está en foo 0100h desplazamiento desde la base de data SEGMENT, así que donde quiera que ve offset foo se pondrá el 0100h valor, independientemente del valor de DS en el momento.

Por ejemplo, si cambiamos DS a algo distinto de la base del segmento data el ensamblador es suponiendo:

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

En el segundo ejemplo DS es 0300h, por lo que la base del segmento apuntado por DS es 03000h. Esto significa que los puntos de ds:[offset foo] a la 03000h + 0100h dirección que es la misma que 02000h + 01100h, que apunta a bar.

Otros consejos

Sólo significa la dirección de ese símbolo. Es un poco como un operador & C, si está familiarizado con eso.

offset significa que si registro será igual a la desviación de la variable valor1 (no a su valor real). Offset es la dirección desde el comienzo del segmento de memoria donde se almacena la variable. El desplazamiento es por lo general en relación con ds segmento (En su caso ds y cs registros están apuntando al mismo segmento).

Desde Guía del programador de MASM 6.1 (Microsoft Macro Assembler)

  

La OFFSET Operador

     

Una constante de dirección es un tipo especial de operando inmediato, que consiste en un valor de desplazamiento o segmento. El operador OFFSET devuelve el desplazamiento de una posición de memoria, como se muestra aquí:

    mov     bx, OFFSET var  ; Load offset address
     

Para obtener información sobre las diferencias entre el comportamiento MASM 5.1 y 6.1 MASM comportamiento relacionado para compensar, véase el Apéndice A.

     

Dado que los datos en diferentes módulos pueden pertenecer a un solo segmento, el ensamblador puede no saber para cada módulo de los verdaderos desplazamientos dentro de un segmento. Por lo tanto, el desplazamiento de var, aunque un valor inmediato, no está determinado hasta el momento del enlace.

Si se lee con cuidado, el valor final se determina después de "enlace" su código objeto para crear una DLL / EXE. Antes de vincular, todo lo que tienes es un valor inmediato que representa el desplazamiento desde la dirección base del segmento.

En el modo de 16 bits x86, espacio de direcciones no es plana; en cambio, las direcciones se componen de un desplazamiento y un "segmento". El "segmento" apunta a un espacio de 64 K, de desplazamiento es dentro de ese espacio.

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

Offset es básicamente la distancia desde el punto de segmento (también llamado punto de referencia). por ejemplo dirección de segmento es 0000 y la dirección de desplazamiento o lógico es 0100 entonces la dirección física puede ser contado mediante la adición de los dos pares. Dirección física = 0000 + 0100 = 0100 Significa que nuestra ubicación es requerido en la dirección de 0100. Del mismo modo si la dirección de segmento es 1DDD y desplazamiento es 0.100 a continuación: Dirección física es: 1DDD + 0100 = 1EDD

significa que nuestro destino es 1EDD.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top