Доброй ночи господа. Вот программирую на асме и после прочтения одного мануала заметил что как то не так пишеться. Вопрос заключаеться в том что например у Галисеева в Его книге Асм под Вин32 после начала сегмента кода создаеться процедура а у товарища Iczelion'a метка.Так вот будьте так добры дайте ответ почему,в чем разница и что лучше?
примеры давайте не все же сидять с книгами и быстро делают поиски что да где там у них(тех товарищей)
Ну суть вопроса вот в чем Галисеев и многие другие авторы (1 случай) Код (Text): .code main proc итд итп Iczelion (2 случай) Код (Text): .code start:
DoubleOn > создаеться процедура а у товарища Iczelion'a метка. процедура это и есть метка. иногда, правда, с некоторым не особо важным выпендрежем. так масмовый прос имена функций (они же их метки) манглит под стдкалл, долепляет ебп-пролог/эпилог и первый встреченый рет без параметров (с3h) переделывает в рет с параметрами (с2h nnnn), если они у просы есть. если ретов в просе > 1, то, бывает, начинаются загадочные глюки
DoubleOn У меня Г.В.Галисиев "Ассемблер IBM PC. Самоучитель" смотрим раздел программирование под DOS Код (Text): .model ... .stack ... .data ... .code main proc ... main endp end main <-- обратите внимание на слово main программирование под Win32 Код (Text): .386 .model flat include ... .data ... .code WinMain proc ... WinMain endp ... end WinMain <-- обратите внимание на слово WinMain Смотрим 1-ый урок Iszelion'а Код (Text): .386 .MODEL Flat, STDCALL .DATA <Ваша инициализированные данные> ...... .DATA? <Ваши неинициализированные данные> ...... .CONST <Ваши константы> ...... .CODE <метка> <Ваш код> ...... end <метка> Чуть ниже текст: Turbo Assembler Quick Reference Guide Л.В.Лямин "Макроассемблер MASM"
Видимо для тех случаев, когда указывается директива END некоторые линкеры имеют специальные ключи, которые позволяют указать точку входа из командной строки GoLink /entry xxxx = set program entry point to xxxx PoLink, Link /entry:symbol
Хочу добавить, чтобы развеять вредное заблуждение - нет никакой процедуры! Вам кажется, что объявление ... Main proc ... Main endp ... обязательное, как в языках высокого уровня? Типа, компилятор должен знать, где у вас процедура кончилась? Так а тут язык низкого уровня, главное - чтобы вы сами знали, где у вас кончилась процедура )) и процедура ли это вообще PrintBlackOnWhiteOemString: (задаем черный цвет для символов и белый для фона) PrintOemString: (делаем преобразование строки в другую кодировку) PrintString: (выводим в консоль) retn 4 start: ... call PrintString, szString ... call PrintOemString, szString ... call PrintBlackOnWhiteOemString, szString ... end start То есть, главное - метка, а объявление процедуры можете рассматривать как макрос для создания ebp-фрейма и использования локальных переменных.
DoubleOn коротко - метка и процедура - теже яйца только в профиль два средства указания точки начала исполнения фрагмента кода исторически сначала были только метки а потом в связи с развитием средств разметки кода в ЯВУ это было добавлено и в асм фантики это все пользуйтесь тем который нравится
Mikl___ да да извините просто не дописал.Вы правы Товрищи исправтье если я не прав.В принципе можно писать как меткой так и процедурой и ни кто ругаться не будет???
Дадад!Все Спасибо что обьяснили.Сейчас проснулся и попробывал написть маленькую програмку двумя способами.Работает и так и так.Так что думаю вопрос закрыт а за теорию спасибо =)
В С функция main придумана чтобы "спрятать" (вынести за её пределы) типовой код инициализации и закрытия программы, в С++ к этому добавился автоматический вызов деструкторов объектов. В асме автоматических деструкторов нету, а типовой код инициализации используется только в крупных программах (которые почти никто собственно на нём и не пишет). Старт программы по функции вместо метки это не совсем грамотный перенос концепций из С/С++ в асм. Если хочется действительно иметь скрываемый типовой код запуска/завершения программы, то стартовать нужно по метке, указывающей в этот код, а уже из него вызывать main (как собственно и сделано в С/С++). А если просто написать: Код (Text): .code main proc ... ret main endp end main то простые програмки работать будут, а когда возникнет потребность в явной или неявной многопоточности то полезут глюки, потому что простой ret переадресуется в ExitTread, а для полноценного завершения программы с несколькими потоками нужен ExitProcess. PS: неявная многопоточность это когда вызов "безобидной" функции win api порождает дополнительный поток (а то и несколько) которые управляются самой win и прямого доступа к ним нет.