Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4семестр / Методичка лр_№4.doc
Скачиваний:
36
Добавлен:
30.04.2013
Размер:
414.21 Кб
Скачать
  1. Примеры команд 32-разрядного процессора

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

1) попытка выполнения любой команды с последовательностью байтов, представляющих операнд в памяти, хотя бы один байт которого не умещается в данном сегменте, вызовет исключение #GP;

2) при невозможности обращения к требуемой странице памяти процессор вырабатывает исключение #PF(PageFault– отказ страницы).

ADC (Additionwith Carry)- сложение с учетом значения флага переносаCF.

ADCприемник, источник (ADCАХ, В)

Действие:приемник = приемник + источник + EFLAGS.CF.

Команда влияет на флаги OF,SF,ZF,AF,PF,CF, значения которых определяются результатом сложения. Первый операнд – имя регистра или адрес ячейки памяти (8, 16 или 32 разряда); второй операнд – имя регистра, адрес ячейки памяти или непосредственный операнд размером в байт, слово или двойное слово. Размерности первого и второго операнда должны совпадать.

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

  1. Выборка операнда приемники копирование его в регистр-накопитель.

  2. Выборка операнда источники сложение его с содержимым регистра-накопителя.

  3. Прибавление к содержимому накопителя значения флага переноса EFLAGS.CF.

  4. Копирование содержимого накопителя в операнд приемник.

  5. В зависимости от результата установить флаги.

Исключения: #GP, #PF.

DIV (DIVide unsigned) – беззнаковое деление

DIVделитель(DIVСХ ;AX:=(DX|AX)/CX(DX-ост))

Действие:деление без учёта знака (положительные числа) делимого, расположенного в регистрах процессора (см. табл.7) на операнд-делитель. Делимое задается неявно, и его размер зависит от размера делителя. Местоположение делимого, делителя, частного и остатка, в зависимости от размера, показаны в табл.7. После выполнения команды флагиOF,SF,ZF,AF,PF,CFимеют неопределенные значения. Использование в качестве делителя непосредственных операндов не допускается.

Таблица 7.Местоположение и размер данных, участвующих в операции беззнакового деления

Размер операнда

Делимое

Делитель

Частное

Остаток

байт

AX

r8/m8

AL=

АХ

AH

операнд

слово

DX:AX

r16/m16

AX=

DX:AX

DX

операнд

двойное слово

ЕDX:ЕAX

r32/m32

ЕAX=

ЕDX:ЕAX

ЕDX

операнд

Здесь r– регистр,m– ячейка памяти, число означает разрядность.

Частное целое и округляется в меньшую сторону.

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

  1. Выборка делимогои копирование его в регистр-накопитель.

  2. Выборка операнда делительи непосредственное деление на него содержимого накопителя методом последовательного многократного вычитанияделителяизделимого, причем частное и остаток записываются в регистры, указанные в табл.7.

Исключения: #DE, #GP, #PF.

MOV (MOVeoperand)– копирование содержимого операндаисточникв операндприемник.

MOVприемник, источник (MOVАХ, [EDI])

Действие:приёмник=источник

Выборка операнда из источникаи копирование его вприемник. Значение второго операнда не изменяется. Первый операнд – имя регистра или адрес ячейки памяти размером в байт, слово или двойного слово. Второй операнд – регистр, ячейка памяти или непосредственный операнд (исключается случай, когда оба операнда находятся в памяти или оба в сегментных регистрах). Размерности первого и второго операнда должны совпадать. Команда не изменяет значения флагов.

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

  1. Выборка операнда из источника.

  2. Копирование его в приемник, начиная с младших разрядов.

Исключения: #GP, #PF.

OR (logical inclusive OR) – логическое включающее ИЛИ.

OR приемник, маска (OR EDX, mas[EBX+ESI])

Действие:приемник = приемник маска

Команда выполняет операцию логического ИЛИ над соответствующими парами бит операндов приёмника и маски. Первый операнд – имя регистра или адрес ячейки памяти размером в байт, слово или двойное слово. Второй операнд – регистр, ячейка памяти или непосредственный операнд (исключается случай, когда оба операнда находятся в памяти). Команда сбрасывает в 0 флаги CFиOF; значение флагов SF, ZF, PF зависят от результата выполнения команды; флагAFостается неопределенным.

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

  1. Выборка операнда из приемникаи копирование его в накопитель.

  2. Побитовая дизъюнкция содержимого накопителя и маски. При этом бит результата равен 0, если соответствующие биты операндов маска и назначения равны 0, в противном случае бит равен 1;

  3. Копирование содержимого накопителя в приемник.

  4. Запись результата операции в источник (операнд маскаостается неизменным);

  5. Установка флагов.

Исключения: #GP, #PF.

SUB (SUBtract) – вычитание.

SUBоперанд_1, операнд_2 (SUBEAX,EAX)

Действие:операнд_1 = операнд_2 – операнд_1.

Команда выполняет целочисленное вычитание операндов со знаком. Значение флагов OF, SF, ZF, AF, PF, CF зависят от результата выполнения команды. Операнд_1– регистр или ячейка памяти размером байт, слово или двойное слово.Операнд_2– регистр, ячейка памяти или непосредственный операнд того же размера, что иоперанд_1 (исключается случай, когда оба операнда находятся в памяти).

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

  1. Выборка значения операнда_2и запись его в накопитель.

  2. Выборка значения операнда_1в свободный регистр1 АЛУ и преобразование его в дополнительный код

  3. Сложение содержимого регистра1 АЛУ из содержимого накопителя.

  4. Копирование содержимого накопителя в опернад_1.

  5. Установка флагов.

Исключения: #GP, #PF.

SHR (SHift logical Right) – поразрядный сдвиг вправо.

SHRоперанд_1, операнд_2 (SHRЕАХ, 8)

Действие:Cдвиг всех разрядов операнда_1 на число, определяемое операндом_2. Разряды, выдвинутые за пределы разрядной сетки теряются (кроме последнего, который попадает во флаг переноса СF), освободившиеся разряды заполняются нулями. Операнд_1: 8, 16 или 32-разрядный регистр или ячейка памяти. Операнд_2: 1(единица), 8-разрядная константа или регистрCL. ФлагиCF,SF,ZF,PFустанавливаются по результату операции.

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

  1. Сдвиг всехразрядов операнда_1вправо один разряд; при этом выдвигаемый справа бит становится значением флага переноса CF.

  2. Одновременно слева в операнд_1 вдвигается нулевой бит.

  3. Указанные выше два действия повторяются количество раз, равное значению операнда_2.

Исключения: #GP, #PF.

LOOP – команда организации цикла со счётчиком в регистре ЕСХ.

LOOPметка (LOOPМЕТ1)

Действие: передача управления (зацикливание) по метке, типа SHORT-ближняя, пока значение ECX не будет равно 0. Регистр ECX декрементируется после проверки условия выхода из цикла. Метка (однобайтовая знаковая константа) – это адрес команды, отнесенной от LOOP не более чем на +127 или на –128 байт. Выполнение команды не влияет на флаги.

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

  1. Сравнение ECXс нулём.

  2. ЕслиЕСХ=0, то занесение в регистр командEIPадреса следующей послеLOOPкоманды (завершение цикла).

Иначезанесение вEIPадреса метки (адрес начала цикла).

К.Если

  1. Уменьшение ECXна 1.

Исключения: #GP, #PF.

REPE (REPeat string operation while Equal) CMPSB (CoMРare String Byte) сравнение строк и поиск первого несовпадения.

REPECMPSB(операнды не указываются)

Действие:повторение сравнения двух однобайтовых элементов строк с логическими адресамиDS:ESIиES:EDI. По результату сравнения устанавливаются флаги:OF,SF,ZF,AF,PF,CF. Выход из цикла сравнения происходит приECX=0 или нахождении в строках первого несовпадения (флагZF=0). После каждого сравнения (независимо от результата) происходит увеличение (при сброшенном флагеEFLAGS.DF=0) или уменьшение (при установленном флагеEFLAGS.DF=1) значений регистров ESI и EDI.

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

  1. Сравнение байта источника DS:ESI с байтом приемника ES:EDI методом вычитания. По результату сравнения устанавливаются флаги, например, если байты равны (EFLAGS.ZF=1, EFLAGS.СF=0), иначе (EFLAGS.ZF=0, EFLAGS.СF=1).

  2. Переход к просмотру следующего элемента строки.

Еслифлаг направления просмотраEFLAGS.DF=0,

тоувеличить значения индексных регистров на длину элемента строки –1байт(ESI=ESI+1 иEDI=EDI+1),

Иначе (DF=1) уменьшить значения индексных регистров (ESI=ESI–1 и EDI=EDI–1),

  1. Проверка условий повторения просмотра строк: (EFLAGS.ZF=1 иECX≠0)?

Еслисравниваемые байты равны (ZF=1) и счётчик повторенийECX≠0,

тоуменьшить на 1 счётчик повторений (ECX=ECX-1), переход к п.1.

  1. Конец выполнения команды.

Исключения: #GP, #PF.

POP(POP avaluefromthestack)– извлечение из стека двойного слова и помещение его по адресу операнда.

POPоперанд (POPЕВХ)

Действие: операнд[31÷0]=ОП[SS:ESP]

Извлечение двойного слова в операнд из вершины стека (SS:ESP). Операнд: 32-разрядный регистр или ячейка памяти. Выполнение команды не влияет на флаги.

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

  1. Формирование физического адреса вершины стека (SS:ESP).

  1. Копирование двойного слова из вершины стека по адресу операнда.

  2. Формирование адреса новой вершины стека (ESP=ESP+4).

Исключения: #GP, #PF.

TEST(TEST приемник, источник)– логическое «и» без изменения операндов.

TESTприемник, источник (TESTАХ,BL)

Действие: результат = приемник & источник. Приемник: 8, 16 или 32-разрядный регистр или ячейка памяти. Источник: 8, 16 или 32-разрядный регистр, ячейка памяти или константа. Результат сохраняется только во временной памяти АЛУ, по его значению устанавливаются флагZF,SF,PFCF=OF=0.

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

  1. Выборка источника и приёмника

  2. Выполнение логического «и».

  3. Установка флагов.

Исключения: #GP, #PF.

DAA(Decimal Adjust AL for Addition)– десятичная коррекция результата сложения двух упакованных двоично-десятичных чисел с целью получения правильного двоично-десятичного числа. Число для коррекции выбирается из регистраAL. Результат сохраняется в регистрAL, по его значению устанавливаются флагZF,SF,PF, АF,CF.

DAA(без операндов)

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

  1. Если (EFLAGS.АF=1 илиAL[30]>9), тоAL=AL+00000110,EFLAGS.АF=1, в зависимости от результата установитьEFLAGS.СF.

Иначе EFLAGS.АF=0.

  1. Если (EFLAGS.СF=1 или AL[74]>9), то AL= AL+01100000, EFLAGS.CF=1,

Иначе EFLAGS.СF=0.

Исключения: #GP, #PF.

CWDE(Convert Word to Double Extended)– преобразование слова в двойное слово с учётом знака. Число для преобразования выбирается из регистраAХ. Результат сохраняется в регистр ЕAХ, на флаги не влияет.

CWDE(без операндов)

Действие: ЕАХ[31]=ЕАХ[30]…=ЕАХ[16]=АХ[15] – расширение знакового бита АХ на всё старшее слово регистра ЕАХ.

Исключения: #GP, #PF.

NEG(NEG приемник)– изменить знак операнда. Приемник: 8, 16 или 32-разрядный регистр или ячейка памяти. Результат сохраняется в приёмнике, по его значению устанавливаются флагиZF,PF, АF,SF,OF(EFLAGS.CF= неEFLAGS.ZF).

NEGприемник (NEGАХ)

Действие: приемник = двоичное дополнение приемника

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

  1. Выборка приёмника

  2. Получение двоичного дополнения приемника.

  3. Установка флагов.

Исключения: #GP, #PF.

XCHG(eXCHanGe register/memorywithregister)– обмен значениями между операндами. Операнд_1: 8, 16 или 32-разрядный регистр или ячейка памяти, операнд_2: 8, 16 или 32-разрядный регистр. На флаги не влияет.

Соседние файлы в папке 4семестр