Минимальная программа на ассемблере

Вопрос о минимальной программе для того или иного языка программирования и операционной среды обычно возникает в следующих случаях:

Между тем вопрос о минимальной программе — совсем не простейший, и представляет отнюдь не академический интерес. Минимальная программа, очевидно, решает две задачи: (1)стартуети (2)завершаетсяв конкретной рабочей среде. И то, и другое она должна делать корректно, с тем, чтобы:

В результате компиляции и сборки этого приложения получается исполняемый файл размером 1536 байт. Из них собственно код занимает 10 байт. Все остальное — на совести создателей формата PE-файла. Приложение безропотно запускается и не задумываясь завершает свою работу, возвращая код выхода.

Что здесь что и зачем?

Замечание 1.По поводу необходимости применения функции ExitProcess. Именно с ее помощью, а не посредством команды ret, как могли бы ожидать знатоки C/C++, должно завершаться приложение win32, написанное на ассемблере.

Если залезть внутрь runtime-библиотеки C/C++, то мы увидим, что именно так завершает работу приложения уже упоминавшаяся функция _WinMainCRTStartup. Но поскольку подключать runtime-библиотеку C/C++ к ассемблерной программе как-то нелогично (хотя и вполне возможно), мы должны вызвать ExitProcess «вручную». Только эта функция корректно завершает работу приложения, в частности, оповещая использовавшиеся приложением библиотеки DLL о необходимости декрементировать их счетчики занятости и, при обнулении последних, выгрузиться из памяти.

Простейшая программа на Ассемблере

Замечание 2.А вот и обещанная плохая новость про параметры стартовой процедуры. Дело в том, что установкой их значений занимается — кто бы вы думали? — опять же _WinMainCRTStartup! И следовательно, в ассемблерных программах, где ее нет, при входе в WinMain параметры содержат:

Так что, воленс-ноленс, придется получать эту ценную информацию самостоятельно. Как говорится, клик хере.

Замечание 3.И все-таки приведенный текст приложения — не самый минимальный. Можно сделать его еще меньше, для чего следует убрать все параметры функции WinMain. Поскольку приложение собирается без runtime-библиотеки C/C++, это вполне допустимо, так как больше не с чем выполнять ее связывание. В результате объем исполняемого файла останется тем же, а вот объем исполняемого кода в нем (образа приложения) сократится аж до 7 байт. Про это стоит почитать еще.

Замечание 4.В этой статье рассматривается минимизация размера кода программы, но отнюдь не exe-файла, ее содержащего. Как известно, исполняемые файлы Windows обычно имеют так называемый PE-формат, и манипуляции с этим форматом дают некоторые возможности для сокращения размера файла. Например, можно вместо стандартной stub-программы использовать более компактную, собственной разработки.

Fore kc .ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий

Читайте также:
Что такое программа коучинга

Первая программа на ассемблере.

Источник: www.i-assembler.ru

Простейшая программа на Ассемблере

Текст программы на Ассемблере можно набрать в редакторе текстов, например, в NotePad(в папке Accessories(Стандартные)).

Подготовка программы состоит из 3 шагов (Рис. 1):

  1. Подготовка исходного текста программы (Например, HELLO.ASM)
  2. Создание файла .OBJ,
  3. Создание файла .EXE,
  4. Выполнение ЕХЕфайла.

Создание программы Исходный текстHELLO.ASMОбъектный файлHELLO.OBJВыполняемый файлHELLO.EXEВыполнение Рисунок 1. Этапы создания программы на Ассемблере После набора текста программы HELLO.ASMв NotePadоткройте окно MS-DOSPromptи туда, с помощью мышки из окна Проводникаи папки где находится исходный текст, втащите название файла TASMили MASMи, после пробела, также втащите туда же название файла с программой. Нажмите ввод. Если ассемблирование пройдет без ошибок, будет создан объектный файл с расширением .OBJ. В окне MS-DOSPromptтаким же образом запустите редактор связей TLINKили LINKс названием объектного файла. Будет создан выполняемый файл .EXE, который можно запустить на выполнение. Запустить Ассемблер MASMили TASMможно также из NortonCommanderили FAR.

Правила записи программы на ассемблере

