|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 15, 2004 17:04:14 Берем простую Delphi-программу: {unit1.pas} unit unit1; interface var i:byte; procedure p1; implementation procedure p1;begin i:=1 end; end. {test.dpr} program test; uses unit1; begin a:=2; p1; end. p1 компилируется нормально: ; CODE mov byte ptr [a], 1 ret ; BSS a db ? А вот в главной программе обращение к a странно: ; CODE ; ... mov eax,[a_ofs] mov byte ptr [eax], 2 ; ... ; DATA a_ofs dd offset a ; const pointer ; BSS a db ? Зачем? |
|
|
Дата: Сен 15, 2004 19:28:00 diamond Что зачем? Почему не "mov byte ptr [a], 2" что ли? Это ещё не предел анти-оптимизации :-) |
|
|
Дата: Сен 15, 2004 20:54:15 Ну а можно это как-то логически объяснить? Ведь вряд ли Borland просто так идет на такую "антиоптимизацию". И потом, при обращении к a из unit1 все проходит нормально... |
|
|
Дата: Сен 16, 2004 00:14:47 · Поправил: Quantum Ну а можно это как-то логически объяснить? Компилятор Delphi никогда не отличался качеством генерируемого кода. И потом, при обращении к a из unit1 все проходит нормально... А разве не должно? Код вполне рабочий, хоть и некрасивый. |
|
|
Дата: Сен 16, 2004 05:17:34 diamond Прежде чем задавать вопросы потрудись привести полный код. Например, где описана/определена переменная a? PS пользуйся тегом оформления кода. |
|
|
Дата: Сен 16, 2004 13:07:40 · Поправил: leo diamond "можно это как-то логически объяснить?" Обяснить можно (хотя ты действительно чего-то напутал - у тебя в pascal-коде переменная a вообще не обявлена, наверное a это i). Кроме оптимизации кода есть еще скорость компиляции и линковки модулей (а здесь с борландом тягаться сложно). То что ты привел похоже на организацию таблицы импорта. В общем случае в программе может использоваться десяток-другой модулей и в каждом из них может быть десяток ссылок на переменную a из модуля unit1. Если мы используем в каждом модуле ссылку на a как a_offs:const pointer, то все модули компилируются независимо и при линковке достаточно в каждом модуле заменить одно значение a_offs, а не не искать все ссылки на a. |
|
|
Дата: Сен 17, 2004 07:29:57 · Поправил: leo PS: Конечно, не совсем так. Если переменная используется в нескольких модулях, то a_offs в data по любому одна и при линковке все равно приходится заменять все ссылки - если не на a, то на a_offs. Вроде бы "шило на мыло". Возможно фишка в том, что указатели типа a_offs имеют фикс.размер dword. Поэтому при компоновке достаточно определиться с порядоком следования всех ссылок в data, не заботясь о реальном размере переменных, и затем автоматом получать смещение на них. Ну а в "родном" модуле заменять a на a_offs было бы просто глупо. |
|
|
Дата: Сен 22, 2004 16:30:45 Переменная a - это, конечно, i. (a equ i) А по поводу идеи с фиксированным размером указателей: в любом случае нужно где-то запоминать порядок следования всех ссылок в data, так что непонятно, почему бы не запоминать сразу сами смещения переменных в bss? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.062 |