Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура компьютеров / 6_Ассемблер-IA-32.doc
Скачиваний:
62
Добавлен:
20.03.2015
Размер:
593.92 Кб
Скачать

6. Лекция. Язык программирования ассемблер ia-32 (Intel Architecture -32bit)

    1. Структура программы на языке ассемблер

    2. Директивы языка ассемблера IA-32

      1. Псевдокоманды определения переменных

      2. Организация программы

    3. Управление потоком выполнения программы

      1. Условные переходы и флаги кодов условий

      2. Команды сравнения

      3. Безусловный переход

    4. Логические команды, команды сдвига и циклического сдвига

      1. Логические операции

      2. Операции сдвига и циклического сдвига

      3. Программа упаковки цифр

    5. Другие команды

      1. Вычитание

      2. Команды умножения и деления

      3. Команды мультимедийного расширения

      4. Векторные команды

    6. Подпрограммы

      1. Вложенность подпрограмм и стек процессора

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

      3. Передача параметров

    7. Примеры программ

      1. Программа для вычисления скалярного произведения двух векторов

      2. Программа сортировки байтов

      3. Подпрограммы для вставки и удаления элементов связного списка

    8. Различия между программами в ЕХЕ - и СОМ - файлах

      1. Пример программы типа СОМ

      2. Пример программы типа ЕХЕ

Список литературы по разделу «Ассемблер»

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) или имя того или иного сегмента программы

Соседние файлы в папке Архитектура компьютеров