Программа, как правило, состоит из 3 сегментов: сегмента стека, сегмента данных и сегмента кодов (программы). Каждый сегмент начинается с названия сегмента и ключевого слова segment.Вторым оператором в сегменте кодов должен быть записан оператор assume, который устанавливает соответствие между регистрами сегментов и названиями сегментов.

Сегмент заканчивается оператором с названием сегмента и слова ends.Сегмент кодов обычно содержит основную процедуру и несколько процедур, и для каждой из них записывается название (например, myproc1); после названия в начале подпрограммы пишется слово proc,а конце — endp. Каждая процедура заканчивается словом ret. myproc1proc..retmyproc1endp.Данные обычно записываются в специальном сегменте данных, пример которого дан ниже. mydata segment

X db ?

y dw ?mydataendsПрограмма, состоящая из указанных сегментов и включающая в себя основные директивы, а также некоторые дополнительные конструкции, необходимые для создания работающей программы, представлена на рисунке: ;MODEL.ASMSSEGSEGMENTSTACK;Начало сегмента стекаDB256DUP(?) Указана длина стекаSSEGENDS;Конец сегмента стека;DSEGSEGMENT;Начало сегмента данныхCATSDB’A’ ;Ваши данныеRATSDB’B’ ;Ваши данныеBATSDB’C’ ;Ваши данныеDSEGENDS;Конец сегмента данных;CSEGSEGMENT;Начала сегмента кодовASSUMECS:CSEG,DS:DSEG,SS:SSEG; указание названий сегментов регистрам сегментовSTARTPROC;Начало главной процедуры STARTPUSHDS;Работа программы начинаетсяPUSHAX;с установкиAХ=0MOVBX,DSEG;Задание базового адресаMOVDS,BX; сегмента данных

Источник: studfile.net

Минимальная программа на ассемблере

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Необходимо обновить браузер или попробовать использовать другой.

Минимальное Windows-приложение на ассемблере

Дата публикации 14 июн 2002

Минимальное Windows-приложение на ассемблере — Архив WASM.RU

  1. когда начинающий программист дочитывает до конца первую главу учебника и до него доходит, что большинство известных ему программ умеют нечто большее, чем тупо приветствовать мир. Пытливый ум новичка подсказывает ему, что если встречаются программы, умеющие больше этого, то, значит, где-то есть и программы, умеющие меньше
  2. когда начинающий программист робко, опасаясь быть проигнорированным, замодерированным или посланным, забрасывает вопрос в какую-нибудь конференцию. Последующие события, как правило, приводят его в шок, надолго отбивая охоту приступать к прочтению второй главы. Со всех концов бескрайней саванны мгновенно слетаются и сбегаются бесчисленные гуру, возникает потасовка, из облака пыли доносятся рык, ржание, визги и предсмертные хрипы, разлетаются перья и клоки шерсти. Великие считают и пересчитывают строчки в исходниках, потом буквочки в них же, а потом и байтики в екзешниках. Вопли стихают только после того, когда кто-нибудь предлагает подсчитывать биты, установленные в 1, и все вдруг понимают, почему двери в психушках открываются исключительно вовнутрь. Вывалив языки и тяжко дыша, братия расползается по своим кельям зализывать раны и готовиться к грядущим битвам. Посередине вытоптанной поляны, одинокий, жалкий и забытый, остывает трупик несчастного новичка
  3. когда новичок, отчаявшись познать истину самостоятельно или испить ее из ладоней великих, записывается на компьютерные курсы, и, с трудом досидев на первом занятии до сакраментального «У кого есть вопросы?», тянет руку и получает в ответ краткое изложение всей программы обучения. Затем, сверившись со списком группы и перезвонив в кассу, преподаватель также дает обещание, что к концу курса студент сам сможет элементарно ответить на этот простейший вопрос.

В C/C++, например, запуск и завершение приложения win32 поддерживаются скрытой от прикладного программиста функцией _WinMainCRTStartup, содержащейся в runtime-библиотеке. Именно ее вызывает операционная система при запуске приложения, а уж она, кое-чего поделав, вызывает ту самую WinMain, с которой начинается всякое приложение, базирующееся на win32. (Конечно, строго говоря, запуск приложения посредством вызова _WinMainCRTStartup — это свойство не языка, а операционной среды.) От программиста же требуется, чтобы WinMain была правильно оформлена (включая четыре входных параметра), и завершалась оператором return с кодом выхода типа int.

