Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
azrael
6 лет назад

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


Доброго времени суток, господа. Сегодня продолжаем наше изучение ЯП Assembler.

Флаги

Флаги, как и регистры, содержат данные. Флаги содержат только 1 бит. Их значение может быть "true" или "false". На этой wiki-странице Вы можете увидеть таблицу с пояснениями к каждому флагу.

Указатели

Указатели тоже являются регистрами и хранят данные. Они хранят указатель. Это значит, что внутри них находится адрес для обращения к месту в памяти.
image.png
Эта таблица показывает примеры, как может использовать тот, или иной, указатель.

Поток управления

Весь код запускается сверху вниз. Этот называется потоком управления. Регистр rip содержит адрес к команде, что будет запущена следующей. После каждой выполненной иструкции его значение увеличивается на 1. Это и даёт возможность выполнять код строка за строкой.image.png

Прыжки

Прыжки могут быть использованы для перехода к разным частям кода, что базируются на лейблах. Они используются чтобы переадресовывать поток управления.
Формат записи прыжка такой: jmp label. Пример:
_start
jmp _start
В этом примере мы получим вечный цикл. Но для понимания работы прыжков этого достаточно.

Сравнения

Сравнения позволяют программе взять разные части кода и сравнить их между собой. Сравнения позволяют сравнивать между собой регистры.
Формат записи команды для сравнения: cmp register, register/value. Пример:
cmp rax, 80
cmp rax, rbx

Сравнения с флагами

После сравнения определённые флаги получают значение. Пример:
image.png

Прыжки-сравнения

После сравления может быть совершен прыжок-сравнение. Прыжки-сравнения базируются на флагах. Таблица:
image.png

Примеры:

Этот код прыгает с лейблу _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!", с использованием подпрограммы.
image.png
Всем спасибо за внимание. До новый встреч!

18
1.495 GOLOS
На Golos с August 2018
Комментарии (2)
Сортировать по:
Сначала старые