Знакомство с порядком описания команд и принятыми обозначениями 1 страница



Описание команд микропроцессора, упорядоченное по алфавиту

Описание команд микропроцессора, упорядоченное по функциональному признаку

 

 

 

 

aaa aad aam aas adc add and
bound bsf bsr bswap bt btc btr
bts call cbw cwde clc cld cli
cmc cmp cmps/cmpsb /cmpsw/cmpsd cmpxchg cwd cdq daa
das dec div enter hlt idiv imul
in inc ins/insb /insw/insd int into iret/iretd jcc
jcxz jecxz jmp lahf lds les lfs
lgs lss lea leave lgdt lidt lods/lodsb /lodsw/lodsd
loop loope loopz loopne loopnz mov movs/movsb /movsw/movsd
movsx movzx mul neg nop not or
out outs pop popa popad popf popfd
push pusha pushad pushf pushfd rcl rcr
rep/repe/repz /repne/repnz ret/retf rol ror sahf sal sar
sbb scas/scasb /scasw/scasd setcc sgdt sidt shl shld
shr shrd stc std sti stos/stosb /stosw/stosd sub
test xadd xchg xlat/xlatb xor

 

 

 

 

Порядок описания команд будет следующим:

 

  • название команды с расшифровкой ее мнемонического обозначения — это облегчит процесс запоминания и последующего использования команды в соответствии с ее функциональным назначением;
  • синтаксическое описание команды, поясняющее возможные сочетания операндов для данной команды. При этом сложные синтаксические описания будут приведены в виде синтаксических диаграмм, что позволит в наиболее компактной форме изобразить все возможные сочетания операндов;
  • состояние флагов после выполнения команды;
  • описание типового применения команды с примером и (или) ссылка на урок, в котором демонстрируется пример применения команды;
  • номера занятий и приложений, а также список команд, которые функционально связаны с данной командой.

Для описания команд приняты обозначения:

  1. Для описания состояния флагов после выполнения некоторой команды будем использовать выборку из таблицы, отражающей структуру регистра флагов eflags:
31 18 17 16 15 14 1312 11 10 09 08 07 06 05 04 03 02 01 00
0 0 VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
                                     
  1. В нижней строке этой таблицы приводятся значения флагов после выполнения команды. При этом используются следующие обозначения:
    • 1 — после выполнения команды флаг устанавливается (равен 1);
    • 0 — после выполнения команды флаг сбрасывается (равен 0);
    • r — значение флага зависит от результата работы команды;
    • ? — после выполнения команды флаг не определен;
    • пробел — после выполнения команды флаг не изменяется;
  2. Для представления операндов в синтаксических диаграммах используются следующие обозначения:
    • r8, r16, r32 — операнд в одном из регистров размером байт, слово или двойное слово;
    • m8, m16, m32, m48 — операнд в памяти размером байт, слово, двойное слово или 48 бит;
    • i8, i16, i32 — непосредственный операнд размером байт, слово или двойное слово;
    • a8, a16, a32 — относительный адрес (смещение) в сегменте кода.
  3. На многих диаграммах в целях компактности возможные сочетания операндов показаны в виде следующей конструкции:

Конструируя команду на основе подобной синтаксической диаграммы, вы должны помнить о соответствии типов. В подобной диаграмме допустимы только следующие сочетания: "r8, m8", "r16, m16", "r32, m32". Например, сочетание "r8, m16" недопустимо. Однако есть единичные случаи, когда подобные сочетания возможны; тогда они специально оговариваются.

  1. Описанная в данном приложении система команд в полном объеме поддерживается микропроцессором Pentium. Предыдущие модели микропроцессора могут не поддерживать отдельные команды. Чтобы прояснить этот момент, мы будем указывать в примерах для каждой команды директиву типа .286. Это будет означать, что описываемая команда поддерживается всеми моделями микропроцессора, начиная с i286. Если ничего не указывается, то это означает, что данная команда работает на всех моделях микропроцессоров Intel, начиная с i8086/8088.

AAA

(Ascii Adjust after Addition)

ASCII-коррекция после сложения

 

Схема команды: aaa

Назначение: корректировка неупакованного результата сложения двух одноразрядных неупакованных BCD-чисел.

Синтаксис

Алгоритм работы:

  • проанализировать значение младшего полубайта регистра al и значение флага af;
  • если (значение младшего полубайта регистра al >9) или (AF=1), то выполнить следующие действия:
    • увеличить значение al на 6;
    • очистить старший полубайт регистра al;
    • увеличить значение ah на 1;
    • установить флаги: af = 1, cf = 1,

