2015. Таблица - справочник по командам NASM (1110694)
Текст из файла
Disclaimer
Данный справочник составил студент 103 группы (2014 – 2015 год обучения) Аграновский Михаил.
Вы читаете версию от 24.08.2015. Правка и распространение приветствуются.
Надеюсь, что этот документ поможет Вам в успешном прохождении курса по Архитектуре ЭВМ и языку ассемблера!
Ахтунг! В тексте могут содержаться ошибки и неточности – будьте осторожны.
Для понимания, что же такое регистр, (если оно не пришло на лекции) советую прочитать следующий .pdf – документ: http://www.itsusu.ru/pdf/information_technology/work_11.pdf
(Возможно, Вы его уже скачали под именем “Ассемблер NASM для процессоров с архитектурой IA-32. Адресация. Флаги. Вызов внешних подпрограмм.pdf”)
Желаю удачи!
Оглавление
Disclaimer 0
Оглавление 1
Таблица команд 2
Сложение и вычитание 2
Умножение и деление 3
Перемещение данных и приведение типов 5
Сдвиги и вращения 6
Команды работы с битами 10
Команды сканирования битов 10
Команды проверки и модификации битов 10
Организация стека 11
Организация стекового фрейма функции. 12
Регистр EFLAGS 14
Условные переходы (условная передача управления) 16
Условная передача данных 18
Строковые инструкции 19
Числа с плавающей точкой. Сопроцессор x87. 22
Еще команды процессора x86: 24
Средства ввода/вывода io.inc 25
Источники 27
Таблица команд
КОМАНДА | ОПИСАНИЕ | СИНТАКСИС | Комментарий | |||||||||||||||||||||
XCHG op1, op2 | Обмен значениями. |
| Требование: sizeof(op1) == sizeof(op2) | |||||||||||||||||||||
BSWAP op1 | Перевод op1 из одной формы адресации в другую (Big-endian <-> Little-endian). Иначе говоря, разворот байтов. |
| На флаги не влияет. http://www.c-jump.com/CIS77/ASM/DataTypes/T77_0230_bswap.htm | |||||||||||||||||||||
Сложение и вычитание | ||||||||||||||||||||||||
NEG op1 | Изменение знака (получение двоичного дополнения к) op1. Алгоритм работы:
| Команда используется для формирования двоичного дополнения операнда в памяти или регистре. Операция двоичного дополнения предполагает инвертирование всех разрядов операнда с последующим сложением операнда с двоичной единицей. Если операнд отрицательный, то операция neg над ним означает получение его модуля. | ||||||||||||||||||||||
ADD op1, op2 | Сложение | Требование: sizeof(op1) == sizeof(op2) | ||||||||||||||||||||||
ADC op1, op2 | ADC: SBB: Вычитание двух целочисленных двоичных операндов с учётом флага CF. Состояние флага CF представляет собой заём от предыдущего вычитания. op1 = op1 - op2 - CF | Вроде бы:
| Флаги: (для обеих операций) OF=r SF=r ZF=r AF=r PF=r CF=r imm [immediate value]– непосредственная константа (число) | |||||||||||||||||||||
AND op1, op2 | Побитовое "и" | Неразрушающий аналог: TEST op1, op2 | ||||||||||||||||||||||
SUB op1, op2 | Вычитание | Неразрушающий аналог: CMP op1, op2 | ||||||||||||||||||||||
Умножение и деление | ||||||||||||||||||||||||
MUL op1 | Команда выполняет целочисленное умножение без учёта знака. Явно задается один из множителей. Второй множитель задается неявно в регистре AL/AX/EAX (это местоположение фиксировано). Местоположение результата умножения определяется кодом операции и размером множителей:
|
| Флаги: Если старшая половина результата нулевая: OF=CF=0 SF=? ZF=? AF=? PF=?. Если старшая половина результата ненулевая: OF=CF=1 SF=? ZF=? AF=? PF=?. | |||||||||||||||||||||
IMUL | Умножение со знаком Команда имеет три формы, различающиеся количеством операндов:
| (не совсем совпадает с лекцией)
imm должен по размеру совпадать с первым множителем или быть размерности до байта. | Флаги:
Двухоперандная форма не рекомендуема к использованию при умножении на imm – поддерживается не всеми машинами. | |||||||||||||||||||||
DIV op1 | Деление без знака. Команда выполняет целочисленное деление без учёта знака. Делимое задается неявно, и его размер зависит от размера делителя, который явно указывается в команде. Местоположения делимого, делителя, частного и остатка — в зависимости от их размерности:
|
| ||||||||||||||||||||||
IDIV | Деление со знаком. Команда выполняет целочисленное деление со знаком. Делимое задается неявно, и его размер зависит от размера делителя, который явно указывается в команде. Местоположения делимого, делителя, частного и остатка — в зависимости от их размерности:
|
| ||||||||||||||||||||||
Перемещение данных и приведение типов | ||||||||||||||||||||||||
CBW CWDE CWD CDQ | CBW — преобразование байта в слово. Команда копирует знаковый бит регистра AL/AX на все биты регистра АН/ЕАХ (используется при подготовке к знаковому делению): movsx ax, al CWD, CWDE — преобразование слова в двойное слово. Команда CWD копирует значение старшего бита регистра АХ на все биты регистра DX (используется при подготовке к знаковому делению): mov dx, ax sar dx, 15 CWDE же: movsx eax, ax CDQ — преобразование двойного слова в учетверённое слово. Команда CDQ копирует знаковый бит регистра ЕАХ на все биты регистра EDX (используется при подготовке к знаковому делению): mov edx, eax sar edx, 31 | Convert Byte to Word; Convert Word to Dword; Convert Double to Quad. | ||||||||||||||||||||||
MOVZX op1, op2 MOVSX op1, op2 | op2 преобразуется к типу op1 и записывается в него. При этом: |
| movsx (move signed extension); movzx (move zero extension). Например: movzx ebx, bx ; ebx ← 0x0000A67B movsx eax, bx ; eax ← 0xFFFFA67B movsx ecx, bl ; ecx ← 0x0000007B | |||||||||||||||||||||
LEA op1, op2 | Получение эффективного адреса (смещения) источника. При этом обращение к памяти (op2) не производится (несмотря на применение квадратных скобок), а, вместо этого, в регистр (op1) заносится адрес, вычисленный обычным способом для второго операнда. (В op1 запишутся младшие sizeof(op1) байт вычисленного адреса). | - r (16) / 32, m Например: lea eax, [ebx+esi*2+2] | «Load Effective Address» Опр. Эффективный адрес — адрес, по которому происходит обращение к памяти; численно совпадает с виртуальным адресом.
http://www.konetlasc..ru/cdo/programmes/assembler/lea.html Суть: Пусть имеются переменные int *a, *b и eax = a, ebx = b. Тогда: lea eax, [ebx + 4]; <=> a = b + 4 | |||||||||||||||||||||
Сдвиги и вращения | ||||||||||||||||||||||||
SHL op1, op2 SHR op1, op2 | Логический (беззнаковый) сдвиг влево / вправо Для SHR: Сдвиг всех битов операнда вправо на количество разрядов, указанное операндом op2, при этом выдвигаемый справа бит становится значением флага переноса CF. Одновременно слева в операнд вдвигается нулевой бит. |
| Флаги: SHR: Флаг CF содержит значение последнего выдвинутого из операнда бита. При сдвиге на 1 бит флаг OF устанавливается равным старшему значащему биту исходного операнда. Если количество сдвигов (значение op2) больше 1, то OF=0. SHL: CF=r OF=?r SF=r ZF=r PF=r AF=? Флаг CF содержит значение последнего выдвинутого из операнда бита. Флаг OF представляет интерес, если сдвиг осуществляется на один разряд. При сдвиге на несколько разрядов его значение не определено. По его значению можно судить об изменении знакового разряда операнда:
| |||||||||||||||||||||
ROL op1, number or CL ROR op1, number or CL | Циклический сдвиг влево / вправо ROR: При циклическом сдвиге разрядов операнда вправо его младший выдвигаемый бит вдвигается в op1 слева и становится одновременно значением старшего бита операнда и флага переноса CF. ROL: При циклическом сдвиге разрядов операнда влево его старший выдвигаемый бит вдвигается в операнд справа и становится одновременно значением младшего бита операнда и флага переноса CF. |
| Флаги: ROR:
ROL: CF=r OF=?r SF=r ZF=r PF=r AF=?
| |||||||||||||||||||||
RCR, RCL | Циклический сдвиг влево / вправо с учетом CF: | |||||||||||||||||||||||
SAR op1, op2 | SAR: Арифметический сдвиг вправо. Сдвиг всех битов операнда вправо на количество разрядов, указанное операндом количество_сдвигов, при этом выдвигаемый справа бит становится значением флага переноса CF. По мере сдвига вправо освобождающиеся места заполняются значением знакового разряда. SAL: - одновременно справа в операнд вдвигается нулевой бит; - указанные выше два действия повторяются количество раз, равное значению второго операнда. | SAR операнд, количество_сдвигов | Флаги CF=r OF=?r SF=r ZF=r PF=r AF=? Флаг CF содержит значение последнего выдвинутого из операнда бита. Команда SAR всегда сбрасывает в ноль флаг OF в операциях сдвига на один разряд. |
Команды работы с битами
Работать с отдельными битами операндов можно, используя логические операции и сдвиги. Однако кроме них в системе команд x86 существуют специальные команды для работы с битами: это команды сканирования битов и команды проверки (и модификации) битов.
КОМАНДА | ОПИСАНИЕ | СИНТАКСИС | Комментарий |
Команды сканирования битов | |||
BSF op1, op2 BSR op1, op2 | Поиск самого правого (самого левого) бита-единицы. Команда BSF (BSR) просматривает биты op2 от младшего (т.е. самого правого) к старшему (BSR - от старшего к младшему) и помещает индекс [в обоих случаях отсчитываемый от младшего бита] первого единичного бита в регистр. Биты нумеруются, начиная с нуля. Если единичный бит найден, то флаг нуля сбрасывается (ZF=0). Если все биты нулевые, то флаг нуля устанавливается (ZF=1), а значение первого операнда будет неопределённым (на разных процессорах может быть по-разному). |
| |
Команды проверки и модификации битов | |||
BT op1, op2 | Копирует из слова op1 значение проверяемого бита (номер бита – op2) в флаг CF. После этого можно выполнить условный переход командами JC или JNC, в зависимости от значения бита. |
| Bite Test |
BTR | Копирует значение бита в флаг CF и затем сбрасывает его. | Эти команды удобны тем, что можно совместить проверку бита и присвоение ему нового значения. | |
BTS | Копирует значение бита в флаг CF и затем устанавливает его в 1 | ||
BTC | Копирует значение бита в флаг CF и затем инвертирует его |
Организация стека
КОМАНДА | ОПИСАНИЕ | СИНТАКСИС | Комментарий |
PUSH op1 | Помещение в стек. sub esp, 4 mov [esp], op1 | - r/m/imm | |
POP op1 | Извлечение из стека. Команда восстанавливает содержимое вершины стека в регистр, ячейку памяти или сегментный регистр, после чего значение ESP увеличивается на 4: mov op1, [esp] add esp, 4 | - r/m | Недопустимо восстановление значения в сегментный регистр CS. |
LEAVE | Эквивалентна применению 2-х команд: MOV ESP, EBP; (уничтожили фрейм) POP EBP; вернулись на место стека, откуда функция была вызвана. | ||
CALL func_name | В стек заносится адрес возврата и производится передача управления | -r/m/imm (имя метки / непосредственно адрес в памяти) | |
RET | Pop'ит с вершины стека 4-байта и записывает их в регистр EIP. Трактует их как адрес возврата (передает управление по этому адресу) | return | |
RET op1 | Относится к соглашению stdcall, заключающемуся в том, что вызываемая функция сама снимает со стека свои аргументы. Делается это просто: ret num; где num = 4 * число_аргументов | Как следствие, соглашение stdcall не позволяет реализовывать функции с переменным числом параметров, передаваемых по значению через стек. |
Организация стекового фрейма функции.
Опр.: Фрейм – блок памяти на стеке, содержащий данный данного вызова функции.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.