====== Основы ====== =====Некоторые основные команды ассемблера===== ^Команда^Выполняемая операция^Группа^ |AAA|ASCII-коррекция после сложения|Десятичная арифметика| |AAD|ASCII-коррекция регистра AX перед делением|Десятичная арифметика| |AAM|ASCII-коррекция регистра AX после умножения|Десятичная арифметика| |AAS|ASCII-коррекция после вычитания|Десятичная арифметика| |ADC|Сложение с переносом|Основная арифметика| |ADD|Сложение|Основная арифметика| |AND|Логическое "И"|Основная арифметика| |ARPL|Коррекция поля RPL селектора|Привилегированные| |BOUND|Контроль нахождения индекса массива в границах|Специальные команды| |BSF|Сканирование бита вперед|Работа с битами| |BSR|Сканирование бита назад|Работа с битами| |BSWAP|Перестановка байтов (внутри 32-бит. регистра)|Пересылка данных| |BT|Проверка бита|Работа с битами| |BTC|Проверка бита и дополнение|Работа с битами| |BTR|Проверка бита и сброс в 0|Работа с битами| |BTS|Проверка бита и установка в 1|Работа с битами| |CALL|Вызов процедуры|Переходы и процедуры| |CBW|Преобразование байта в слово|Пересылка данных| |CDQ|Преобразование двойного слова в счетверенное слово|Пересылка данных| |CLC|Сброс флажка переноса|Установка флажков| |CLD|Сброс флажка направления|Установка флажков| |CLI|Сброс флажка прерывания|Установка флажков| |CLTS|Сброс флажка переключения задачи|Привилегированные| |CMC|Инвертирование флажка переноса|Установка флажков| |CMP|Сравнение двух операндов|Основная арифметика| |CMPS|Сравнение цепочечных операндов|Цепочечные команды| |CMPXCHG|Сравнение и обмен|Специальные команды| |CWD|Преобразование слова в двойное слово|Пересылка данных| |CWDE|Преобразование слова в двойное слово|Пересылка данных| |DAA|Десятичная коррекция AL после сложения|Десятичная арифметика| |DAS|Десятичная коррекция AL после вычитания|Десятичная арифметика| |DEC|Декремент на 1|Инкремент и декремент| |DI|Беззнаковое деление|Умножение и деление| |ENTER|Образование стекового кадра для параметров процедуры|Переходы и процедуры| |ES|Универсальная единая команда для сопроцессора с плавающей точкой|Сопроцессор| |F..|Команды сопроцессора с плавающей точкой|Сопроцессор| |HLT|Останов|Привилегированные| |IDIV|Знаковое деление|Умножение и деление| |IMUL|Знаковое умножение|Умножение и деление| |IN|Ввод из порта|Системные команды| |INC|Инкремент на 1|Инкремент и декремент| |INS|Ввод из порта в цепочку|Цепочечные команды| |INT|Вызов процедуры прерывания |Вызов прерывания| |INTO|Вызов процедуры прерывания 4, если OF=1 |Вызов прерывания| |INVD|Недостоверность кэш-памяти |Системные команды| |INVLPG|Недостоверность элемента буфера TLB |Системные команды| |IRET|Возврат из прерывания |Вызов прерывания| |J(cond)|Условная передача управления |Условные команды| |JCXZ-JECXZ|Переход, если значение счетчика равно нулю|Условные команды| |JMP|Безусловная передача управления |Переходы и процедуры| |LAHF|Пересылка из регистра флажков в регистр AH|Установка флажков| |LAR|Загрузка байта прав доступа|Привилегированные| |LDS|Загрузка полного указателя (для DS)|Сегментные регистры| |LEA|Загрузка эффективного адреса |Специальные команды| |LEAVE|Отмена действия команды ENTER перед выходом из процедуры|Переходы и процедуры| |LES|Загрузка полного указателя (для ES) |Сегментные регистры| |LFS|Загрузка полного указателя (для FS) |Сегментные регистры| |LGDT|Загрузка регистра глобальной дескрипторной таблицы |Привилегированные| |LGS|Загрузка полного указателя (для GS) |Сегментные регистры| |LIDT|Загрузка регистра дескрипторной таблицы прерываний |Привилегированные| |LLDT|Загрузка регистра локальной дескрипторной таблицы |Привилегированные| |LMSW|Загрузка слова состояния машины |Привилегированные| |LOCK|Префикс выдачи сигнала LOCK# |Системные команды| |LODS|Загрузка цепочечного операнда в аккумулятор |Цепочечные команды| |LOOP|Управление циклом со счетчиком в регистре CX |Условные команды| |LOOPE-LOOPZ|Управление циклом со счетчиком в регистре CX |Условные команды| |LOOPNE-LOOPNZ|Управление циклом со счетчиком в регистре CX |Условные команды| |LSL|Загрузка предела сегмента |Системные команды| |LSS|Загрузка полного указателя (для SS) |Сегментные регистры| |LTR|Загрузка регистра задачи |Привилегированные| |MOV|Пересылка данных |Пересылка данных| |MOV(spec)|Пересылка в специальные регистры и из них |Привилегированные| |MOVS|Пересылка данных из цепочки в цепочку |Цепочечные команды| |MOVSX|Пересылка со знаковым расширением |Пересылка данных| |MOVZX|Пересылка с нулевым расширением |Пересылка данных| |MUL|Беззнаковое умножение|Умножение и деление| |NEG|Получение дополнительного кода (изменение знака)|Основная арифметика| |NOP|Пустая операция |Пересылка данных| |NOT|Инвертирование |Основная арифметика| |OR|Логическое включающее "ИЛИ" |Основная арифметика| |OUT|Вывод в порт |Системные команды| |OUTS|Вывод цепочки в порт |Цепочечные команды| |POP|Извлечение слова из стека |Работа со стеком| |POPA|Извлечение из стека всех общих регистров |Работа со стеком| |POPF|Извлечение из стека в регистр флажков |Работа со стеком| |PUSH|Засылка операнда в стек |Работа со стеком| |PUSHA|Засылка в стек всех общих регистров |Работа со стеком| |PUSHF|Засылка в стек регистра флажков |Работа со стеком| |RCL|Циклический сдвиг влево с участием флажка CF |Команды сдвига| |RCR|Циклический сдвиг вправо с участием флажка CF |Команды сдвига| |REP|Префикс повторения цепочечной операции |Цепочечные команды| |REPE-REPZ|Префикс повторения цепочечной операции |Цепочечные команды| |REPNE-REPNZ|Префикс повторения цепочечной операции |Цепочечные команды| |RET|Возврат из процедуры |Переходы и процедуры| |ROL|Циклический сдвиг влево |Команды сдвига| |ROR|Циклический сдвиг вправо |Команды сдвига| |SAHF|Пересылка регистра AH в регистр флажков |Установка флажков| |SAL|Сдвиг влево (умножение на 2) |Команды сдвига| |SALC|Установка регистра AL по флажку CF |Установка флажков| |SAR|Сдвиг вправо (знаковое деление на 2) |Команды сдвига| |SBB|Вычитание с заемом |Основная арифметика| |SCAS|Сравнение (сканирование) цепочечных данных |Цепочечные команды| |SET(cond)|Установка байта по условию |Условные команды| |SGDT|Сохранение регистра глобальной дескрипторной таблицы |Привилегированные| |SHL|Сдвиг влево (умножение на 2) |Команды сдвига| |SHLD|Двойной сдвиг влево |Команды сдвига| |SHR|Сдвиг вправо (беззнаковое деление на 2) |Команды сдвига| |SHRD|Двойной сдвиг вправо |Команды сдвига| |SIDT|Сохранение регистра дескрипторной таблицы прерываний |Привилегированные| |SLDT|Сохранение регистра локальной дескрипторной таблицы |Привилегированные| |SMSW|Сохранение слова состояния машины |Привилегированные| |STC|Установка флажка переноса |Установка флажков| |STD|Установка флажка направления |Установка флажков| |STI|Установка флажка прерывания |Установка флажков| |STOS|Сохранение цепочечных данных |Цепочечные команды| |STR|Сохранение регистра задачи |Привилегированные| |SUB|Вычитание |Основная арифметика| |TEST|Логическое сравнение |Основная арифметика| |VERR|Проверка сегмента на считывание |Системные команды| |VERW|Проверка сегмента на запись |Системные команды| |WAIT|Ожидание |Системные команды| |WBINVD|Обратная запись и недостоверность кэш-памяти |Системные команды| |XADD|Обмен и сложение |Специальные команды| |XCHG|Обмен данными - регистр/регистр или регистр/память |Пересылка данных| |XLAT|Перекодирование байта по таблице |Специальные команды| |XOR|Логическое исключающее "ИЛИ" |Основная арифметика| ===== ОСНОВНЫЕ КОМАНДЫ АРИФМЕТИКИ ===== ==== Группа "Основная арифметика" ==== > Команды ADD, OR, ADC, SBB, AND, SUB, XOR, CMP - эти восемь команд можно назвать самыми первыми в системе команд x86 ("первая восьмерка"), достаточно взглянуть на ту таблицу команд, в которой команды расположены в порядке кодов операций. Все эти команды имеют два операнда и совершенно одинаковый формат (три разных формы), как на языке ассемблера, так и в машинных кодах. > Команда TEST также имеет два операнда. Три ее формы почти такие же, как у команд первой восьмерки и отличаются только в деталях. > Команды NEG и NOT имеют только один операнд, их формат намного проще. > Примечание. Команды умножения и деления помещены в свою отдельную группу: Умножение и деление ==== Операнды, коды, форматы ==== > === Порядок операндов === > На языке ассемблера для команды с двумя операндами принято записывать операнды в следующем порядке: CMD dst, src > Здесь CMD - мнемоника команды, dst (destination) - приемник, src (source) - источник. Результат выполнения операции заносится в первый операнд dst. > В операциях вычитания из значения dst вычитается значение src. > Таким образом, операции сложения ADD и вычитания SUB будут выглядить так: dst = dst + src dst = dst - src === Команды с участием флага переноса === > Команда ADC выполняет сложение трех слагаемых: первого (dst) операнда, второго (src) операнда и флага переноса CF (значение 0 или 1). Результат выполнения операции заносится в первый (dst) операнд. > По команде SBB из значения первого (dst) операнда вычитается значение второго (src) операнда. Из полученного результата вычитается значение флага переноса CF (значение 0 или 1). Результат выполнения операции заносится в первый (dst) операнд. > Условно это можно показать так: dst = dst + src + CF dst = dst - src - CF ==== Логические операции ==== > Команды AND, OR, XOR выполняют поразрядные логические операции для двух своих операндов. Для каждой битовой позиции результат определяется так: ==== Команды с одним операндом ==== > Команда NEG выполняет арифметическую операцию вычитания операнда из нуля. Фактически это равносильно изменению знака операнда. > Команда NOT выполняет порязрядную логическую операцию инвертирования, каждый 0 заменяется на 1 и каждая 1 заменяется на 0. ==== Сравнение двух операндов ==== > ==== Установка флажков ==== > ==== ==== >