Delphi: глобальные переменные

Тема в разделе "WASM.RESEARCH", создана пользователем diamond, 15 сен 2004.

  1. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Берем простую 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 ?

    Зачем?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    diamond

    Что зачем? Почему не "mov byte ptr [a], 2" что ли? Это ещё не предел анти-оптимизации :)
     
  3. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Ну а можно это как-то логически объяснить? Ведь вряд ли Borland просто так идет на такую "антиоптимизацию". И потом, при обращении к a из unit1 все проходит нормально...
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    Компилятор Delphi никогда не отличался качеством генерируемого кода.





    А разве не должно? Код вполне рабочий, хоть и некрасивый.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    diamond

    Прежде чем задавать вопросы потрудись привести полный код. Например, где описана/определена переменная a?



    PS пользуйся тегом оформления кода.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    diamond

    "можно это как-то логически объяснить?"

    Обяснить можно (хотя ты действительно чего-то напутал - у тебя в pascal-коде переменная a вообще не обявлена, наверное a это i).

    Кроме оптимизации кода есть еще скорость компиляции и линковки модулей (а здесь с борландом тягаться сложно). То что ты привел похоже на организацию таблицы импорта. В общем случае в программе может использоваться десяток-другой модулей и в каждом из них может быть десяток ссылок на переменную a из модуля unit1. Если мы используем в каждом модуле ссылку на a как a_offs:const pointer, то все модули компилируются независимо и при линковке достаточно в каждом модуле заменить одно значение a_offs, а не не искать все ссылки на a.
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    PS: Конечно, не совсем так. Если переменная используется в нескольких модулях, то a_offs в data по любому одна и при линковке все равно приходится заменять все ссылки - если не на a, то на a_offs. Вроде бы "шило на мыло". Возможно фишка в том, что указатели типа a_offs имеют фикс.размер dword. Поэтому при компоновке достаточно определиться с порядоком следования всех ссылок в data, не заботясь о реальном размере переменных, и затем автоматом получать смещение на них.

    Ну а в "родном" модуле заменять a на a_offs было бы просто глупо.
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Переменная a - это, конечно, i. (a equ i)

    А по поводу идеи с фиксированным размером указателей: в любом случае нужно где-то запоминать порядок следования всех ссылок в data, так что непонятно, почему бы не запоминать сразу сами смещения переменных в bss?