Пример выполнения программы в среде разработки RadASM ассемблер Masm32 Лабораторная работа №5 Ввод и вывод элементов массива с преобразованием во внутреннее представление. Цель работы Цель лабораторной работы – изучение специальных подпрограмм библиотеки MASM32.lib организации ввода-вывода для консольного режима, изучение команд обработки строк для организации циклической обработки. Предмет исследования § Структура программы на языке ассемблера. § Арифметические команды. § Задание переменных. § Организация ввода-вывода данных. § Программа решения задачи в виде консольного приложения. Контрольные вопросы 1. Структура программы на ассемблере. 2. Назначение арифметических команд. 3. Назначение команд INC и DEC . 4. Типы форматов хранения чисел. 5. Назначение команд ADD и SUB. 6. Вспомогательные команды для арифметических вычислений. Задание к работе Создать консольную программу, которая определяет число вызовов таймера. В программе должны быть: § строка с сообщением «число вызовов таймера» § возможность задания координат и цвета сообщения. Цвет задаем, используя строки FOREGROUND_BLUE equ 1h ; синий цвет букв и далее. Чтобы сменить координаты выводимого сообщения, надо поменять числа в строках MOV CRD.X,10 и MOV CRD.Y,15. Таблица 1 - Варианты к заданию: № | Координаты сообщения | Цвет сообщения и фона | | X=5, Y=10 | 2h+8h | | X=15, Y=15 | 1h+8h | | X=10, Y=20 | 4h+8h | | X=5, Y=18 | 2h+80h | | X=19, Y=30 | 2h+40h | | X=12, Y=16 | 4h+10h | | X=35, Y=40 | 1h+40h | | X=0, Y=30 | 1h+80h | | X=28, Y=15 | 4h+20h | | X=17, Y=50 | 1h+20h | Пример выполнения программы в среде разработки RadASM ассемблер Masm32 Среда разработки RadASM представляет собой среду разработки программного обеспечения для ОС Windows, изначально предназначенную для написания программ на языке ассемблера. Имеет гибкую систему файлов настроек, благодаря чему может быть использована как среда разработки программного обеспечения на высокоуровневых языках, а также документов, основанных на языках разметки. Проект представляет собой набор файлов. В файле «Имя_проекта.rap» (расширение – rap) содержится информация о настройках проекта; файлах, входящих в проект. Помимо этого файла, проекта так же содержит файл «Имя_проекта.asm» (расширение – asm) – файл, содержащий основную часть программы. Так же могут входить дополнительные файлы. Главное окно программ при запуске выглядит следующим образом (рисунок 1).  Окно программы содержит несколько областей: панель меню; панель инструментов; рабочую область; обозреватель проектов; свойство проекта и так далее, которые можно настроить при необходимости. Для создания нового проекта необходимо зайти в меню «Файл» и выбрать пункт «Новый проект» (рисунок 2).  Рисунок 2 – Окно пункта меню «Файл» В выпадающем списке «Ассемблер» необходимо выбрать строку «masm» (рисунок 3). Тип проекта – «Console App». Ввести имя проекта. Имя проекта должно содержать ОДНО СЛОВО БЕЗ ПРОБЕЛОВ. При необходимости ввести описание. По умолчанию проекты сохраняются в папке «radasm\Masm\Projects», где radasm – имя папки, содержащий среду. Необходимости указать местоположение проекта на диске D:\\... Нажать кнопку «Next >».  Рисунок 3 – Выбор типа проекта Далее необходимо выбрать базовый шаблон проекта (рисунок 4). Шаблоны находятся в папке «radasm\Masm\Templates\». В шаблоне уже прописан базовый код, общий для всех проектов и необходимые настройки компилятора и отладчика. После создания проекта, в редакторе будет загружена программа (рисунок 5). В данной лабораторной работе не используется шаблон (Нажимаем «Next >».)  Рисунок 4 – Выбор шаблона проекта Предпоследнее окно Мастера предлагает выбрать типы создаваемых файлов – выбираем Asm (исходные файлы ассемблера), и папки – выбираем папку Bak, используемую для размещения предыдущих копий файлов (рисунок 5).  Рисунок 5 – Выбор типов файлов и папок Последнее окно Мастера определяет доступные для работы с проектом пункты меню запуска приложения Создать и выполняемые команды. В данной сборке выполняемые команды уже настроены, поэтому в нем можно ничего не менять, хотя использоваться будут не все пункты созданного меню, а только следующие: Assemble (транслировать или, точнее, ассемблировать), Link (компоновать), Run (выполнить) и Run w/Debug (выполнить в подключенном отладчике).  Рисунок 6 – Пункты меню запуска приложения В результате будет получена пустая заготовка консольного приложения Windows. Просмотреть эту заготовку можно, дважды щелкнув левой клавишей мыши по файлу *.asm в окне навигатора Project, расположенном справа вверху. Создать консольную программу, которая выводит на экран «Число вызовов таймера». Листинг программы находится в разделе приложения (Приложение 3) Опишем кратко данную программу. В ней задаем тип процессора, модель памяти, константы. .386P Плоская модель памяти. .MODEL FLAT, STDCALL Константы. STD_OUTPUT_HANDLE equ -11 STD_INPUT_HANDLE equ -10 TIME_PERIODIC equ 1 Тип события. KEY_EV equ 1h MOUSE_EV equ 2h Задаются атрибуты выводимого сообщения - цвет текста FOREGROUND_BLUE equ 1h ;Синий цвет букв. FOREGROUND_INTENSITY equ 8h ;Повышенная интенсивность BACKGROUND_BLUE equ 10h ;Синий цвет фона. BACKGROUND_INTENSITY equ 80h ;Повышенная интенсивность COL1 = 4h+8h ; Изменение цвета текста. Описываем прототипы внешних процедур в программе. EXTERN WriteConsoleA@20:NEAR; - запись данных в консоль EXTERN SetConsoleCursorPosition@8:NEAR; - позиция курсора EXTERN SetConsoleTitleA@4:NEAR; - получение заголовка окна консоли EXTERN CharToOemA@8:NEAR; - перекодировка текста EXTERN ExitProcess@4:NEAR;- завершение процесса работы программы EXTERN SetConsoleTextAttribute@8:near EXTERN FreeConsole@0:near EXTERN timeSetEvent@20:near EXTERN AllocConsole@0:near EXTERN ReadConsoleA@20:near EXTERN timeKillEvent@4:near EXTERN wsprintfA:near EXTERN GetStdHandle@4:near EXTERN SetConsoleScreenBufferSize@8:near Директивы подключения библиотек includelib kernel32.lib includelib user32.lib includelib winmm.lib Задаем координаты структуры COOR STRUC X WORD ? Y WORD ? COOR ENDS Сегмент данных, в нем описываем выводимые на экран сообщения, тип данных, количество символов, координаты сообщения. _DATA SEGMENT DWORD PUBLIC USE32 'DATA' HANDL DWORD ? HANDL1 DWORD ? STR2 DB "Пример таймера в консольном приложении" STR3 DB 100 dup(0) FORM DB "Numbers of Time Call: %lu",0 BUF DB 200 dup(?) NUM DWORD 0 LENS DWORD ? CRD COOR <?> ID DWORD ? HWND DWORD ? _DATA ENDS ;В сегменте кода создаем новую консоль, заголовок окна _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ;Создание новой консоли CALL FreeConsole@0 CALL AllocConsole@0 push STD_INPUT_HANDLE CALL GetStdHandle@4 MOV HANDL1,eax push STD_OUTPUT_HANDLE CALL GetStdHandle@4 MOV HANDL, EAX ;Установка имени консоли PUSH OFFSET STR2 PUSH OFFSET STR2 CALL CharToOemA@8 PUSH OFFSET STR2 CALL SetConsoleTitleA@4 ;Задаем цветовые атрибуты и устанавливаем таймер push COL1 PUSH HANDL CALL SetConsoleTextAttribute@8 PUSH TIME_PERIODIC ;Задаем процедуру для таймера, точность вызова таймера, его вызов через секунду PUSH 0 PUSH offset TIME PUSH 0 PUSH 1000 CAll timeSetEvent@20 MOV ID,EAX CALL TIME ;Вызов таймера на экран, закрытие таймера и консоли после нажатия Enter PUSH 0 PUSH offset LENS PUSH 200 PUSH offset BUF PUSH HANDL1 CAll ReadConsoleA@20 PUSH ID CALL timeKillEvent@4 CALL FreeConsole@0 PUSH 0 CALL ExitProcess@4 ;Процедура определения длины строки. ;Строка - [EBP+08H]. ;Длина в ЕВХ LENSTR PROC ENTER 0,0 PUSH EAX ;---------------------- CLD MOV EDI,DWORD PTR [EBP+08H] MOV EBX,EDI MOV ECX,100 XOR AL,AL REPNE SCASB SUB EDI,EBX MOV EBX,EDI DEC EBX ;---------------------- POP EAX LEAVE RET 4 LENSTR ENDP ;Процедура, вызываемая таймером. TIME PROC PUSHA ;Сохранить все регистры. ;Установка позиции курсора. MOV CRD.X,10 MOV CRD.Y,20 PUSH CRD PUSH HANDL CALL SetConsoleCursorPosition@8 ;Заполнение строки STR3. PUSH NUM PUSH OFFSET FORM PUSH OFFSET STR3 CALL wsprintfA ADD ESP,12 ;Перекодировка строки STR3. PUSH OFFSET STR3 PUSH OFFSET STR3 CALL CharToOemA@8 ;Вывод строку с номером вызова таймера. PUSH OFFSET STR3 CALL LENSTR PUSH 0 PUSH OFFSET LENS PUSH EBX PUSH OFFSET STR3 PUSH HANDL CALL WriteConsoleA@20 INC NUM POPA RET 20 TIME ENDP _TEXT ENDS END START После отладки и запуска программы получаем результат.  |