В языках программирования более высокого уровня для программиста все еще проще, хотя там уже вряд ли можно говорить о том, что приложение-де «непосредственно взаимодействует с операционной системой». Java, еще более высокий, чем C/С++, уже не использует фиксированное название стартовой функции, да и завершение программы в нем — это просто закрывающая фигурная скобка.

Однако, вернемся к ассемблеру. Вот обещанный текст минимального приложения для win32:
.model flat,stdcall
ExitProcess PROTO :DWORD
WinMain PROC PUBLIC hinst,prev_hinst,command_line,cmd_show
invoke ExitProcess,0
WinMain ENDP

Читайте также:
Кому отказывают в программе по переселению

В результате компиляции и сборки этого приложения получается исполняемый файл размером 1536 байт. Из них собственно код занимает 10 байт. Все остальное — на совести создателей формата PE-файла. Приложение безропотно запускается и не задумываясь завершает свою работу, возвращая код выхода.

  • .386 — директива ассемблера, определяющая набор команд процессора, который может быть использован в программе. Для приложений win32 необходимо использовать эту директиву или выше, в зависимости от того, собираетесь ли вы использовать возможности, предоставляемые процессорами последующих поколений
  • .model flat,stdcall — сегментная директива ассемблера, определяющая сегментную модель приложения как плоскую, использующую соглашения о вызове процедур, принятые в win32. Именно такая сегментная модель должна всегда использоваться при написании приложений для win32 ExitProcess PROTO :DWORD — прототип функции API, выполняющей завершение приложения. (Поскольку сервис этой функции предоставляется dll-библиотекой kernel32.dll, то при сборке приложения хорошо бы не забыть подключить библиотеку импорта kernel32.lib)
  • .code — сегментная директива ассемблера, определяющая начало сегмента кода
  • WinMain PROC PUBLIC hinst,prev_hinst,command_line,cmd_show — начало тела стартовой процедуры. Следует обратить внимание на наличие директивы видимости (visibility) PUBLIC, которая позволит сборщику сделать процедуру доступной для операционной системы, дабы та смогла передать управление приложению. Параметры процедуры обсудим чуть ниже, правда, новость будет не очень приятной.
  • ;. — здесь должна быть всякая прочая мелочь, которую вы хотели бы заставить делать ваше приложение
  • invoke ExitProcess,0 — собственно вызов функции завершения приложения. Здесь код выхода 0, но он, естественно, может быть любым в пределах 32-разрядного целого. В полноценных приложениях нормой считается определение кода выхода в цикле обработки сообщений главного окна.
  • WinMain ENDP — всякое тело должно иметь конец. Это он и есть. Правда, в силу наличия предыдущей строки, он в данной программе не достижим, но это и не требуется: здесь мы просто исполняем необходимую формальность. Кстати, настоящим ассемблерщикам должно быть приятно, что, опустив ненужную в связи с этим команду ret, мы сэкономили аж 4 байта кода!
  • end — конец модуля.

Если залезть внутрь runtime-библиотеки C/C++, то мы увидим, что именно так завершает работу приложения уже упоминавшаяся функция _WinMainCRTStartup. Но поскольку подключать runtime-библиотеку C/C++ к ассемблерной программе как-то нелогично (хотя и вполне возможно), мы должны вызвать ExitProcess «вручную». Только эта функция корректно завершает работу приложения, в частности, оповещая использовавшиеся приложением библиотеки DLL о необходимости декрементировать их счетчики занятости и, при обнулении последних, выгрузиться из памяти.

  • hinst — не дескриптор текущего экземпляра приложения, а количество акций Microsoft у Билла Гейтса
  • prev_hinst — не 0, а прогнозируемое значение NASDAQ после выхода на мировой рынок российской ОС BrokenWindows
  • command_line — не указатель на командную строку, а традиционный народный российский указатель направления
  • cmd_show — не предлагаемый начальный вид окна, а то, что обещал показать мировому сообществу Никита Сергеевич Хрущов (и даже, помнится, начал раздеваться)
Читайте также:
Программа чтобы скачивать с ютуба и ВК

Источник: wasm.in

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru