ЯП. 1. Регистры общего назначения (рон) процессора. Назначение и использование. Специальное назначение регистров
Скачать 0.61 Mb.
|
Директива 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. |