Мегаобучалка Главная | О нас | Обратная связь


ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 4



2016-01-02 387 Обсуждений (0)
ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 4 0.00 из 5.00 0 оценок




1. Структура программы. Создание главного окна.

Программа, написанная на ассемблере MASM, может состоять из нескольких частей, называемых модулями, в каждом из которых могут быть определены один или несколько сегментов данных, стека и кода. Любая законченная программа на ассемблере должна включать один главный, или основной (main), модуль, с которого начинается ее выполнение. Основной модуль может содержать программные сегменты, сегменты данных и стека, объявленные при помощи упрощенных директив. Кроме того, перед объявлением сегментов нужно указать модель памяти при помощи директивы .MODEL. Поскольку подавляющее большинство современных приложений являются 32-разрядными, то основное внимание в этом разделе мы уделим именно таким программам, хотя не обойдем вниманием и 16-разрядные программы, которые все еще используются. Начнем с 16-разрядных программ.

В следующем примере показана 16-разрядная программа на ассемблере, в которой используются упрощенные директивы ассемблера MASM:

.model small, c ; эта директива указывается до объявления ; сегментов.stack 100h ; размер стека 256 байт.data ; начало сегмента данных. . .; данные. . ..code ; здесь начинается сегмент программmain:. . .; команды ассемблера. . .end mainend

Здесь оператор end main указывает на точку входа main в главную процедуру. Оператор end закрывает последний сегмент и обозначает конец исходного текста программы. В 16-разрядных приложениях MS-DOS можно инициализировать сегментные регистры так, чтобы они указывали на требуемый логический сегмент данных. Листинг 4.1 демонстрирует это.

Листинг 4.1. Пример адресации сегментов в программе MS-DOS

.model large.data s1 DB "TEST STRING$".code mov AX, @data mov DS, AX lea DX, s1 mov AH, 9h int 21h mov ax, 4c00h int 21hend

Здесь на экран дисплея выводится строка s1. При помощи следующих команд в сегментный регистр DS помещается адрес сегмента данных, указанного директивой .data:

mov AX, @datamov DS, AX

Затем строка s1, адресуемая через регистры DS:DX, выводится на экран с использованием прерывания 9h функции 21h MS-DOS. Попробуйте закомментировать проанализированные две строки кода и посмотреть на результат работы программы.

Для 32-разрядных приложений шаблон исходного текста выглядит иначе:

.model flat.stack.data; aaiiua.codemain:. . .; команды ассемблера. . .end mainend

Основное отличие от предыдущего примера — другая модель памяти (flat), предполагающая 32-разрядную линейную адресацию с атрибутом near.

Как видно из примера, “классический” шаблон 32-разрядного приложения содержит область данных (определяемую директивой .data), область стека (директива .stack) и область программного кода (директива .code). Может случиться так, что 32-разрядному приложению на ассемблере потребуется несколько отдельных сегментов данных и/или кода. В этом случае разработчик может создать их с помощью директивы SEGMENT. Директива SEGMENT определяет логический сегмент и может быть описана следующим образом:

имя SEGMENT список атрибутов. . .имя ENDS

Замечу, что директива SEGMENT может применяться с любой моделью памяти, не только flat. При использовании директивы SEGMENT потребуется указать компилятору на то, что все сегментные регистры устанавливаются в соответствии с моделью памяти flat. Это можно сделать при помощи директивы ASSUME:

ASSUME CS:FLAT, DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR

Регистры FS и GS программами не используются, поэтому для них указывается атрибут ERROR.

Сейчас мы рассмотрим программный код 32-разрядной процедуры на ассемблере (она называется _seg_ex), в которой используются два логических сегмента данных. Процедура выполняет копирование строки src, находящейся в сегменте данных data1, в область памяти dst в сегменте данных data2 и содержит один логический сегмент программного кода (code segment).

Успокою читателей, незнакомых с принципами работы процедур (они рассмотрены далее в книге): в данном случае нас будет интересовать код внутри процедуры _seg_ex (команды, находящиеся между директивами _seg_ex proc и _seg_ex endp). Исходный текст программного кода процедуры _seg_ex представлен в листинге 4.2.

Листинг 4.2. Использование двух логических сегментов данных в 32-разрядной процедуре

.586.model flat option casemap:nonedata1 segment src DB "Test STRING To Copy" len EQU $-srcdata1 endsdata2 segment public dst DB len+1 DUP('+')data2 endscode segment_seg_ex proc assume CS:FLAT,DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR mov ESI, offset data1 mov EDI, offset data2 cld mov CX, len rep movsb mov EAX, offset data2 ret_seg_ex endpcode endsend

При использовании модели flat доступ к данным осуществляется по 32-разрядному смещению, поэтому смысл показанных ниже команд, загружающих адреса логических сегментов (а заодно и адреса строк src и dst) в регистры ESI и EDI, думаю, понятен:

mov ESI, offset data1mov EDI, offset data2

Группа следующих команд выполняет копирование строки src в dst, при этом регистр CX содержит количество копируемых байтов:

cldmov CX, lenrep movsb

В регистре EAX возвращается адрес строки-приемника dst. Обращаю внимание читателей на то, что никакой инициализации сегментных регистров не требуется, поскольку это делается при помощи директивы .model flat. Еще один важный момент: программа, использующая модель flat, выполняется в одном физическом сегменте, хотя логических сегментов может быть несколько, как в нашем случае.

Работоспособность процедуры легко проверить, вызвав ее из программы на Visual C++ .NET (нужно только включить объектный файл процедуры в проект приложения). Исходный текст приложения приведен в листинге 4.3.

Листинг 4.3. Программа, вызывающая процедуру seg_ex

#include <stdio.h>extern "C" char* seg_ex(void);int main(void){ printf("EXTERNAL MODULE EXAMPLE: %s\n", seg_ex()); return 0;}

Здесь процедура seg_ex является внешней, поэтому объявлена как extern.

Результатом выполнения программы будет строка на экране дисплея

EXTERNAL MODULE EXAMPLE: Test STRING To Copy+

Первое окно, которое создает прикладная программа - обычно основное окно (main window). Вы создаете основное окно, используя функцию CreateWindowEx, которая определяет класс, имя, стили окна, размер, позицию, дескриптор меню, дескриптор экземпляра и данные для создания. Основное окно принадлежит определяемому приложением классу окна, таким образом, Вы должны зарегистрировать класс окна и предоставить оконную процедуру для класса перед созданием основного окна.

Большинство прикладных программ обычно использует для создания основного окна стиль WS_OVERLAPPEDWINDOW. Этот стиль дает окну заголовок, Системное меню (окна), рамку установки размеров, кнопки свертывание и развертывания окна. Функция CreateWindowEx возвращает дескриптор, который уникально идентифицирует окно.

Следующий пример создает основное окно, принадлежащее к классу окна определенному прикладной программой. Имя окна, "Основное Окно", появится в строке заголовка окна. Объединяя стилиWS_VSCROLL и WS_HSCROLL со стилем WS_OVERLAPPEDWINDOW, прикладная программа создает основное окно с горизонтальными и вертикальными линейками прокрутки в дополнение к компонентам, предоставляемым стилем WS_OVERLAPPEDWINDOW. Четырехкратное повторение константы CW_USEDEFAULT устанавливает начальный размер и позицию окна в значения, определенные системой по умолчанию. Устанавливая значение ПУСТО (NULL), вместо дескриптора меню, окно получит меню, определенное для класса окна.



2016-01-02 387 Обсуждений (0)
ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 4 0.00 из 5.00 0 оценок









Обсуждение в статье: ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 4

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (387)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)