Несколько технических вопросов по ассемблеру

Тема в разделе "WASM.BEGINNERS", создана пользователем net_name, 3 сен 2009.

  1. net_name

    net_name New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    25
    Да не я за оптимизацию не бьюсь, это я так к сведению, просто когда что то делал на С аналогичным образом поступал (писал на WinAPI) добавлял ключи линкера тоже малое творение получалось... Вот я и думал что на асме ещё намного меньше чем на С получится... Хотя думаю сравнивать пока нельзя, ведь прога окошко только выводит...

    Кстати не подскажите использовать лучше команду call или макрос invoke?
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    net_name
    Лень набирать несколько раз push -- используй invoke foo, если мне не изменяеет память -- invoke контроллирует правильнное количество переданных аргументов.
    Хочешь уменьшить размер программы или использовать ассемблерные "фишки" -- используй call _imp__foo. Хочешь компромисса -- посмотри последнее сообщение от болгарина Viruslav в можно ли избавиться от переходников call __foo; __foo: call [foo] там он предлагает макрос, который совмещает преимущества invoke foo и call _imp__foo
     
  3. net_name

    net_name New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    25
    Я лично за call, а вот в случае с call _imp__foo неужеле есть разница между:

    Код (Text):
    1.     push 0
    2.     push offset StrPirat
    3.     push offset StrPirat
    4.     push 0
    5.     call MessageBox
    6.  
    7.     push 0
    8.     push offset StrPirat
    9.     push offset StrPirat
    10.     push 0
    11.     call _imp__MessageBoxA@16
    Как я понимаю если пишешь MessageBox масм из windows.inc дёргает:
    Код (Text):
    1. MessageBeep PROTO :DWORD
    2. MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
    3. MessageBox equ <MessageBoxA>
    А что происходит когда пишешь _imp__MessageBoxA@16? 16 как я понимаю четыре параметра по 4 байта? :/
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Затем, что на мухе дроздофиле дешевле экспирементировать, да и результат можно сразу увидеть, чем на программе размером 1Мбайт. А набив руку можно и на программы более крупные по размеру переходить
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    net_name
    вы бы сходили по ссылке, которую я еще в #2 давал, да и max7C4 вас туда же отправлял в #25 там есть ответы на некоторые ваши вопросы
     
  6. net_name

    net_name New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    25
    Mikl___ я просто сейчас читаю Про упаковщики... первую часть, очень много попутных вопросов возникает, а по вопросу _imp__MessageBoxA@16 пока не встретил...

    Не против если относительно из статьи пару вопросов задать, для Вас я думаю не сложных...
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    net_name
    Не против, но лучше пиши в личку, чтобы не загаживать форум...
     
  8. net_name

    net_name New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    25
    Mikl___ клёвая статья сейчас читаю и душа не нарадуется...
    +1
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mikl___
    да, но масм всегда генерирует call + jmp
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Не masm, а tasm. masm как раз позволяет поизвращаться.
    возможно такое поведение tasm основано на используемым им inport32.lib А вот nasm вообще позволяет сократить многое из "ненужного", например, указывать название user32.dll без окончания ".dll" смотри здесь и всё работает
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Mikl___
    экспериментировать не вопрос - я поддерживаю такой способ выбора лучшего из альтернативных вариантов

    но делать из здравствуй мира совершенство имхо бред
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Почему именно MessageBox? Исследования в области генетики и наследственности "базируются" на плодовой мушке дрозофиле (Drosophila melanogaster). Маленькие размеры этого насекомого, его плодовитость и жизенный цикл (продолжительность 11 дней) позволяют наблюдать за последствием экспериментов по скрещиванию на многих поколениях. При этом не требуется ни долгих лет ожидания, ни больших помещений, ни средств на кормление подопытных животных. Вывод на экран MessageBox представляет собой задачу сравнительно компактную, но содержит свой РЕ-заголовок (который можно курочить и так и сяк), таблицу импорта (всего ода функция, но ее разместить можно и в РЕ-заголовке), возможность по разному передать в стек параметры и т.д. -- своего рода дрозофила для программиста :)
    PS извините за пафос :)
     
  13. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Mikl___

    я говорю тоже самое лишь уточняя один момент