
- •6. Лекция. Язык программирования ассемблер ia-32 (Intel Architecture -32bit)
- •6. Язык программирования ассемблер ia-32
- •6.1. Структура программы на языке ассемблер
- •6.2. Директивы языка ассемблера ia-32
- •6.2.1. Псевдокоманды определения переменных
- •6.2.2. Организация программы
- •6.3. Управление потоком выполнения программы
- •6.3.1. Условные переходы и флаги кодов условий
- •6.3.2. Команды сравнения
- •6.3.3. Безусловный переход
- •6.4. Логические команды, команды сдвига и циклического сдвига
- •6.4.1. Логические операции
- •6.4.2. Операции сдвига и циклического сдвига
- •6.4.3. Программа упаковки цифр
- •6.5. Другие команды
- •6.5.1. Вычитание
- •6.5.2. Команды умножения и деления
- •Imul reg,src(исходный)
- •Imul src и mul src
- •Idiv src и div src
- •6.5.3. Команды мультимедийного расширения
- •6.5.4. Векторные команды
- •6.6. Подпрограммы
- •6.6.1. Вложенность подпрограмм и стек процессора
- •6.6.2. Организация стека
- •6.6.3. Передача параметров
- •6.7. Примеры программ
- •6.7.1. Программа для вычисления скалярного произведения двух векторов
- •6.7.2. Программа сортировки байтов
- •6.7.3. Подпрограммы для вставки и удаления элементов связного списка
- •6.8. Различия между программами в ехе - и сом - файлах
- •6.8.1. Пример программы типа сом
- •6.8.2. Пример программы типа ехе
6. Лекция. Язык программирования ассемблер ia-32 (Intel Architecture -32bit)
Структура программы на языке ассемблер
Директивы языка ассемблера IA-32
Псевдокоманды определения переменных
Организация программы
Управление потоком выполнения программы
Условные переходы и флаги кодов условий
Команды сравнения
Безусловный переход
Логические команды, команды сдвига и циклического сдвига
Логические операции
Операции сдвига и циклического сдвига
Программа упаковки цифр
Другие команды
Вычитание
Команды умножения и деления
Команды мультимедийного расширения
Векторные команды
Подпрограммы
Вложенность подпрограмм и стек процессора
Организация стека
Передача параметров
Примеры программ
Программа для вычисления скалярного произведения двух векторов
Программа сортировки байтов
Подпрограммы для вставки и удаления элементов связного списка
Различия между программами в ЕХЕ - и СОМ - файлах
Пример программы типа СОМ
Пример программы типа ЕХЕ
Список литературы по разделу «Ассемблер»
6. Язык программирования ассемблер ia-32
Каждая программа на языке ассемблера помимо команд процессора содержит еще и специальные инструкции, указывающие самому ассемблеру, как организовывать различные секции программы, где располагаются данные, а где команды, позволяющие создавать макроопределения, выбирать тип используемого процессора, организовывать связи между процедурами и т.д. К сожалению, пока нет единого стандарта на эти команды (он существует для UNIX). Разные ассемблеры используют различные наборы директив, но TASM и MASM (два самых популярных ассемблера для DOS и Windows) поддерживают общий набор.
6.1. Структура программы на языке ассемблер
Программа на языке ассемблера состоит из строк, имеющих следующий вид:
метка команда/директива операнды ;комментарий
Причем все эти поля необязательны. Метка может быть любой комбинацией букв английского алфавита, цифр и символов _, $, @, ?, но цифра не может быть первым символом метки, а символы $ и ? иногда имеют специальные значения и обычно не рекомендуются к использованию. Большие и маленькие буквы по умолчанию не различаются, но различие можно включить, задав ту или иную опцию в командной строке ассемблера. Во втором поле, поле команды, может располагаться команда процессора, которая транслируется в исполняемый код, или директива, которая не приводит к появлению нового кода, а управляет работой самого ассемблера. В поле операндов располагаются требуемые командой или директивой операнды (то есть нельзя указать операнды и не указать команду или директиву). И наконец, в поле комментариев, начало которого отмечается символом ; (точка с запятой), можно написать все что угодно — текст от символа «;» до конца строки не анализируется ассемблером.
Для облегчения читаемости ассемблерных текстов принято:
метка начинается на первой позиции в строке,
команда — на 17-й (две табуляции),
операнды — на 25-й (три табуляции) и
комментарии — на 41-й или 49-й. Если строка состоит только из комментария, его начинают с первой позиции.
Если метка располагается перед командой процессора, сразу после нее всегда ставится символ «:» (двоеточие), который указывает ассемблеру, что надо создать переменную с этим именем, содержащую адрес текущей команды:
some_loop:
lodsw ;cчитать слово из строки, (строка в буфере данных)
cmp ax,7 ; если это 7 - выйти из цикла
jne some_loop
Когда метка стоит перед директивой ассемблера, она обычно оказывается одним из операндов этой директивы и двоеточие не ставится. Рассмотрим директивы, работающие напрямую с метками и их значениями, — LABEL, EQU и =.
метка label тип
Директива LABEL определяет метку и задает ее тип. Тип может быть одним из:
BYTE (байт),
WORD (слово),
DWORD (двойное слово),
FWORD (6 байт),
QWORD (учетверенное слово),
TBYTE (10 байт),
NEAR (ближняя метка),
FAR (дальняя метка).
Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. В зависимости от типа команда
mov метка,0
запишет в память байт (слово, двойное слово и т.д.), заполненный нулями, а команда
call метка
выполнит ближний или дальний вызов подпрограммы.
С помощью директивы LABEL удобно организовывать доступ к одним и тем же данным, как к байтам, так и к словам, определив перед данными две метки с разными типами.
метка equ выражение
Директива EQU присваивает метке значение, которое определяется как результат целочисленного выражения в правой части. Результатом этого выражения может быть целое число, адрес или любая строка символов:
truth equ 1
message1 equ 'Try again$'
var2 equ [si]
cmp ax,truth ; cmp ax,1
db message1 ; db 'Try again$'
mov ax,var2 ; mov ax, [si]
Директива EQUчаще всего используется с целью введения параметров, общих для всей программы, аналогично команде #define препроцессора языка С.
метка = выражение
Директива = эквивалентна EQU, но определяемая ею метка может принимать только целочисленные значения. Кроме того, метка, указанная этой директивой, может быть переопределена.
Каждый ассемблер предлагает целый набор специальных предопределенных меток — это может быть текущая дата (@date или ??date), тип процессора (@cpu) или имя того или иного сегмента программы