Машинно-ориентированное программирование

Машинно-ориентированное программирование


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


Содержание

Термины

Регистры процессора

Директивы

Ограничения на использование режимов адресации

Команды


Термины

Физический адрес – это номер каждого байта, его уникальный адрес.

Сегмент – это независимый, поддерживаемый на аппаратном уровне, блок памяти.

База – это хранилище адреса оперативной памяти.

Флаг – это бит, принимающий значение 1, если выполнено некоторое условие, и значение 0 в противном случае.

Метка – это символьное имя, обозначающее ячейку памяти, которая содержит некоторую команду.

Стек – это область памяти, специально выделяемая для временного хранения данных программы.

Прерывание – это временное прекращение основного процесса вычислений для выполнения некоторых запланированных или незапланированных действий, вызванных работой устройств или программы.

Содержание

Регистры процессора

Всего процессор содержит 12 программно-доступных регистров, а также регистр флагов и указатель команд.

Регистры общего назначения

Регистры общего назначения используются для хранения данных и выполнения различных арифметических и логических операций.

  • eax (Accumulator) – универсальный аккумулятор значений.
  • ebx (Base) – хранение базового адреса.
  • ecx (Counter) – регистр-счетчик.
  • edx (Data) – хранение промежуточных данных.

Данные регистры являются 32-разрядными и делятся на две части по 16 бит, старшая часть не доступна, а младшая (ax, bx, cx, dx) тоже делится на две части по 8 бит (ah, al, bh, bl, ch, cl, dh, dl). Младшие части регистров имеют в названии букву L (от слова Low), а старшие H (от слова High).

Индексные регистры

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

  • esi (Source Index) – индекс источника.
  • edi (Destination Index) – индекс приёмника.

Данные регистры являются 32-разрядными и имеют младшие 16-разрядные части (si и di).

Регистры-указатели

Регистры-указатели используются для работы со стеком.

  • ebp (Base Pointer) – указатель базы.
  • esp (Stack Pointer) – указатель вершины.

Данные регистры являются 32-разрядными и имеют младшие 16-разрядные части (bp и sp).

Сегментные регистры

Сегментные регистры предназначены для обеспечения сегментной адресации.

  • cs (Code Segment) – сегмент кода.
  • ds (Data Segment) – сегмент данных.
  • ss (Stack Segment) – сегмент стека.
  • es (Enhanced Segment) – дополнительный сегмент данных.

Данные регистры являются 16-разрядными.

Управляющие регистры

  • eip (Extended Instruction Pointer) – смещение следующей подлежащей выполнению команды относительно начала сегмента кода.

Данный регистр 32-разрядный, имеет младшую 16-разрядную часть (ip).

Регистры флагов

Регистр флагов содержит отдельные биты: флаги управления и признаки результата.

Примечание. Ниже представлены не все флаги.

Флаги управления

  • df (Direction) – флаг направления. Управляет направлением обработки строк данных.
    0 – от младших адресов к старшим.
    1 – от старших адресов к младшим.

Флаги состояния

  • cf (Carry) – флаг переноса. Идентифицирует перенос или заем при выполнении арифметических операций, а также служит индикатором ошибки при обращении к системным функциям.
    0 – переноса или заема не было.
    1 – арифметическая операция произвела перенос или заем из старшего бита результата.
  • zf (Zero) – флаг нулевого результата.
    0 – результат ненулевой.
    1 – результат нулевой.
  • sf (Sign) – флаг знака. Отражает состояние старшего бита результата.
    0 – старший бит результата равен 0 (результат положительный).
    1 – старший бит результата равен 1 (результат отрицательный).
  • of (Overflow) – флаг переполнения. Используется для фиксирования факта потери значащего бита при арифметических операциях.
    0 – в результате операции не происходит переноса(заема) в(из) старшего, знакового бита результата.
    1 – в результате операции происходит перенос(заем) в(из) старшего, знакового бита результата.

