Pergunta

Estou passando por algum código assembly exemplo para modo real de 16 bits.

Eu me deparei com as linhas:

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

O que é esta fazendo? O que significa ter 'offset' não fazer?

Foi útil?

Solução

Como algumas das outras respostas dizer, a palavra-chave offset refere-se ao deslocamento do segmento em que é definida. Note-se, contudo, que os segmentos podem sobrepor-se e o deslocamento em um segmento pode ser diferente em um outro segmento. Por exemplo, suponha que você tenha o seguinte segmento em modo real

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

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS

A montadora vê que foo está em 0100h compensados ??a partir da base de data SEGMENT, então onde quer que ele vê offset foo ele vai colocar o valor 0100h, independentemente do valor da DS no momento.

Por exemplo, se mudarmos DS para algo diferente do que a base do segmento data o montador é assumindo:

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

No segundo exemplo DS é 0300h, de modo que a base do segmento apontada por DS é 03000h. Isto significa que ds:[offset foo] aponta para a 03000h + 0100h endereço que é o mesmo que 02000h + 01100h, que aponta para bar.

Outras dicas

Significa apenas que o endereço desse símbolo. É um pouco como o operador & em C, se você estiver familiarizado com isso.

meios offset que si registo será igual ao deslocamento da variável valor1 (não ao seu valor real). Deslocamento é o endereço do início do segmento de memória onde a variável está armazenada. O deslocamento é normalmente relação ao segmento ds (no seu caso ds e cs registros estão apontando para o mesmo segmento).

De Guia do MASM Programmer 6.1 (Microsoft Macro Assembler)

O OFFSET Operador

Uma constante endereço é um tipo especial de operando imediato que consiste em um valor do segmento offset ou. O operador OFFSET retorna o deslocamento de um local de memória, como mostrado aqui:

    mov     bx, OFFSET var  ; Load offset address

Para obter informações sobre as diferenças entre MASM 5.1 comportamento e MASM 6.1 comportamento relacionado para compensar, consulte o Apêndice A.

Uma vez que os dados em diferentes módulos podem pertencer a um único segmento, o montador pode não saber para cada módulo os verdadeiros deslocamentos dentro de um segmento. Assim, o deslocamento para var, embora um valor imediato, não é determinado até que o tempo da ligação.

Se você ler atentamente, o valor final é determinado depois de "link" seu código de objeto para criar uma DLL / EXE. Antes de ligar, tudo que você tem é um valor imediato que representa o deslocamento de endereço base do segmento.

Em x86 modo de 16 bits, espaço de endereço não é plana; em vez disso, os endereços são compostas de um deslocamento e um "segmento". "Segmento" aponta para um espaço de 64 k, offset é dentro desse espaço.

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

Offset é basicamente a distância do ponto de segmento (também chamado de ponto de referência). por exemplo endereço segmento 0000 e o endereço de offset ou lógica é então 0100 o endereço físico pode ser contado através da adição dos dois pares. Endereço físico = 0000 + 0100 = 0100 Meios que a nossa localização é necessário no endereço de 0100. Da mesma forma se o endereço segmento é 1DDD e offset é 0100, então: endereço físico é: 1DDD + 0100 = 1EDD

significa que o nosso destino está 1EDD.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top