Язык ассемблера – это язык программирования со взаимно однозначным соответствием между его командами и командами процессора. Язык ассемблера существует для каждого типа процессоров или целого семейства процессоров, так команды на языке ассемблера должны соответствовать системе машинных команд и быть согласованы с архитектурой компьютера. Язык ассемблера – язык низкого уровня. Ассемблер – это программа, преобразовывающая исходные коды языка ассемблера в машинные команды.
Для разработки программ на языке ассемблера для семейства процессоров Intel применяются два пакета программ: 1. Borland Turbo Assembler (TASM) 2. Microsoft Macro Assembler (MASM).
Технология разработки программ на языке ассемблера включает следующие этапы: 1. Постановка задачи и составление блок-схем. 2. Формирование текста программы с помощью редактора. 3. Создание исполняемого модуля, который можно запустить на выполнение под управлением операционной системы. 4. Выполнение программы. 5. Проверка результатов и выявление ошибок с помощью отладчика (выполнение программы в пошаговом режиме с контролем промежуточных результатов)
#1 Первая программа на ассемблере MASM
Ассемблер Объектная программа Исходная программа Перемещаемая программа компиляция компоновка ML. EXE LINK. EXE
Win. Asm Studio — специальное инструментальное средство для разработки программ на языке ассемблера, которое • содержит встренный текстовый редактор, который ориентирован специально на написание программ на языке ассемблера (подсветка синтаксических конструкций языка, всплывающие подсказки и т. д. ); • имеет средства для разработки оконного интерфейса программы (создание окон и различных элементов управления (кнопки, поля ввода, выпадающие списки и пр. ), меню программы);
Win. Asm Studio — специальное инструментальное средство для разработки программ на языке Ассемблера, которое • скрывает от программиста особенности компиляции и компоновки программы; • содержит встроенные средства отладки программ. D: Win. Asm. exe
Проект — совокупность нескольких исходных программ на языке ассемблера, файлов заголовков и т. д. , связанных между собой логикой алгоритма результирующей программы. Программы на языке ассемблера имеют расширение “*. asm” Файл проекта, представляющий собой файл с информацией о файлах, входящих в проект, опциях используемых для запуска компилятора и компоновщика и прочей служебной информацией, имеет расширение “*. wap”
Процедура создания проекта в Win. Asm 1. Создание нового проекта
Процедура создания проекта в Win. Asm 2. Выбор варианта нового проекта.
Процедура создания проекта в Win. Asm 3. Окно нового проекта.
Процедура создания проекта в Win. Asm 4. Сохранение нового проекта.
Процедура создания проекта в Win. Asm 5. Окно редактирования текста программы.
Структура программы на языке ассемблера Исходный текст программы разделяется на следующие секции: • данные, • неинициализированные данные, • константы, • код.
Структура программы на языке ассемблера Секция данных (. DATA) содержит данные, доступные для чтения и записи, включается в exe-файл. Неинициализированные данные (. DATA? ) не имеют никакого содержания при запуске, не включены в exeфайл непосредственно, это только часть памяти, зарезервированной Windows. Эта секция доступна для чтения и записи.
Создание проекта в Visual Studio с ассемблерным модулем
Структура программы на языке ассемблера Секция констант аналогична секции данных, но доступна только для чтения. Секция кода содержит текст программы на языке ассемблера, реализующий требуемый алгоритм работы.
Особенности шаблона программы на языке ассемблера 1) Директивы установки типа процессора – это директивы, которые определяют минимально возможный тип применяемого процессора. . 386 2) Директивы выбора модели памяти. MODEL FLAT, STDCALL
Модели памяти, используемые в MASM
Особенности шаблона программы на языке ассемблера 1) Директивы установки типа процессора – это директивы, которые определяют минимально возможный тип применяемого процессора. . 386 2) Директивы выбора модели памяти. MODEL FLAT, STDCALL Ключевое слово STDCALL устанавливает порядок передачи параметров при вызове подпрограмм и функций справа налево.
Особенности шаблона программы на языке ассемблера 3) Директивы, определяющие начала секций программы. . DATA? . CONST . CODE
Секция кода . code start: … end start
Использование функций Windows API в программах на ассемблере Windows API (Application Programming Interface) Kernel 32. dll содеpжит API функции, взаимодействующие с памятью и упpавляющие пpоцессами. User 32. dll содеpжит API функции, контpолиpующие пользовательский интеpфейс Gdi 32. dll содеpжит API функции, ответственные за гpафические опеpации (определение цветовой палитры создаваемых окон, элементов управления и т. д. ).
Пpогpаммы по мере необходимости связываются с библиотеками. Связь осуществляется путем использования в тексте программы ссылки на одноименные файлы с расширением *. LIB, называемые библиотеками импоpта. Подключение библиотек импоpта осуществляется директивой includelib. Описание передаваемых в API функций параметров содержится в одноименых файлах с расширением *. INC, называемых файлами для включения.
Регистры – участки высокоскоростной памяти для хранения данных в процессоре, они непосредственно подключены к блоку управления и арифметико-логическому устройству, поэтому доступ из этих блоков к регистрам происходит значительно быстрее, чем доступ к внешней памяти. Регистры общего назначения – это 32 -разрядные регистры EАХ, EВХ, EСХ, EDX, в каждом из которых выделяют 16 тиразрядный регистр, состоящий из двух 8 разрядных частей, например, в ЕАХ рассматривают регистр АХ, в нем младшую часть – регистр AL и старшую часть — АН.
В общем случае функция, выполняемая тем или иным регистром, определяется командами, в которых он используется. При этом с каждым регистром связано некоторое стандартное его назначение: • регистр ЕАХ служит для временного хранения данных (регистр аккумулятор), часто используется при выполнении операций сложения, вычитания, сравнения и других арифметических и логических операций; • регистр ЕВХ служит для хранения адреса некоторой области памяти (базовый регистр), а также используется как вычислительный регистр;
В общем случае функция, выполняемая тем или иным регистром, определяется командами, в которых он используется. При этом с каждым регистром связано некоторое стандартное его назначение: • регистр ЕСХ иногда используется для временного хранения данных, но в основном служит счетчиком, в нем хранится число повторений одной команды или фрагмента программы; • регистр ЕDX используется главным образом для временного хранения данных, часто служит средством пересылки данных между разными программными системами, а также используется в качестве расширителя аккумулятора для вычислений повышенной точности и при умножении и делении.
Регистры указатели – это 16 -разрядные регистры ЕВР (указатель базы), ЕSI (индекс источника), ЕDI (индекс результата), ЕSP (указатель стека), ЕIP (указатель команд). Они содержат величину смещения, используемую при расчете адресов команд и данных. ЕSI (индекс отправителя) указывает смещение адреса начала данных, которые должны быть перемещены. ЕDI (индекс результата) указывает смещение адреса, куда перемещаются данные. ЕIP (указатель команд) хранит смещение относительно начала сегмента кода следующей команды.
Регистры сегментов – это 16 -разрядные регистры, которые позволяют организовать память в виде совокупности четырех различных сегментов. CS – регистр программного сегмента (сегмента кода) определяет адрес начала участка ОП, содержащего выполняемые процессором команды; DS – регистр информационного сегмента (сегмента данных) определяет адрес начала участка ОП для хранения данных; SS – регистр стекового сегмента (сегмента стека) определяет часть памяти, используемой как системный стек; ES – регистр расширенного сегмента (дополнительного сегмента) указывает дополнительную область памяти, используемую для хранения данных.
Регистр флагов – это 16 -разрядный регистр, содержащий биты, определяющие код условия, установленный последней выполненной командой, или состояние микропроцессора. Эти биты называются флагами.
. 386 . MODEL flat, stdcall include KERNEL 32. includelib KERNEL 32. LIB . DATA summand_1 db 12 h summand_2 db 2 fh . CODE start: mov al, summand_2 add al, summand_1 invoke Exit. Process, 0 end start
Источник: present5.com
Создание программы на ассемблере
Цель работы — знакомство со специальными программными средствами, предназначенными для преобразования исходных текстов на ассемблере к виду, приемлемому для выполнения на компьютере. Процесс разработки программы состоит из нескольких этапов:
2. Создание объектного модуля (трансляция программы)
- prog.obj
- proglist.lst
- prog.crf Если требуется выборочное создание файлов, то вместо ненужных файлов необходимо подставить параметр nul. например: TASM /zi prog,,nul, В результате на диске будут созданы файлы:
- prog.obj
- prog.crf
Источник: studfile.net
Введение
Машинный код – система команд конкретной вычислительной машины (процессора), которая интерпретируется непосредственно процессором. Команда, как правило, представляет собой целое число, которое записывается в регистр процессора. Процессор читает это число и выполняет операцию, которая соответствует этой команде. Популярно это описано в книге Как стать программистом.
Язык программирования низкого уровня (низкоуровневый язык программирования) – это язык программирования, максимально приближённый к программированию в машинных кодах. В отличие от машинных кодов, в языке низкого уровня каждой команде соответствует не число, а сокращённое название команды (мнемоника). Например, команда ADD – это сокращение от слова ADDITION (сложение).
Поэтому использование языка низкого уровня существенно упрощает написание и чтение программ (по сравнению с программированием в машинных кодах). Язык низкого уровня привязан к конкретному процессору. Например, если вы написали программу на языке низкого уровня для процессора PIC, то можете быть уверены, что она не будет работать с процессором AVR.
Язык программирования высокого уровня – это язык программирования, максимально приближённый к человеческому языку (обычно к английскому, но есть языки программирования на национальных языках, например, язык 1С основан на русском языке). Язык высокого уровня практически не привязан ни к конкретному процессору, ни к операционной системе (если не используются специфические директивы).
Язык ассемблера – это низкоуровневый язык программирования, на котором вы пишите свои программы. Для каждого процессора существует свой язык ассемблера.
Ассемблер – это специальная программа, которая преобразует (компилирует) исходные тексты вашей программы, написанной на языке ассемблера, в исполняемый файл (файл с расширением EXE или COM). Если быть точным, то для создания исполняемого файла требуются дополнительные программы, а не только ассемблер. Но об этом позже…
В большинстве случаев говорят «ассемблер», а подразумевают «язык ассемблера». Теперь вы знаете, что это разные вещи и так говорить не совсем правильно. Хотя все программисты вас поймут.
ВАЖНО!
В отличие от языков высокого уровня, таких, как Паскаль, Бейсик и т.п., для КАЖДОГО АССЕМБЛЕРА существует СВОЙ ЯЗЫК АССЕМБЛЕРА. Это правило в корне отличает язык ассемблера от языков высокого уровня.
Исходные тексты программы (или просто «исходники»), написанной на языке высокого уровня, вы в большинстве случаев можете откомпилировать разными компиляторами для разных процессоров и разных операционных систем. С ассемблерными исходниками это сделать будет намного сложнее.
Конечно, эта разница почти не ощутима для разных ассемблеров, которые предназначены для одинаковых процессоров. Но в том то и дело, что для КАЖДОГО ПРОЦЕССОРА существует СВОЙ АССЕМБЛЕР и СВОЙ ЯЗЫК АССЕМБЛЕРА. В этом смысле программировать на языках высокого уровня гораздо проще. Однако за все удовольствия надо платить. В случае с языками высокого уровня мы можем столкнуться с такими вещами как больший размер исполняемого файла, худшее быстродействие и т.п.
- Emu8086. Хорошая программа, особенно для новичков. Включает в себя редактор исходного кода и некоторые другие полезные вещи. Работает в Windows, хотя программы пишутся под DOS. К сожалению, программа стоит денег (но оно того стоит))). Подробности см. на сайте http://www.emu8086.com.
- TASM – Турбо Ассемблер от фирмы Borland. Можно создавать программы как для DOS так и для Windows. Тоже стоит денег и в данный момент уже не поддерживается (да и фирмы Borland уже не существует). А вообще вещь хорошая.
- MASM – Ассемблер от компании Microsoft (расшифровывается как МАКРО ассемблер, а не Microsoft Assembler, как думают многие непосвящённые). Пожалуй, самый популярный ассемблер для процессоров Intel. Поддерживается до сих пор. Условно бесплатная программа. То есть, если вы будете покупать её отдельно, то она будет стоить денег. Но она доступна бесплатно подписчикам MSDN и входит в пакет программ Visual Studio от Microsoft.
- WASM – ассемблер от компании Watcom. Как и все другие, обладает преимуществами и недостатками.
- Debug — обладает скромными возможностями, но имеет большой плюс — входит в стандартный набор Windows. Поищите ее в папке WINDOWSCOMMAND или WINDOWSSYSTEM32. Если не найдете, тогда в других папках каталога WINDOWS.
- Желательно также иметь какой-нибудь шестнадцатеричный редактор. Не помешает и досовский файловый менеджер, например Волков Коммандер (VC) или Нортон Коммандер (NC). С их помощью можно также посмотреть шестнадцатеричные коды файла, но редактировать нельзя. Бесплатных шестнадцатеричных редакторов в Интернете довольно много. Вот один из них: McAfee FileInsight v2.1. Этот же редактор можно использовать для работы с исходными текстами программ. Однако мне больше нравится делать это с помощью следующего редактора:
- Текстовый редактор. Необходим для написания исходных текстов ваших программ. Могу порекомендовать бесплатный редактор PSPad, который поддерживает множество языков программирования, в том числе и язык Ассемблера.
И еще – исходный код, написанный, например для Emu8086, будет немного отличаться от кода, написанного, например, для TASM. Эти отличия будут оговорены.
Большая часть программ, приведённых в книге, написана для MASM. Во-первых, потому что этот ассемблер наиболее популярен и до сих пор поддерживается. Во-вторых, потому что он поставляется с MSDN и с пакетом программ Visual Studio от Microsoft. Ну и в третьих, потому что я являюсь счастливым обладателем лицензионной копии MASM.
Если же у вас уже есть какой-либо ассемблер, не вошедший в перечисленный выше список, то вам придётся самостоятельно разобраться с его синтаксисом и почитать руководство пользователя, чтобы научиться правильно с ним работать. Но общие рекомендации, приведённые в данной книге, будут справедливы для любых (ну или почти для любых) ассемблеров.
Источник: av-assembler.ru