Assembler #2 Прыжки, вызовы, сравнения

Assembler #2 Прыжки, вызовы, сравнения

https://t.me/Torchik_Ru

Доброго времени суток, господа. Сегодня продолжаем наше изучение ЯП 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!", с использованием подпрограммы.

Всем спасибо за внимание. До новых встреч!

Report Page