OSDev
http://osdev.su/

DLL Винды: Как?
http://osdev.su/viewtopic.php?f=6&t=467
Страница 2 из 2

Автор:  phantom-84 [ 04 ноя 2011, 20:52 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Опять путаница в терминологии.

Автор:  SII [ 04 ноя 2011, 21:37 ]
Заголовок сообщения:  Re: DLL Винды: Как?

phantom-84 писал(а):
Опять путаница в терминологии.


Она самая... В частности, именно поэтому, когда писал про формат кода команды IA-32 на Вике, я displacement переводил как отклонение, а не смещение, как обычно это делают: в последнем случае возникает путаница с offset.

Пы.Сы. С круглым постом :)

Автор:  phantom-84 [ 05 ноя 2011, 10:20 ]
Заголовок сообщения:  Re: DLL Винды: Как?

displacement - "смещение"; offset - "внутрисегментное смещение", а по нынешним временам - просто "адрес" (не линейный, но часто совпадающий с ним). pavia использовал термины "относительный адрес" и "абсолютный адрес" в соответствии с понятиями "относительная адресация" и "абсолютная адресация", что в принципе весьма логично (я только не понял вот этого: "По крайней мере не все"), т.к. к примеру в инструкциях процессора они кодируются по-разному. Но по-моему такие "относительные адреса" все-таки лучше называть смещениями. Абсолютный адрес от pavia и абсолютный адрес от SII кодируются АБСОЛЮТНО одинаково, просто pavia не стал различать фиксированные (нерелоцируемые/некорректируемые абсолютные) адреса, для которых нет записей в таблице релокации, и (релоцируемые/корректируемые абсолютные) адреса, для которых такие записи есть, а SII это сделал. Как видно, я адреса первого вида называю фиксированными, когда хочу сделать акцент на то, что это неизменяемые адреса.

SII писал(а):
Пы.Сы. С круглым постом :)
Спасибо :)

Автор:  SII [ 05 ноя 2011, 14:01 ]
Заголовок сообщения:  Re: DLL Винды: Как?

phantom-84 писал(а):
displacement - "смещение"; offset - "внутрисегментное смещение", а по нынешним временам - просто "адрес" (не линейный, но часто совпадающий с ним)


Ну, displacement и особенно offset далеко не только в IA-32 употребляются, и второй уже не один десяток лет переводится именно как смещение. Насчёт displacement'а стабильного перевода нет, встречается и так, и эдак, но если, например, на мэйнфреймах это пофиг (там есть displacement, но нет offset, если речь идёт об адресации), то на IA-32 оба термина используются вместе, почему и нуждаются в раздельном переводе. Буквальным переводом displacement, конечно, будет как раз смещение, но оно в силу устоявшейся практики прочто ассоциируется с offset'ом, почему я и перевожу его как "отклонение".

Что касается offset'а в случае с ПК, то его называют просто адресом давным-давно, задолго до появления 80386. В случае, если нет полной ясности из контекста, обычно уточняют: "ближний адрес" (near), чем отличают от "дальнего" (far), включающего не только offset, но и селектор сегмента (ну или просто сегмент, если кратко говорить, хотя это, естественно, разные вещи). А вот уточнение "внутрисегментное смещение" встречается крайне редко (во всяком случае, мне практически не попадалось).

Цитата:
pavia использовал термины "относительный адрес" и "абсолютный адрес" в соответствии с понятиями "относительная адресация" и "абсолютная адресация", что в принципе весьма логично (я только не понял вот этого: "По крайней мере не все"), т.к. к примеру в инструкциях процессора они кодируются по-разному


