· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Delphi: глобальные переменные

Посл.отвђт Сообщен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