МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар.

Пример выполнения программы в среде разработки 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

 

 

После отладки и запуска программы получаем результат.

 





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.