Утверждать не буду, всё ж давным-давно в доку на IA-32 не заглядывал, но разве там есть абсолютная адресация? Вроде бы есть только прямая (вроде MOV EAX, [1234h], где 1234h -- эффективный адрес = смещение (offset) в сегменте данных), а термин "абсолютная" не применяется. Так аналогичная адресация называется и на основной массе других архитектур, где она вообще имеется (хотя на PDP-11 она называется именно абсолютной, однако там технически это будет косвенная автоинкрементная адресация относительно счётчика команд). Относительной же адресацией обычно называется адресация, опирающаяся на значение счётчика команд (он только на IA-32 называется указателем инструкции IP, практически все остальные архитектуры его называют PC). Например, она используется в большинстве команд переходов: частью кода команды является смещение (offset), прибавляемое к значению счётчика команд, в результате чего получается адрес перехода.

Что же касается относительных и абсолютных адресов применительно к загружаемым модулям, то смысл у них вполне однозначен на всех платформах, с которыми мне приходилось сталкиваться. Первый термин означает адрес, значение которого в модуле дано относительно некоторой базы и которое должно корректироваться с учётом реального адреса загрузки, а второй -- адрес, чьё значение не зависит от местоположения модуля, и следовательно, не корректируется. Для первого нередко применяется термин "перемещаемый" (в принципе, я поддерживаю такое употребление, поскольку это позволяет не смешивать его с относительной адресацией в командах, хотя из контекста обычно и так ясно, о чём речь: о целых адресах или же о способах адресации), но вот "фиксированный" для второго, кажется, никогда не встречал -- только абсолютный и (редко) неперемещаемый.

В общем, как обычно: о терминах не спорят, о них договариваются :)

Автор:  pavia [ 05 ноя 2011, 14:33 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Вот из Intel

Цитата:
Displacement ⎯ A displacement alone represents a direct (uncomputed) offset
to the operand. Because the displacement is encoded in the instruction, this form
of an address is sometimes called an absolute or static address. It is commonly
used to access a statically allocated scalar operand.

...
Цитата:
Jump instruction — The JMP (jump) instruction unconditionally transfers program
control to a destination instruction. The transfer is one-way; that is, a return address
is not saved. A destination operand specifies the address (the instruction pointer) of
the destination instruction. The address can be a relative address or an absolute
address.

A relative address is a displacement (offset) with respect to the address in the EIP
register. The destination address (a near pointer) is formed by adding the displace-
ment to the address in the EIP register. The displacement is specified with a signed
integer, allowing jumps either forward or backward in the instruction stream.
An absolute address is a offset from address 0 of a segment. It can be specified in
either of the following ways:


Про CALL сказано что он аналогичен jmp.

Автор:  SII [ 05 ноя 2011, 14:53 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Значит, используют-таки термин "абсолютный". Ну что ж, буду знать, пока в очередной раз не забуду :) Всё ж широкий кругозор имеет не только плюсы, но и минусы...

Автор:  Himik [ 05 ноя 2011, 19:26 ]
Заголовок сообщения:  Re: DLL Винды: Как?

SII писал(а):
Значит, используют-таки термин "абсолютный". Ну что ж, буду знать, пока в очередной раз не забуду :) Всё ж широкий кругозор имеет не только плюсы, но и минусы...

Я displacement-ы называю отступами. Отступ от текущей позиции. В прямом смысле, адресом он не является.
А вдруг вспомнилось. Кажется, ещё употребляют термин "относительный адрес".

Автор:  phantom-84 [ 05 ноя 2011, 20:50 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Тогда уж лучше "сдвиг". Кстати в терминологии Intel displacement - это элемент формируемого эффективного адреса, который при определенных условиях может быть единственной составляющей адреса. Мы тоже часто говорим просто "смещение" (в том числе и "displacement" по-английски), подразумевая адрес внутри сегмента, а не относительно какого-либо базового регистра общего назначения или регистра IP. А когда нужно подчеркнуть, что речь идет о смещении относительно чего-либо, то часто так и говорим "смещение относительно IP", "смещение относительно (адреса) конца команды", "смещение внутри структуры" и т.п. Короче это не проблема, а единичный случай недопонимания, возникший между двумя людьми.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/