Берем простую 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 ? Зачем?
Ну а можно это как-то логически объяснить? Ведь вряд ли Borland просто так идет на такую "антиоптимизацию". И потом, при обращении к a из unit1 все проходит нормально...
Компилятор Delphi никогда не отличался качеством генерируемого кода. А разве не должно? Код вполне рабочий, хоть и некрасивый.
diamond Прежде чем задавать вопросы потрудись привести полный код. Например, где описана/определена переменная a? PS пользуйся тегом оформления кода.
diamond "можно это как-то логически объяснить?" Обяснить можно (хотя ты действительно чего-то напутал - у тебя в pascal-коде переменная a вообще не обявлена, наверное a это i). Кроме оптимизации кода есть еще скорость компиляции и линковки модулей (а здесь с борландом тягаться сложно). То что ты привел похоже на организацию таблицы импорта. В общем случае в программе может использоваться десяток-другой модулей и в каждом из них может быть десяток ссылок на переменную a из модуля unit1. Если мы используем в каждом модуле ссылку на a как a_offs:const pointer, то все модули компилируются независимо и при линковке достаточно в каждом модуле заменить одно значение a_offs, а не не искать все ссылки на a.
PS: Конечно, не совсем так. Если переменная используется в нескольких модулях, то a_offs в data по любому одна и при линковке все равно приходится заменять все ссылки - если не на a, то на a_offs. Вроде бы "шило на мыло". Возможно фишка в том, что указатели типа a_offs имеют фикс.размер dword. Поэтому при компоновке достаточно определиться с порядоком следования всех ссылок в data, не заботясь о реальном размере переменных, и затем автоматом получать смещение на них. Ну а в "родном" модуле заменять a на a_offs было бы просто глупо.
Переменная a - это, конечно, i. (a equ i) А по поводу идеи с фиксированным размером указателей: в любом случае нужно где-то запоминать порядок следования всех ссылок в data, так что непонятно, почему бы не запоминать сразу сами смещения переменных в bss?