Системные флаги

  • if (Interrupt) – флаг прерывания. Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний.
    0 – аппаратные прерывания запрещены.
    1 – аппаратные прерывания разрешены.

Содержание

Директивы

В языке ассемблера директивы указывают общую информацию.

Директивы объявления данных

Формат директив:

имя директива операнд

Примечание. Если операндов несколько, то они перечисляются через запятую.
  • db (Byte) – резервирование памяти для данных размером 1 байт.
    Со знаком: (-128; 127). Без знака: (0; 255).
  • dw (Word) – резервирование памяти для данных размером 2 байта.
    Со знаком: (-32 768; 32 767). Без знака: (0; 65 535).
  • dd (Doubleword) – резервирование памяти для данных размером 4 байта.
  • df и dp – резервирование памяти для данных размером 6 байт.
  • dq (Quadword) – резервирование памяти для данных размером 8 байт.
  • dt – резервирование памяти для данных размером 10 байт.
Примечание. Знак ? на месте операнда означает резервирование данных.

Директива определения модели памяти

Директива model связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами.

Синтаксис:

model модель памяти

Модели памяти

Примечание. Представлены не все модели памяти.
  • tiny. Тип кода: near. Тип данных: near. Весь код и все данные комбинируются в одну группу с именем DGROUP. Используется для программ формата .com. Во многих языках высокого уровня не поддерживается.
  • small. Тип кода: near. Тип данных: near. Код представляет собой один сегмент. Все данные комбинируются в группу с именем DGROUP. Эту модель обычно используют для большинства программ на ассемблере.

Упрощенные директивы определения сегмента

Примечание. Представлены не все упрощенные директивы определения сегмента.
  • .code [имя] – начало или продолжение сегмента кода.
  • .data – начало или продолжение сегмента инициализированных данных. Используется для определения данных типа near.
  • .const – начало или продолжение сегмента постоянных данных (констант) модуля. 
  • .stack [размер] – начало или продолжение сегмента стека модуля. Необязательный параметр [размер] задает размер стека.

Идентификаторы, создаваемые директивой model

Примечание. Представлены не все идентификаторы.
  • @code – физический адрес сегмента кода.
  • @data – физический адрес сегмента данных типа near.
  • @stack – физический адрес стека.

Содержание

Ограничения на использование режимов адресации

  1. Оба операнда должны иметь одинаковую длину.
  2. Оба операнда не могут одновременно быть памятью.
  3. Получатель не может быть регистром cs, ip, eip.
  4. Нельзя в сегментный регистр пересылать непосредственное значение.
  5. Приемником не может быть непосредственный режим адресации.

Содержание

Команды

Команды ассемблера делятся на 6 групп: команды пересылки данных, арифметические команды, логические команды, команды передачи управления, цепочечные команды и команды управления состоянием ЦП.

Примечание. Представлены не все команды.

Команды общего назначения

  • Команда mov
    Синтаксис: mov приемник, источник
    Копирование содержимого из операнда-источника в операнд-приемник.
  • Команда xchg
    Синтаксис: xchg операнд, операнд
    Обмен значениями между операндами.

Команды работы со стеком

  • Команда push
    Синтаксис: push источник
    Запись значения в вершину стека. При работе этой команды значение регистра sp/esp уменьшается на 2/4.
  • Команда pop
    Синтаксис: pop приемник
    Извлечение значения из вершины стека. При работе этой команды значение регистра sp/esp увеличивается на 2/4.

Арифметические команды

  • Команда add
    Синтаксис: add приемник, источник
    Сложение двух целочисленных двоичных операндов. Результат помещается на место первого операнда.
  • Команда sub
    Синтаксис: sub приемник, источник
    Вычитание двух целочисленных двоичных операндов. Результат помещается на место первого операнда.
  • Команда cmp
    Синтаксис: cmp приемник, источник
    Операнды приемник и источник сравниваются методом вычитания, при этом сами операнды не изменяются. По результатам сравнения устанавливаются флаги.
