Чтение онлайн

на главную - закладки

Жанры

Ассемблер для процессоров Intel Pentium

Магда Юрий

Шрифт:

 

Немного о терминологии. В дальнейшем термины «подпрограмма» и «процедура» будут использоваться как синонимы (процедура является одной из форм реализации подпрограммы). Везде в этой главе и далее будем считать термины «подпрограмма» и «процедура» тождественными и полагать, что оба они представляют группу команд, заключенных между директивами ргос и endp. По отношению к подпрограмме, или процедуре, остальную часть программы принято называть основной или вызывающей программой. Эта глава посвящена принципам разработки подпрограмм (процедур) на языке ассемблера.

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

Существует еще один способ использования автономных подпрограмм, который нередко применяется в 32-разрядных приложениях Windows: можно создать библиотеку динамической компоновки (Dynamic Link Library, DLL), поместив в нее программный код процедуры. В этом случае основная программа сможет определенным образом получить доступ к процедуре, находящейся в DLL. Создание и функционирование DLL тесно связано с архитектурой операционных систем Windows, что само по себе является отдельной темой, поэтому ограничимся рассмотрением классического варианта применения подпрограмм с использованием объектных файлов.

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

6.1. Организация стека

Стек представляет собой специальную область памяти, которая служит для временного хранения данных и адресов. Для адресации стека используются регистры SS : SP (16-разрядные приложения) и SS:ESP (32-разрядные программы). Регистр SP (ESP) называется указателем стека и содержит 16– или 32-разрядный адрес последнего элемента, помещенного в стек. Последнее значение, помещенное в стек, извлекается первым. Подобная структура называется LIFO (Last In, First Out – прибыл последним, обслужен первым). Стек растет к меньшим адресам, то есть последнее значение, поступившее в стек, хранится по наименьшему адресу.

Несмотря на то что память в процессорах х86 имеет байтовую организацию, минимальный размер операнда, которым оперируют команды стековых операций, равен слову (2 байта). По этой причине данные в стеке отстоят друг от друга на величину, кратную двум. Например, при помещении в стек слова значение указателя стека SP (ESP) уменьшается на 2, при помещении двойного слова – на 4 и т. д. При этом младшие байты операндов помещаются в стек по младшим адресам, а старшие байты – по старшим адресам.

Для того чтобы поместить какое-либо значение в стек, нужно использовать команду push. Эта команда в качестве параметра может принимать любой 16– или 32-разрядный регистр либо ячейку памяти. При этом содержимое указателя стека SP (ESP) уменьшается на 2 (для слова) или на 4 (для двойного слова). Команда допускает один из форматов:

push regl6/reg32

push meml6/mem32

push segreg

push immed

Здесь reg16/reg32 – один из 16– или 32-разрядных регистров, тет16/тет32 – переменная в памяти (16 или 32 разряда), segreg – один из сегментных регистров (CS, DS, ES), a immed – непосредственное значение. Команда push с непосредственным операндом (immed) в процессорах Intel Pentium недопустима.

Существуют специальные модификации команды push. Так, например, для сохранения 16-разрядного регистра флагов процессора в стеке используется команда pushf, a для сохранения 32-разрядного регистра флагов – команда pushfd. Последняя команда присутствует только в процессорах, начиная с 80386. Наконец, существуют специальные форматы команды push, позволяющие сохранить в стеке все регистры процессора:

– pusha – помещает в стек все 16-разрядные регистры (АХ, ВХ, СХ, DX, SP, BP, s1 , DI);

– pushad – помещает в стек все 32-разрядные регистры (ЕАХ, ЕВХ, ЕСХ, EDX, ESP, EBP, ESI, EDI).

Приведу несколько примеров использования команды push и ее модификаций.

Предположим, что в стеке находится единственное значение, равное 7EE3h (рис. 6.1).



Рис. 6.1. Начальное состояние стека


Выполним команды

mov BX, 2CE9h

push BX

Команда push в этом фрагменте программного кода копирует содержимое регистра ВХ в стек, при этом содержимое регистра SP уменьшается на 2 и стек начинает выглядеть так, как показано на рис. 6.2.



Рис. 6.2. Состояние стека после выполнения команды push BX


Напомню, что минимальная размерность данных, которыми оперирует стек, равна 16 бит, поэтому содержимое регистра SP (ESP) не может увеличиться или уменьшиться на 1. Это означает, что нельзя поместить в стек или извлечь из стека данные размером в 1 байт. Указатель стека увеличивается (уменьшается) на 2 или 4 (для слова или двойного слова соответственно). Например, после выполнения следующего фрагмента кода содержимое стека будет таким, как показано на рис. 6.3:



Рис. 6.3. Размещение двойного слова в стеке


После этой операции указатель стека уменьшается на 4, поскольку в него помещается двойное слово.

Извлечение данных из стека выполняется с помощью команды pop. При этом из стека извлекается слово (двойное слово) и помещается в указанный операнд. Эта команда в качестве параметра может принимать любой 16– или 32-разрядный регистр или ячейку памяти. При этом содержимое указателя стека SP (ESP) увеличивается на 2 (для слова) или на 4 (для двойного слова).

Команда pop является зеркальной по отношению к push и использует те же типы операндов, что и команда push. Кроме того, для извлечения содержимого регистра флагов из стека имеются команды popf (для 16-разрядного регистра флагов) и popfd (для 32-разрядного). Для того чтобы восстановить все регистры процессора значениями из стека, в систему команд включены инструкции рора (для 16-разрядных регистров) и popad (для 32-разрядных). Например, следующая команда извлекает данные, помещенные в стек в предыдущем примере, и запоминает их в регистре EDX:

pop EDX

После выполнения этой команды регистр EDX будет содержать значение 4FE91A77h, a указатель стека уменьшится на 4 (рис. 6.4).



Рис. 6.4. Содержимое стека после выполнения команды pop EDX


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

Поделиться:
Популярные книги

Старый, но крепкий 4

Крынов Макс
4. Культивация без насилия
Фантастика:
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 4

Чистильщик

Мазин Александр Владимирович
Детективы:
боевики
6.56
рейтинг книги
Чистильщик

Смертельный танец

Гамильтон Лорел Кей
6. Анита Блейк
Фантастика:
ужасы и мистика
9.29
рейтинг книги
Смертельный танец

Воронцов. Перезагрузка. Книга 3

Тарасов Ник
3. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 3

Эпоха Опустошителя. Том IV

Павлов Вел
4. Вечное Ристалище
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эпоха Опустошителя. Том IV

Виконт. Книга 1. Второе рождение

Юллем Евгений
1. Псевдоним `Испанец`
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.43
рейтинг книги
Виконт. Книга 1. Второе рождение

Осень 1943 года

Антонова Людмила Викторовна
15. Летопись Победы. 1443 дня и ночи до нашей Великой Победы во Второй мировой войне
Научно-образовательная:
история
cпецслужбы
военная история
5.00
рейтинг книги
Осень 1943 года

Вечный. Книга VII

Рокотов Алексей
7. Вечный
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Вечный. Книга VII

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Безмолвная

Герритсен Тесс
9. Джейн Риццоли и Маура Айлс
Детективы:
триллеры
8.81
рейтинг книги
Безмолвная

Дневники св. Николая Японского. Том V

Японский Николай
Религия и эзотерика:
православие
христианство
религия
5.00
рейтинг книги
Дневники св. Николая Японского. Том V

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.41
рейтинг книги
Сборник коротких эротических рассказов

Неучтенный элемент. Том 8

NikL
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 8

Базис

Владимиров Денис
7. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Базис