Главная страница
Навигация по странице:

  • Директива DD ( Define Double )

  • Директива эквивалентности EQU ( Equal )

  • 6. Команды перемещения данных. Назначение, ограничения.

  • 7. Арифметические команды. Назначение, устанавливаемые флаги. ADD

  • ЯП. 1. Регистры общего назначения (рон) процессора. Назначение и использование. Специальное назначение регистров


    Скачать 0.61 Mb.
    Название1. Регистры общего назначения (рон) процессора. Назначение и использование. Специальное назначение регистров
    Дата26.01.2022
    Размер0.61 Mb.
    Формат файлаdocx
    Имя файлаYAPE.docx
    ТипДокументы
    #343006
    страница2 из 4
    1   2   3   4

    Директива DW (DefineWord) определяет переменную размером в слово.

    Например: A DW ?

    Ассемблер отводит под переменную А слово памяти и переменная не получает нормального значение. Тип переменной равен 2, т.е. занимает 2 байта

    TYPE A = WORD = 2

    Операндом директивы может быть константное выражение со значением от -32768 до 65535

    Как и в DB, неотрицательные числа записываются в память как число без знака, а отрицательные – в дополнительном коде.

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

    Директива DD (Define Double) определяет переменную, под которую отводится двойное слово.

    TYPE = DWORD = 4 -> содержит 4 байта

    Например: A DD ?

    Под переменную А выделяется двойное слово и переменная не получает начального значения.

    Операндом директивы может быть константное выражение со значением от -2^31 до 2^32-1. Также операндом может быть адресное выражение. В этом случае операнд определяет абсолютный адрес.

    Директива эквивалентности EQU (Equal) позволяет определить константу и имеет следующий синтаксис

    <имя> EQU <операнд>

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

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

    Директива присваивания определяет константу с именем, указанным в левой части и с числом значением, равным значению выражения справа:

    <имя> = <константное выражение>

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

    Например:

    C=10

    A DW C эквивалентно A DW 10

    Типы данных в ассемблере:





    6. Команды перемещения данных. Назначение, ограничения.

    Ограничения:

    1. Оба операнда должны иметь одинаковую длину.

    2. Оба операнда не могут одновременно быть памятью.

    3. Получатель не может быть регистром CS, IP, EIP.

    4. Нельзя в сегментный регистр пересылать непосредственное значение.

    5. Приемников не может быть непосредственный режим адресации.

    MOV

    MOV <байт-назначения>, <байт-источника>

    MOV пересылает переменную-байт, указанную во втором операнде, в ячейку, указанную в первом операнде. Содержимое байта источника не изменяется. Эта команда на флаги и другие регистры не влияет

    XCHG

    XCHG <операнд 1>, <операнд 2> меняет значения операндов местами. Эта команда на флаги и другие регистры не влияет.

    Для операндов команды XCHG существуют те же ограничения, что и для операндов команды MOV, за исключение того, что операнды команды XCHG не могут быть непосредственно заданными значениями.

    CMOVcc

    CMOVcc <операнд 1>, <операнд 2> - условная пересылка данных. Команда копирует содержимое источника в приемник, если выполняется то или иное условие. СС - условие.

    LEA

    LEA <операнд 1>, <операнд 2> вычисляет эффективный адрес (смещение) операнда-источника команды (который должен быть операндом в пам

    яти) и сохраняет его в регистре – операнде-назначении команды.





    LDS

    Команда LDS предназначена для загрузки дальнего указателя для сегментного регистра DS.



    LSS

    Команда LSS предназначена для загрузки дальнего указателя для сегментного регистра SS.

    LES

    Команда LES предназначена для загрузки дальнего указателя для сегментного регистра ES.

    LFS

    Команда LFS предназначена для загрузки дальнего указателя для сегментного регистра FS.

    LGS

    Команда LGS предназначена для загрузки дальнего указателя для сегментного регистра GS.

    XLAT/XLATB

    Команда применяется для перекодирования байта в таблице. Эта команда удобна, когда надо преобразовать байт в другой байт и есть точная таблица соответствия. Для того чтобы воспользоваться командой XLAT нужно сначала поместить в регистр EBX (BX) адрес таблицы соответствия, а в регистр AL – исходное значение. После этого можно применить команду XLAT. После выполнения команды в регистре AL будет содержаться значения из таблицы, на которую указывает EBX (BX).



    PUSH

    Команда PUSH <помещаемое> записывает значение в стек – увеличивает указатель стека на единицу и после этого содержимое прямо адресуемой переменной копируется в ячейку внутреннего ОЗУ, адресуемого с помощью указателя стека. Команда используется для записи промежуточных данных в стек.

    push -5 ; Поместить -5 в стек



    POP

    Команда POP <куда будет помещено> извлекает значение из стека и помещает по указанному адресу, весь стек перемещает на один уровень вверх.

    pop cx ; Поместить значение из стека в CX



    IN

    Команда IN <операнд 1>, <операнд2> загружает данные из пространства входа/выхода (порты, таймеры, регистры конфигурации и т.п.) в регистр регистрового файла

    in r25, $16 ; Считать порт B

    OUT

    Команда OUT <операнд 1>, <операнд 2> применяет для отправки данных в порт ввода-вывода.

    CBW

    Команда преобразует знаковый байт из регистра AL в знаковое слово в регистре AX путем расширения значащего бита регистра AL во все биты регистра AH.

    CWD

    Команда CWD заполняет регистр DX знаковым битов содержимого регистра AX, преобразуя тем самым 16-разрядное число со знаком в 32-разрядное, размещаемое в регистрах DX:AX. Команду удобно использовать для преобразования двухбайтового делимого в четырехбайтовое (двойное слово) при делении на 16-разрядный операнд. Команда не имеет параметров.

    CWDE

    CWDE копирует старший бит AX в верхнюю часть (старшую часть) EAX, расширяя таким образом оригинальное AX в двойное слово со знаком, которое будет помещено в регистр EAX.

    CDQ

    Команда предназначена для преобразования двойного машинного слова в 4-е. Копирует знаковый бит регистра EAX на все биты регистра EDX.

    7. Арифметические команды. Назначение, устанавливаемые флаги.

    ADD

    Команда ADD <приемник>, <источник> добавляет значение источника к значению приемника и помещает результат в приемник.

    Команда ADD может в зависимости от результата выполнения изменять все основные флаги, а именно

    • CF – флаг переноса. Может быть изменен при переполнении.

    • ZF – флаг нуля. Этот флаг будет установлен, если результатом сложения будет 0.

    • SF – знак флага. Этот флаг будет установлен, если результатом сложения будет отрицательное число.

    • OF – флаг переполнения. Флаг будет установлен в случае переполнения (результат не помещается в сумму – значение слишком большое).

    • PF – флаг четности.

    • AF – вспомогательный флаг переноса.

    ADC

    Команда ADC <приемник>, <источник> - сложение с переносом. Прибавляет к первому операнду второй операнд и содержимое флага переноса СF. (op1) <- (op1)+(op2)+CF.

    Основное назначение – сложение длинных чисел, не умещающихся в 32 битах.

    Меняет флаги OF, SF, ZF, AF, PF, CF.

    SUB

    Команда SUB <приемник>, <источник> производит вычитание двух целочисленных двоичных операндов. Приемник = приемник – источник.

    Меняет флаги OF, SF, ZF, AF, PF, CF.

    SBB

    SBB <приемник>, <источник> - вычитание с заемом. Вычитание происходит с учетом флага CF. Состояние флага CF представляет собой заем от предыдущего вычитания.

    Приемник = приемник – (источник + CF)

    Меняет флаги OF, SF, ZF, AF, PF, CF.

    CMP

    Команда CMP <источник>, <приемник> сравнивает операнды методом вычитания, при этом сами операнды не изменяются. По результатам сравнения устанавливаются флаги.

    Меняет флаги OF, SF, ZF, AF, PF, CF.

    INC

    INC <операнд> - инкремент. Увеличивает операнд на 1. Команда не воздействует на флаг CF.

    Меняет флаги OF, SF, ZF, AF, PF.

    DEC

    DEC <операнд> - декремент. Уменьшает операнд на 1. Команда не воздействует на флаг CF.

    Меняет флаги OF, SF, ZF, AF, PF.

    MUL

    MUL <множитель> - умножение без знака. Команда выполняет целочисленное умножение без учёта знака. Явно задается один из множителей. Второй множитель задается неявно в регистре AL/AX/EAX (это местоположение фиксировано). Местоположение результата умножения определяется кодом операции и размером множителей:



    Меняет флаги:

    Если старшая половина результата нулевая:
    OF=CF=0 SF=? ZF=? AF=? PF=?.
    Если старшая половина результата ненулевая:
    OF=CF=1 SF=? ZF=? AF=? PF=?.

    IMUL

    IMUL – умножение со знаком. Имеет 3 формы, различающиеся количеством операндов:

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



    - С двумя операндами – первый операнд определяет местоположение первого сомножителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя.

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

    Меняет флаги:

    - для однооперандной команды:

    OF = 1 CF = 1 – значимые биты переносятся в верхнюю половину результата. OF=0 CF=0 – результат точно помещается в младшей половине результата. Состояние остальных флагов: SF=? ZF=? AF=? PF=?

    - для двух- и трехоперандной команды:

    OF=1 CF=1 — результат слишком большой и усекается. OF=0 CF=0 — размер результата точно соответствует операнду назначения. Состояние остальных флагов: SF=? ZF=? AF=? PF=?.

    DIV

    DIV <делитель> - деление без знака. Команда выполняет целочисленное деление без учёта знака. Делимое задается неявно, и его размер зависит от размера делителя, который явно указывается в команде. Местоположения делимого, делителя, частного и остатка — в зависимости от их размерности:



    Меняет флаги: OF, CF, SF, ZF, AF, PF

    IDIV

    IDIV – деление со знаком. Команда выполняет целочисленное деление со знаком. Делимое задается неявно, и его размер зависит от размера делителя, который явно указывается в команде. Местоположения делимого, делителя, частного и остатка — в зависимости от их размерности:



    Меняет флаги: OF, CF, SF, ZF, AF, PF.

    NEG

    NEG <операнд> - меняет знак операнда на противоположный.

    Меняет флаги: CF, OF, SF, ZF, AF, PF.

    8. Логические команды (AND, OR, XOR, NOT, TEST). Назначение, устанавливаемые флаги. Примеры использования.



    AND

    AND <приемник>, <источник> - выполняет операцию логического И над соответствующими парами битов операндов. Устанавливает бит результата в 1, если оба бита, бит источника и приемника установлены в 1.

    Меняет флаги: OF, SF, ZF, AF, PF, CF.

    Пример:
    and ax, dx
    ax = 6 - в двоичном - 110
    dx = 5 - в двоичном - 101

    110 AND 101 -> 100

    OR

    OR <приемник>, <источник> - выполняет операция логического ИЛИ над соответствующими парами битов операндов. Устанавливает бит результата в 1, если один из битов, бит источника или бит приемника установлен в 1.

    Меняет флаги: OF, SF, ZF, AF, PF, CF.

    Пример:

    or ax, dx
    ax = 6 - в двоичном - 110
    dx = 5 - в двоичном - 101

    110 OR 101 -> 111

    XOR

    XOR <приемник>, <источник> - выполняет операцию логического исключающего ИЛИ над соответствующими парами битов операндов. Устанавливает бит результата в 1, если бит источника отличается от бита приемника.

    Меняет флаги: OF, SF, ZF, AF, PF, CF.

    Пример:

    xor ax, dx
    ax = 6 - в двоичном - 110
    dx = 5 - в двоичном - 101

    110 OR 101 -> 011

    NOT

    NOT <операнд> - инвертирует все биты операнда.

    Флаги не меняет.

    Пример:

    not ax
    ax = 6 - в двоичном - 110
    NOT 110 -> 001

    TEST

    TEST <приемник>, <источник> - выполняет операцию логического И над операндами. Сами операнды при этом не изменяются. В зависимости от результата устанавливаются флаги SF, ZF, PF, флаги OF и CF – сбрасываются.

    9. Команды сдвигов (SHL, SHR, SAL, SAR, RCL, RCR, ROL, ROR, SHLD, SHRD). Назначение, устанавливаемые флаги.

    SHL/SAL

    SHL/SAL <операнд>, <количество_сдвигов> - сдвиг всех битов операнда влево на количество разрядов, указанное вторым операндом, при этом сдвигаемый слева бит становится значением флага переноса CF. Одновременно справа в операнд вдвигается нулевой бит.

    Меняет флаги: CF, OF, SF, ZF, PF ,AF

    CF – содержит значение последнего выдвинутого из операнда бита.

    SHR

    SHR <операнд>, <количество_сдвигов> - логический сдвиг вправо. Сдвиг всех битов операнда вправо на количество разрядов, указанное операндом количество_сдвигов, при этом выдвигаемый справа бит становится значением флага переноса CF. Одновременно слева в операнд вдвигается нулевой бит.

    Меняет флаги: CF, OF, SF, ZF, PF, AF.

    SAR

    SAR <операнд>, <количество_сдвигов> - арифметический сдвиг вправо. Сдвиг всех битов операнда вправо на количество разрядов, указанное операндом количество_сдвигов, при этом выдвигаемый справа бит становится значением флага переноса CF. По мере сдвига вправо освобождающиеся места заполняются значением знакового разряда.

    Меняет флаги: CF, OF, SF, ZF, PF, AF.

    RCL

    RCL <операнд>, <количество_сдвигов> - циклический сдвиг влево через флаг переноса. При циклическом сдвиге разрядов операнда влево его старший бит становится значением флага переноса CF. Старое содержимое CF вдвигается в операнд справа и становится значением его младшего бита.

    Меняет флаги: CF, OF, SF, ZF, PF, AF.

    RCR

    RCR <операнд>, <количество_сдвигов> - циклический сдвиг вправо через флаг переноса. При циклическом сдвиге разрядов операнда вправо его младший бит становится значением флага переноса CF. Старое содержимое CF вдвигается в операнд слева и становится значением его старшего бита.

    Меняет флаги: CF, OF, SF, ZF, PF, AF.

    ROL

    ROL <операнд>, <количество_сдвигов> - циклический сдвиг влево. При циклическом сдвиге разрядов операнда влево его старший выдвигаемый бит вдвигается в операнд справа и становится одновременно значением младшего бита операнда и флага переноса CF.

    Меняет флаги: CF, OF, SF, ZF, PF, AF.

    ROR

    ROR <операнд>, <количество_сдвигов> - циклический сдвиг вправо. При циклическом сдвиге разрядов операнда вправо его младший выдвигаемый бит вдвигается в операнд слева и становится одновременно значением старшего бита операнда и флага переноса CF.

    Меняет флаги: CF, OF, SF, ZF, PF, AF.

    SHLD

    SHLD <операнд>, <источник>, <количество_сдвигов> - сдвиг двойной точности влево. Команда сдвигает операнд приемник влево на число битов, указанных операндом количество_сдвигов. Операнд источник обеспечивает биты, которые вдвигаются в приемник справа (начиная с бита 0 приемника).

    Меняет флаги: CF, OF, SF, ZF, PF, AF.
    1   2   3   4


    написать администратору сайта