Примечание. Запись x:y означает, что старшая часть находится в x, а младшая — в y.
  • Команда mul
    Синтаксис: mul операнд
    Целочисленное умножение без учёта знака. В зависимости от типа операнда (байт/слово/двойное слово) множитель по умолчанию берется al/ax/eax, и результат записывается в ax/dx:ax/edx:eax.
  • Команда div
    Синтаксис: div операнд
    Целочисленное умножение без учёта знака. В зависимости от типа операнда (байт/слово/двойное слово) делимое по умолчанию берется ax/dx:ax/edx:eax и результат записывается в al (целая часть) и ah (остаток)/ax (целая часть) и dx (остаток)/eax (целая часть) и edx (остаток).

Команды безусловной передачи управления

  • Команда jmp
    Синтаксис: jmp операнд
    Переход на команду, адрес которой передается операнду, без сохранения информации в точке возврата.
  • Команда call
    Синтаксис: call операнд
    Вызов процедуры или переключение задачи.

Синтаксис описания процедуры:

имя процедуры proc
тело процедуры
имя процедуры endp

Команды условной передачи управления

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

  • Команда je
    Синтаксис: je метка
    Типы операндов команды cmp: любые.
    Критерий условного перехода: приемник = источник.
    Значения флагов для осуществления перехода: zf = 1.
  • Команда jne
    Синтаксис: jne метка
    Типы операндов команды cmp: любые.
    Критерий условного перехода: приемникисточник.
    Значения флагов для осуществления перехода: zf = 0.
  • Команды jl/jnge
    Синтаксис: jl метка или jnge метка
    Типы операндов команды cmp: со знаком.
    Критерий условного перехода: приемник < источник.
    Значения флагов для осуществления перехода: sfof.
  • Команды jle/jng
    Синтаксис: jle метка или jng метка
    Типы операндов команды cmp: со знаком.
    Критерий условного перехода: приемникисточник.
    Значения флагов для осуществления перехода: sfof или zf = 1.
  • Команды jg/jnle
    Синтаксис: jg метка или jnle метка
    Типы операндов команды cmp: со знаком.
    Критерий условного перехода: приемник > источник.
    Значения флагов для осуществления перехода: sf = of и zf = 0.
  • Команды jge/jnl
    Синтаксис: jge метка или jnl метка
    Типы операндов команды cmp: со знаком.
    Критерий условного перехода: приемникисточник.
    Значения флагов для осуществления перехода: sf = of.
  • Команды jb/jnae
    Синтаксис: jb метка или jnae метка
    Типы операндов команды cmp: без знака.
    Критерий условного перехода: приемник < источник.
    Значения флагов для осуществления перехода: cf = 1.
  • Команды jbe/jna
    Синтаксис: jbe метка или jna метка
    Типы операндов команды cmp: без знака.
    Критерий условного перехода: приемникисточник.
    Значения флагов для осуществления перехода: cf = 1 или zf = 1.
  • Команды ja/jnbe
    Синтаксис: ja метка или jnbe метка
    Типы операндов команды cmp: без знака.
    Критерий условного перехода: приемник > источник.
    Значения флагов для осуществления перехода: cf = 0 и zf = 0.
  • Команды jae/jnb
    Синтаксис: ja метка или jnbe метка
    Типы операндов команды cmp: без знака.
    Критерий условного перехода: приемникисточник.
    Значения флагов для осуществления перехода: cf = 0.

Команды управления циклом

  • Команда loop
    Синтаксис: loop метка
    Декремент содержимого регистра cx/ecx. Анализ регистра cx/ecx: если cx/ecx=0, передать управление следующей за loop команде, если cx/ecx≠0, передать управление команде, метка которой указана в качестве операнда.

Содержание

Report Page