Программирование на Ассемблер к.т.н., доц. Красов А.В. Лекция 3 ФакультетМТС Курс3 Семестр6 Форма контролязачет Лекции14 часов Лабораторные работы12 часов к.т.н., доцент Красов Андрей Владимирович директор УИЦ ИТТ, доцент кафедры ИБТС Куратор специальности «Защищенные системы связи» Автор курса
Машинная команда представляет собой закодированную информацию о выполняемом процессором действии. Структура машинной команды приведена на рис Префиксы – необязательные элементы машинной команды, модифицирующие выполнение машиной команды. Префикс повторения позволяет организовать цепочное исполнение команд; префикс размера адреса позволяет менять разрядность (16 или 32 разрядов); префикс размера оператора позволяет менять размер оператора (16 или 32 разряда); префикс замены сегмента позволяет сменить сегменты; Код операции – обязательный элемент машинной команды, обозначающий выполняемое действие. Байт режима адресации modr/m – определяет режим работы с адресом. Поле mod на рис.3.1, определяет количество байт адреса. Возможные значения поля mod приведены в табл.3.1. Рис.3.1. Структура машинной команды Структура машинной команды
ЗначениеОписание 00 Смещение не используется, адрес определяется содержимым базового и индексного регистров. 01 Смещение имеет размер 1 байт. 10 Смещение имеет размер 2 или 4 байта (в зависимости от режима). 11 Память не используется, все операторы размещаются в регистрах или заданы числовыми значениями. Таблица 3.1. Значения поля mod Поле reg/коп определяет содержимое первого операнда, это может быть либо регистр, либо продолжение кода операции. Поле r/m используется совместно с полем mod и определяет использование первого операнда, который может быть либо регистром, либо использоваться для вычисления эффективного адреса (при значении mod=11). Байт sib – используется для задания адресов операторов. При этом поля mod и b r/m имеют следующие значения mod=01 или mod=10, r/m=100. Поля байта sib имеют следующие значения: ss – масштабный множитель для индексного регистра, возможные значения 1, 2, 4 или 8; index – номер регистра используемого в качестве индексного; base – номер базового регистра. Поле смещения в команде – 8, 16 или 32 разрядное значение адреса операнда. Непосредственный операнд – 8, 16 или 32 разрядное числовое значение. Способы задания операндов Неявный способ – команда работает с конкретными, уже заранее известными операндами или регистрами. Непосредственный операнд – операнд находится в самой команде, см. выше. Регистровый операнд – операнд размещается в одном из регистров процессора. Размещение операнда в памяти – в качестве адреса используется адрес ячейки памяти. Порт ввода/вывода – в качестве операнда выступает адрес ячейки памяти выделенной для обмена с внешними устройствами, например LPT, COM. Стек – в качестве операнда выступает стек.
Относительная прямая адресация – эффективный адрес формируется как сумма содержания операнда программы и регистра указателя команд ip/eip. Например, переход на указанное количество операторов, относительно текущей команды. Абсолютная прямая адресация – эффективный адрес содержится в поле операнда. Косвенная адресация – адрес размещается в одном из регистров, например: [ecx] (имя регистра заключается в квадратные скобки). Классификация машинных команд Все машинные команды можно разбить на группы: Пересылки данных:Пересылки данных: общего назначения;общего назначения; работа со стеком; преобразования типов. Арифметические:двоичные;десятичные. Логические: Логические:побитовые;сдвиг. Передачи управления: Передачи управления:безусловные;условные. Цепочные Цепочные Управление состоянием процессора: Управление состоянием процессора: работа с флагами; работа с системными регистрами. Способы адресации
Команды пересылки данных Пересылка данных – mov. Формат команды: mov Формат команды: mov Особенности команды mov: Команда mov не может непосредственно пересылать данные из одной области памяти в другую, для подобной пересылки необходимо воспользоваться одним из регистров.Команда mov не может непосредственно пересылать данные из одной области памяти в другую, для подобной пересылки необходимо воспользоваться одним из регистров. Нельзя загрузить в сегментный регистр значение непосредственно из памяти. Нельзя переслать содержимое одного сегментного регистра в другой. Нельзя использовать сегментный регистр cs в качестве операнда назначения (в данном регистре содержится адрес следующей команды, изменение его значения приведет к сбою работы программы). Примечание: При пересылки данных необходимо не забывать о типе переменных, для преобразования типов используется оператор ptr. Обмен данными – xchg. Формат команды: xchg Формат команды: xchg Команда cxhg позволяет поменять данные. Обмениваемые данные должны иметь один тип, не допускается обмен содержимого двух ячеек памяти.
Команды работы с портам ввода/вывода Работу оборудованием компьютера можно представить в виде изображенном на рис Рис Работа программы с аппаратурой компьютера Для взаимодействия с аппаратурой компьютера в адресном пространстве выделен определенный диапазон адресов, называемых портами ввода/вывода. Программа может организовать взаимодействие с аппаратурой одним из трех способов, представленных на рис В данном курсе рассматривается работа программы с аппаратурой непосредственно через порты ввода/вывода. Для работы с портами предусмотрены команды: in in out out
i8255Порт 61hi8255Порт 61h В качестве примера работы с портами приведем организацию работы встроенного динамика. Для генерации звука используется микросхема таймера i8253 и программируемого периферийного интерфейса i8255. Таймер имеет три канала, построенных по одинаковому принципу. На таймер подаются импульсы с частотой 1.19 МГц с системных часов. Выходы каждого из каналов подключены к соответствующим устройствам компьютера. Канал 0 подается на контроллер прерываний и является источником аппаратного прерывания от таймера, возникающего 18.2 раз в секунду. Канал 1 является источником служебных сигналов для контроллера прямого доступа к памяти. Рассматриваемый нами канал 2, подключен к динамику. Служебные регистры каждого канала имеют следующие характеристики: регистр ввода/вывода – 8 разрядов; регистр защелка и регистр счетчик – по 16 разрядов. Значение, записанное в регистр ввода/вывода (порт 42h), сразу же переписывается в регистр-защелку, значение которого сохраняется неизменным до следующего обращения.
Из рис. 3.2 видно, что динамик будет издавать звук если установлены соответствующие значения битов по адресу 61h и значение счетчика count=0. Для программирования звука необходимо проделать следующие действия: Занести в порт 43h режим работы и тип операции передачи значения в канал, например – (0b6h). Подать ток на динамик, для этого необходимо установить бит 1 порта 61h. Через служебный регистр записать значение в порт 42h, определяющие высоту тона. Режим переноса определяется значением регистра состояния (порт 43h). Назначение битов регистра представлены на рис. 3.3.
При разработки программ на ассемблере часто приходится работать с адресами переменных. Для поддержки данных операций создана группа команд: lea назначение, источник lds назначение, источник les назначение, источник lgs назначение, источник lfs назначение, источник lss назначение, источник Загрузка эффективного адреса - lea. Команда lea записывает эффективный адрес регистр назначение. Загрузка полного адреса. Команды lds, les, lfs и lss позволяют получить полный адрес переменный. Полный адрес переменной, состоящий из сегментной части и смещения, размещается в указанной паре регистров. Назначение команд загрузки полного адреса представлено в табл.3.2. Работа с адресами и указателями Таблица 3.2. Назначение команд загрузки полного адреса Команда xalt. Функция xalt замещает значение в регистре al байтом из таблицы. Номер элемента таблицы определяется старым значением al. Формат команды: xalt [адрес таблицы] Адрес таблицы должен быть предварительно загружен в регистр bx (с помощью команды lea). Максимальная длинна таблицы – 256 байт. Подстановка данных из таблицы
Для работы со стеком выделяются следующие регистры: ss – сегментный регистр; sp/esp – Регистр указателя стека; bp/ebp – регистр указателя базы кадра. Максимальный размер стека 64Кбайт. Принцип работы стека иллюстрируется на рис Работа со стеком Для работы со стеком есть следующие команды. Записать значение в стек: push. Формат команды: push Формат команды: push Команда push помещает значение в стек, при этом указатель ss:sp уменьшается на 2. Прочитать значение из стека: pop. Формат команды: pop Формат команды: pop Команда pop извлекает значение из стека и записывает его по указанному адресу, при этом указатель ss:sp увеличивается на 2. Записать в стек все регистры: pusha. По команде pusha в стек последовательно заносятся значение регистров ax, cx, dx, bx, sp, bp, si, di. Заносимое в стек значение регистра sp соответствует значению указателя до выполнения команды push. Значение указателя сдвигается после помещения значений регистров в стек. Записать в стек все регистры: pushw. В отличие от команды pusha, команда работает с регистрами размером в одно машинное слово не зависимо от разрядности модели памяти. При модели памяти use16 команды pusha и pushw полностью идентичны. Извлечь значение регистров из стека: popa и popw. Команды popa и popw позволяют извлечь значения регистров из стека. Сохранить значение регистра флагов: pushf и pushfw. Команды pushf и pushfw позволяют сохранить в стеке содержимое регистра флагов. Извлечь из стека значение регистра флагов: popf и popfw. Команды popf и popfw позволяют извлечь из стека значение регистра флагов.