иначе сбросить флаги af = 0 и cf = 0.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
? ? ? r ? r

Применение:

Обычно команда aaa используется после сложения каждого разряда распакованных BCD-чисел командой add. Каждая цифра неупакованного BCD-числа занимает младший полубайт байта. Если результат сложения двух одноразрядных BCD-чисел больше 9, то число в младшем полубайте результата не есть BCD-число. Поэтому результат нужно корректировать командой aaa. Эта команда позволяет сформировать правильное BCD-число в младшем полубайте и запомнить единицу переноса в старший разряд путем увеличения содержимого регистра ah на 1.

К примеру, сложить два неупакованных BCD-числа: 08 + 05:

mov ah,08h ;ah=08h mov al,05h ;al=05h add al,ah ;al=al+ah=05h+08h=0dh — не BCD-число xor ah,ah ;ah=0 aaa ;ah=01h,al=03h — результат скорректирован

См. также: урок 8, приложение 7 и команды aad, aam, aas, daa, das

AAD

(Ascii Adjust before Division)

ASCII-коррекция перед делением

 

Схема команды: aad

Назначение:

  • подготовкa двух неупакованных BCD-чисел для операции деления;
  • преобразование двузначного неупакованного ВCD-числа меньшего 63h (9910) в двоичное представление.

Синтаксис

Алгоритм работы:

  • умножить значение регистра ah на 10 и сложить полученное значение с содержимым регистра al: (ah*10)+al;
  • присвоить регистру al значение (ah*10)+al;
  • обнулить регистр ah.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
? r r r r ?

Применение:

Команду aad используют для подготовки двузначного неупакованного BCD-числа в регистре ax для операции деления. Так как в системе команд микропроцессора нет команды деления для BCD-чисел, такое число нужно предварительно преобразовать в двоичный вид. Для этого старший разряд двузначного BCD-числа помещается в регистр ah, умножается на 10 и складывается с разрядом единиц двузначного BCD-числа 9 в регистре al. В результате этих действий и получается соответствующее двоичное число в регистре ax. Далее в программе уже можно применять обычную команду деления div, оперирующую двоичными данными. Команду aad можно применять и просто для преобразования неупакованного двузначного BCD-числа в его двоичный эквивалент. Есть еще интересный момент — если посмотреть на коды символов шестнадцатеричных цифр в таблице ASCII, то видно, что они похожи на BCD-числа. Исключение составляет лишь значение старшей тетрады (для BCD-числа это так называемая зона с нулевым значением) - оно равно 3. Можно сделать вывод, что если предварительно обнулить значение старшей тетрады для кодов двух символов (от 0 до 9), то эту команду вполне можно применять и для преобразования двузначных десятичных чисел в символьном представлении в их двоичный эквивалент, что и отражено в названии команды. Для иллюстрации рассмотрим два примера.

Пример 1. Разделить десятичное число 18 на 9. Подготовить результат к выводу на экран.

mov ah,01h ;ah=01h mov al,08h ;al=08h => ax=0108h mov bl,09 ;bl=09h aаd ;al=12h — двоичный эквивалент десятичного числа 18 div bl ;al=02h,ah=00h ог al,30h ;al=32h — ASCII-представление числа 2, можно выводить на экран

Пример 2. Преобразовать десятичное число 16 в символьном виде в эквивалентное двоичное число.

mov ax,3136h ;ax=3136h and ax,0f0fh ;ax=0106h aаd ;al=10h — получили его двоичный эквивалент

См. также: уроки 3, 8, приложение 7 и команды aaa, aam, aas, daa, das

AAM

(Ascii Adjust after Multiply)

ASCII-коррекция после умножения

 

Схема команды: aam

Назначение:

  • корректировка результата умножения двух неупакованных BCD-чисел;
  • преобразование двоичного числа меньшего 63h (9910) в его неупакованный BCD-эквивалент.

Синтаксис

Алгоритм работы:

  • разделить значение регистра al на 10;
  • записать частное в регистр ah, остаток — в регистр al.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
? r r r r ?

Применение:

Команду aam используют для коррекции результата умножения двух неупакованных BCD-чисел. Специальной команды умножения BCD-чисел нет. Поэтому BCD-числа умножаются поразрядно, как обычные двоичные числа, командой mul. Максимальное число, которое получается при таком умножении, — это 9*9=8110=5116. Отсюда понятно, что значения, для которых командой aam можно получить их двузначный BCD-эквивалент в регистре ax, находятся в дипазоне от 00h до 51h. Эту команду можно применять и для преобразования двоичного числа из регистра ax (в диапазоне от 0 до 63h) в его десятичный эквивалент(соответственно, из диапазона от 0 до 9910).

