Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

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

  Макс Петров май 2013

      Ниже приведена программа на языке ассемблера MASM32, которая выводит на системный динамик первые восемь тактов вальса Грибоедова. Программа может быть скомпилирована в исполняемый файл (.exe). Для компиляции создайте новый текстовый документ в директории, расположенной на том же диске, где у вас установлен MASM32. Файл переименуйте в beeper.asm, скопируйте в него текст программы. Затем откройте этот файл с помощью MASM32 Editor, после чего в меню MASM32 Editor выберите опцию Project >> Assemble & Link. В той папке, где находится beeper.asm, обнаружится и скомпилированная программа, она будет называться beeper.exe.

.386 ; 32-битный режим .model flat, stdcall ; компиляция в exe-файл с возможностью вызова API option casemap :none ; неразличение прописных и строчных символов include <\masm32\include\kernel32.inc> ; подключаем файл прототипов функций includelib <\masm32\lib\kernel32.lib> ; подключаем файл библиотек .data ; начинает сегмент данных (и завершает предыдущий сегмент) ; здесь могло бы быть описание переменных .code ; начинает сегмент кода (и завершает предыдущий сегмент) ; здесь могло бы быть описание процедур start: ; сюда операционная система передаст управление invoke Beep, 3951, 200 ; си invoke Beep, 4186, 200 ; до invoke Beep, 3951, 200 ; си invoke Beep, 3136, 200 ; соль invoke Beep, 2637, 200 ; ми invoke Beep, 3951, 200 ; си invoke Beep, 3136, 200 ; соль invoke Beep, 3951, 200 ; си invoke Beep, 1975, 200 ; си invoke Beep, 3951, 200 ; си invoke Beep, 3136, 200 ; соль invoke Beep, 3951, 200 ; си invoke Beep, 3440, 200 ; ля invoke Beep, 3951, 200 ; си invoke Beep, 3440, 200 ; ля invoke Beep, 3015, 200 ; фа invoke Beep, 2489, 200 ; ре-диез invoke Beep, 3440, 200 ; ля invoke Beep, 3015, 200 ; фа invoke Beep, 3440, 200 ; ля invoke Beep, 1975, 200 ; си invoke Beep, 3440, 200 ; ля invoke Beep, 3015, 200 ; фа invoke Beep, 3440, 200 ; ля invoke Beep, 3136, 200 ; соль invoke Beep, 3440, 200 ; ля invoke Beep, 3136, 200 ; соль invoke Beep, 2637, 200 ; ми invoke Beep, 1975, 200 ; си invoke Beep, 3136, 200 ; соль invoke Beep, 3015, 200 ; фа invoke Beep, 3136, 200 ; соль invoke Beep, 3015, 200 ; фа invoke Beep, 2098, 200 ; до invoke Beep, 1720, 200 ; ля invoke Beep, 3015, 200 ; фа invoke Beep, 2637, 200 ; ми invoke Beep, 3015, 200 ; фа invoke Beep, 2637, 200 ; ми invoke Beep, 2217, 200 ; до-диез (2217,40) invoke Beep, 1568, 200 ; соль invoke Beep, 2637, 200 ; ми invoke Beep, 2489, 250 ; ре-диез invoke Beep, 1975, 250 ; си invoke Beep, 3729, 250 ; ля-диез (3729,20) invoke Beep, 1975, 250 ; си invoke Beep, 3951, 250 ; си invoke Beep, 1975, 250 ; си invoke ExitProcess, 0 ; сообщаем Windows о завершении программы end start ; завершает сегмент кода

      Эта простейшая ассемблерная программа имеет набор директив, которые будут присутствовать в любой программе для MASM32. В первой строке записано указание компилятору на тип процессора, для которого создана программа. 386 - это третье поколение (1985) процессоров Intel, у которых регистры, внутренняя и внешняя шина данных впервые стали 32-разрядными. Таким образом, директива .386 означает, что программа написана для 32-разрядных процессоров Intel. Поскольку Intel-процесоры совместимы сверху вниз, программный код будет работать на всех версиях процессоров Intel, выпущенных после 1985 года.

      Другие возможные варианты директивы, указывающей на тип процессора: .8086, .186, .286 (16 бит), .486, .586, .686 (32 бит). Дополнительно (отдельной строкой) могут быть указаны расширения системы команд процессора (прописными или строчными символами): .MMX, .XMM.

      Комментарием считается любой набор символов, начинающийся с точкой с запятой и до конца строки. Например, в первой строке нашей программы запись ; 32-битный режим - это комментарий. Комментарии компилятор не обрабатывает.

      Директива .model в записи flat указывает компилятору, что программу следует создать в плоской модели памяти, при этом в одном 32-разрядном сегменте будут содержаться и программа, и ее данные. Именно в таком формате операционная система Windows понимает исполняемые файлы, соответственно, указание компилятору на плоскую модель памяти подразумевает создание в конечном итоге .exe-файла. Плоская модель памяти применима только для 32-разрядных процессоров и выше.

      Все понимаемые MASM32 модели пямяти: tiny, small, compact, medium, large, huge, flat.

      При стандартном вызове функций параметры передаются через стек. Именно через стек обмениваются данными с программами встроенные функции операционной системы Windows (API-функции), поэтому, если мы планируем использовать в своей программе такие функции, мы должны записать в директиве .model опцию stdcall.

      Директива option casemap :none дает указание компилятору неразличать прописные и строчные символы в написанной нами программе. Все варианты option casemap: all, none, notpublic.

      Директива include предписывает компилятору вставить в проект ассемблерный код из указанного в ней файла. Путь к файлу может быть указан в директиве не полностью, в таком случае компилятор будет исходить из текущего каталога. Угловые скобки необходимым, если путь к файлу содержит обратный слеш, точку с запятой, одинарные или двойные кавычки.

      Аналогично, директива includelib подключает к нашему проекту библиотечный файл.

      Директивы .data и .code начинают сегмент данных и сегмент исполняемого кода соответственно и заканчивают предыдущий сегмент, если таковой имеется.

      Директива invoke дает задание компилятору совершить вызов функции. В нашем случае вызываемая функция Beep - это API-функция Windows, она описывается следующим образом:
      Function Beep Lib "kernel32" Alias DWORD "Beep" (DWORD dwFreq, DWORD dwDuration).
