Интересный вопрос без ответа

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

  1. DoubleOn

    DoubleOn New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2009
    Сообщения:
    62
    Доброй ночи господа.
    Вот программирую на асме и после прочтения одного мануала заметил что как то не так пишеться.
    Вопрос заключаеться в том что например у Галисеева в Его книге Асм под Вин32 после начала сегмента кода создаеться процедура а у товарища Iczelion'a метка.Так вот будьте так добры дайте ответ почему,в чем разница и что лучше?
     
  2. reversecode

    reversecode Guest

    Публикаций:
    0
    примеры давайте
    не все же сидять с книгами и быстро делают поиски что да где там у них(тех товарищей)
     
  3. DoubleOn

    DoubleOn New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2009
    Сообщения:
    62
    Ну суть вопроса вот в чем


    Галисеев и многие другие авторы (1 случай)
    Код (Text):
    1. .code
    2. main proc
    3. итд итп
    Iczelion (2 случай)
    Код (Text):
    1. .code
    2. start:
     
  4. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    DoubleOn
    > создаеться процедура а у товарища Iczelion'a метка.
    процедура это и есть метка. иногда, правда, с некоторым не особо важным выпендрежем. так масмовый прос имена функций (они же их метки) манглит под стдкалл, долепляет ебп-пролог/эпилог и первый встреченый рет без параметров (с3h) переделывает в рет с параметрами (с2h nnnn), если они у просы есть. если ретов в просе > 1, то, бывает, начинаются загадочные глюки
     
  5. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    DoubleOn
    У меня Г.В.Галисиев "Ассемблер IBM PC. Самоучитель" смотрим раздел программирование под DOS
    Код (Text):
    1. .model ...
    2. .stack ...
    3. .data
    4.  ...
    5. .code
    6. main proc
    7. ...
    8. main endp
    9. end main <-- обратите внимание на слово main
    программирование под Win32
    Код (Text):
    1. .386
    2. .model flat
    3. include ...
    4. .data
    5.  ...
    6. .code
    7. WinMain proc
    8. ...
    9. WinMain endp
    10. ...
    11. end WinMain <-- обратите внимание на слово WinMain
    Смотрим 1-ый урок Iszelion'а
    Код (Text):
    1. .386
    2. .MODEL Flat, STDCALL
    3. .DATA
    4.    <Ваша инициализированные данные>
    5.    ......
    6. .DATA?
    7.    <Ваши неинициализированные данные>
    8.    ......
    9. .CONST
    10.    <Ваши константы>
    11.    ......
    12. .CODE
    13.    <метка>
    14.    <Ваш код>
    15.    ......
    16. end <метка>
    Чуть ниже текст:
    Turbo Assembler Quick Reference Guide
    Л.В.Лямин "Макроассемблер MASM"
     
  6. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    А.А.Чекатов "Использование Turbo Assembler при разработке программ"
     
  7. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Видимо для тех случаев, когда указывается директива END некоторые линкеры имеют специальные ключи, которые позволяют указать точку входа из командной строки
    GoLink
    /entry xxxx = set program entry point to xxxx
    PoLink, Link
    /entry:symbol
     
  8. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Хочу добавить, чтобы развеять вредное заблуждение - нет никакой процедуры! Вам кажется, что объявление

    ...
    Main proc
    ...
    Main endp
    ...

    обязательное, как в языках высокого уровня? Типа, компилятор должен знать, где у вас процедура кончилась? Так а тут язык низкого уровня, главное - чтобы вы сами знали, где у вас кончилась процедура :))) и процедура ли это вообще

    PrintBlackOnWhiteOemString:
    (задаем черный цвет для символов и белый для фона)
    PrintOemString:
    (делаем преобразование строки в другую кодировку)
    PrintString:
    (выводим в консоль)
    retn 4

    start:
    ...
    call PrintString, szString
    ...
    call PrintOemString, szString
    ...
    call PrintBlackOnWhiteOemString, szString
    ...
    end start

    То есть, главное - метка, а объявление процедуры можете рассматривать как макрос для создания ebp-фрейма и использования локальных переменных.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    FatMoon
    +1. что можно сделать и вручную, а когда неохота - воспользоваться макросом
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    DoubleOn
    коротко - метка и процедура - теже яйца только в профиль
    два средства указания точки начала исполнения фрагмента кода
    исторически сначала были только метки а потом в связи с развитием средств разметки кода в ЯВУ это было добавлено и в асм
    фантики это все пользуйтесь тем который нравится
     
  11. DoubleOn

    DoubleOn New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2009
    Сообщения:
    62
    Mikl___
    да да извините просто не дописал.Вы правы

    Товрищи исправтье если я не прав.В принципе можно писать как меткой так и процедурой и ни кто ругаться не будет???
     
  12. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    247
    DoubleOn
    Да, вообще процедура без макросов выглядит примерно так:
     
  13. DoubleOn

    DoubleOn New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2009
    Сообщения:
    62
    Дадад!Все Спасибо что обьяснили.Сейчас проснулся и попробывал написть маленькую програмку двумя способами.Работает и так и так.Так что думаю вопрос закрыт а за теорию спасибо =)
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В С функция main придумана чтобы "спрятать" (вынести за её пределы) типовой код инициализации и закрытия программы, в С++ к этому добавился автоматический вызов деструкторов объектов. В асме автоматических деструкторов нету, а типовой код инициализации используется только в крупных программах (которые почти никто собственно на нём и не пишет). Старт программы по функции вместо метки это не совсем грамотный перенос концепций из С/С++ в асм. Если хочется действительно иметь скрываемый типовой код запуска/завершения программы, то стартовать нужно по метке, указывающей в этот код, а уже из него вызывать main (как собственно и сделано в С/С++).
    А если просто написать:
    Код (Text):
    1. .code
    2. main proc
    3.   ...
    4.   ret
    5. main endp
    6. end main
    то простые програмки работать будут, а когда возникнет потребность в явной или неявной многопоточности то полезут глюки, потому что простой ret переадресуется в ExitTread, а для полноценного завершения программы с несколькими потоками нужен ExitProcess.
    PS: неявная многопоточность это когда вызов "безобидной" функции win api порождает дополнительный поток (а то и несколько) которые управляются самой win и прямого доступа к ним нет.
     
  15. zeroday

    zeroday New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2009
    Сообщения:
    27
    Y_Mur
    Вывод: юзайте ExitProcess(0);) ?