Пример 1. Умножить десятичное число 8 на 9. Подготовить результат к выводу на экран.

mov ah,08h ;ah=08h mov al,09h ;al= 09h mul ah ;al=48h — двоичный эквивалент 72 aam ;ah=07h,al=02h or ax,3030h ;ax=3732h — ASCII-представление числа 72

Пример 2. Преобразовать двоичное число 60h в эквивалентное десятичное число.

;поместим число 60h в регистр ax mov ax,60h ;ax=60h aаm ;ax=0906h — получили десятичный эквивалент числа 60h or ax,3030h ;символьный эквивалент, можно выводить на экран

См. также: урок 8, приложение 7 и команды aaa, aad, aas, daa, das

AAS

(Ascii Adjust after Substraction)

ASCII-коррекция после вычитания

 

Схема команды: aas

Назначение: корректировка результата вычитания двух неупакованных одноразрядных BCD-чисел.

Синтаксис

Алгоритм работы:

если (младший полубайт регистра al меньше 9) или (флаг af=1), то выполнить следующие действия:

  • уменьшить значение младшего полубайта регистра al на 6;
  • обнулить значение старшего полубайта регистра al;
  • установить флаги af и cf в 1;

иначе установить флаги af и cf в 1.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
? ? ? r ? r

Применение:

Команду aas используют для коррекции результата вычитания двух неупакованных одноразрядных BCD-чисел после команды sub. Операндами в команде sub должны быть правильные одноразрядные BCD-числа. Рассмотрим возможные варианты вычитания одноразрядных BCD-чисел:

  • 5-9 — для вычитания необходимо сделать заем в старшем разряде. Факт такого заема в микропроцессоре фиксируется установкой флагов cf и af в 1 и вычитанием 1 из содержимого ah. В результате после команды aas в регистре al получается правильное значение (модуль результата), которое для нашего примера (с учетом заема из старшего разряда) составляет 6. Одновременно моделируется заем из старшего разряда, что позволяет производить вычитание длинных чисел.
  • 8-6 — для вычитания нет необходимости делать заем в старшем разряде. Поэтому производится сброс флагов cf и af в 0, а ah не изменяется. В результате после команды aas в регистре al получается правильное значение (модуль результата), которое для нашего примера составляет 2.

Пример 1. Вычесть десятичное число 8 из 5. Подготовить результат к выводу на экран.

mov al,05h mov bl,08h sub al,bl ;al=0fdh aas ;al=07, cf=af=1 or al,30h ;al=37h — код символа 7;вывод результата на экран mov ah,2 mov dl,al int 21h

См. также: уроки 3, 8, приложение 7 и команды aaa, aad, aam, daa, das

ADC

(Addition with Carry)

Сложение с переносом

 

Схема команды: adc приемник,источник

Назначение: сложение двух операндов с учетом переноса из младшего разряда.

Синтаксис

Алгоритм работы:

  • сложить два операнда;
  • поместить результат в первый операнд: приемник=приемник+источник;
  • в зависимости от результата установить флаги.

Состояние флагов после выполнения команды:

11 07 06 04 02 02
OF SF ZF AF PF CF
r r r r r r

Применение:

Команда adc используется при сложении длинных двоичных чисел. Ее можно использовать как самостоятельно, так и совместно с командой add. При совместном использовании команды adc с командой add сложение младших байтов/слов/двойных слов осуществляется командой add, а уже старшие байты/слова/двойные слова складываются командой adc, учитывающей переносы из младших разрядов в старшие. Таким образом, команда adc значительно расширяет диапазон значений складываемых чисел. В приложении 7 приведен пример программы сложения двоичных чисел произвольной размерности.

.datasl1 dd 01fe544fhsl2 dd 005044cdhelderREZ db 0 ;для учета переноса из старшего разряда результатаrez dd 0.code... mov ax,sl1 add ax,sl2 ;сложение младших слов слагаемых mov rez,ax mov ax,sl+2 adc ax,sl2+2 ;сложение старших слов слагаемых плюс cf mov rez+2,ax adc elderREZ,0 ;учесть возможный перенос

См. также: урок 8, приложение 7 и команды add, sub, sbb, xadd

ADD

(ADDition)

Сложение

 

Схема команды: add приемник,источник

Назначение: сложение двух операндов источник и приемник размерностью байт, слово или двойное слово.

Синтаксис

Алгоритм работы:

  • сложить операнды источник и приемник;
  • записать результат сложения в приемник;
  • установить флаги.

Состояние флагов после выполнения команды:


Дата добавления: 2019-09-13; просмотров: 288; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!