Из описания видно, что эта функция содержится в системном (входящем в состав операционной системы Windows) файле kernel32.dll. Поэтому, выше в программе нами были подключены файлы kernel32.inc и kernel32.lib, где содержатся необходимые ассемблеру инструкции для работы с библиотекой kernel32.dll.

      Функции Beep должны быть переданы два значения - DWORD dwFreq и DWORD dwDuration. Запись DWORD (double word) конкретизирует размер памяти, которую занимает переменная. Double word - это два машинных слова (четыре байта или 32 бит). Указание размера памяти, отводимой под переменную, важно потому, что обмен данными с API-функциями программы производят через стек, в стек перед вызовом API-функции программа должна поместить как раз столько байт, сколько из него затем будет извлечено API-функцией. В противном случае вызов API-функции или исполнение программы после вызова может завершиться ошибкой.

      И, наконец, dwFreq - это частота звука в Герцах, dwDuration - длительность звука в миллисекундах. В ассемблере передаваемые функции параметры записываются после ее имени через запятую, в том же порядке, что и в описании функции. Например, запись invoke Beep, 784, 900 после компиляции даст ноту соль второй октавы (ее частота 784 Гц) с длительностью звучания 0,9 секунды.

     


Добавить комментарий

E-mail:
*


Контрольные цифры:

   Вовка    12.11.2016    20:38
Ну наконец то нашёл нормальный код, удалось без проблем скомпилировать и отлинковать пример кода ассемблера в masm32. Спасибо конечно большое, особенно спасибо за подробный комментарий в коде.


   Макс    13.11.2016    08:53
Спасибо за отзыв, рад, что удалось помочь.


   1    08.01.2017    16:27
Хорошие статьи, спасибо :)


   MASM32    29.05.2017    03:02
=)




Ассемблер MASM32

      Простейшая программа на ассемблере (beeper)
      Переменные и типы данных ассемблера
      Регистры процессора IA32
      Консоль ввода-вывода
      API-функция CharToOem и строки ассемблера
      API-функция ReadConsoleInput
      API-функция PeekConsoleInput
      События консоли (таблица)
      Системы счисления, тэги ассемблера, перевод чисел
      Отрицательные числа
      Инкремент и декремент
      Деление (DIV, IDIV)
      VKDEBUG
      Макросы ассемблера
      Воспоминание об Альгамбре на системном динамике
      Командная строка
      Пузырьковая сортировка. Эстафета шариков
      Сортировка расческой
      Быстрая сортировка

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна