O que compensados ??em 16 bit média código de montagem?
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?
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.
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.