Assembler #2 Прыжки, вызовы, сравнения
Доброго времени суток, господа. Сегодня продолжаем наше изучение ЯП Assembler.
Флаги
Флаги, как и регистры, содержат данные. Флаги содержат только 1 бит. Их значение может быть "true" или "false". На этой wiki-странице Вы можете увидеть таблицу с пояснениями к каждому флагу.
Указатели
Указатели тоже являются регистрами и хранят данные. Они хранят указатель. Это значит, что внутри них находится адрес для обращения к месту в памяти.
Эта таблица показывает примеры, как может использовать тот, или иной, указатель.
Поток управления
Весь код запускается сверху вниз. Этот называется потоком управления. Регистр rip
содержит адрес к команде, что будет запущена следующей. После каждой выполненной иструкции его значение увеличивается на 1. Это и даёт возможность выполнять код строка за строкой.
Прыжки
Прыжки могут быть использованы для перехода к разным частям кода, что базируются на лейблах. Они используются чтобы переадресовывать поток управления.
Формат записи прыжка такой: jmp label
. Пример:
_start
jmp _start
В этом примере мы получим вечный цикл. Но для понимания работы прыжков этого достаточно.
Сравнения
Сравнения позволяют программе взять разные части кода и сравнить их между собой. Сравнения позволяют сравнивать между собой регистры.
Формат записи команды для сравнения: cmp register, register/value
. Пример:
cmp rax, 80
cmp rax, rbx
Сравнения с флагами
После сравнения определённые флаги получают значение. Пример:
Прыжки-сравнения
После сравления может быть совершен прыжок-сравнение. Прыжки-сравнения базируются на флагах. Таблица:
Примеры:
Этот код прыгает с лейблу _doThis
, если значение в регистре rax
равно 23:
cmp rax, 23
je _doThis
Этот код прыгает с лейблу _doThis
, если значение в регистре rax
больше значения в регистре rbx
:
cmp rax, rbx
jg _doThis
Регистры как указатели
Стандартные регистры могут быть использованы как указатели. Чтобы придать регистру функции указателя мы должны использовать квадратные скобки. Пример:
Этот код помещает в регистр rax
значение регистра rbx
:
mov rax, rbx
Этот код помещает в регистр rax
значение, что ссылается на регистр rbx
:
mov rax, [rbx]
Вызовы
Вызовы и прыжки - схожие вещи. Но когда мы используем call
, то мы должны указать в окончании лейбла, что мы вызываем команду ret
, для возврата из него. Такие лейблы назыаются подпрограммами. Вот вариант нашей программы, что выводит "Hello, World!", с использованием подпрограммы.
Всем спасибо за внимание. До новый встреч!