Язык ассемблера. Рабочие регистры и команды.
XalionВ прошлой статье мы рассказали про язык нижнего уровня для процессора — язык ассемблера. Под разные процессоры создаются свои диалекты, потому
что архитектуры отличаются разрядностью, доступными регистрами
и способами использования системных вызовов ОС.
Системных вызовов мы касались в вводной статье про ОС.
Сегодня начнём изучение диалекта ассемблера NASM. Он работает на макОС, линукс и виндовс. Для виндовс, чаще пишут на его диалекте от майкрософт — MASM.
Среда разработки
Мы будем писать код в онлайн редакторе nasm по двум причинам:
- Алгоритм компиляции и линковки на разных ОС отличается. Получится по три картинки на один фрагмент кода.
- Для ассемблера нет оффлайновой приятной среды разработки.
В планах канала изучить терминал и его функционал, поэтому мы вспомним ассемблер в статьях про терминал.
Регистры
В языке ассемблера есть восемь специальных регистров для результатов команд: EAX, EBX, ECX, EDX, ESP EBP, ESI и EDI. В них можно записывать любые данные, но эти регистры перезаписываются командами. Объём регистров зависит от разрядности процессора. Мы будем писать код для 32х
разрядных процессоров.
Сегодня пройдем первые четыре, в следующей статье — оставшиеся четыре.
EAX — буферный регистр
Хранит промежуточные данные при вычислениях. Его перезаписывают команда умножения и деления.
Он состоит из одного 16-битного регистра AX, он делится на два 8-битных куска: AH и AL.
EBX — хранилище адресов оперативки.
В регистре EBX обычно хранят адреса данных из оперативной памяти, но можно хранить любые другие данные. Состоит из 16-битного регистра BX, он делится на два 8-битных регистра BH и BL.
ECX — счётчик для циклов.
Цикл выполнил функцию или строчку один раз, из ECX вычитается единица. Если в ЕCX остаётся ноль — цикл закончен и программа идёт дальше.
Состоит из 16-битного регистра CX, он делится на два 8-битных регистра CH и CL.
EDX — для остатка от деления.
В языке ассемблера при делении, результат записывается в EAX, а остаток в EDX.
Если деление без остатка — в EDX ноль перезаписывается на ноль.
Состоит из 16-битного регистра DX, он делится на два 8-битных регистра DH и DL.
Команды
Для простейших операциий в ассемблере, нужно знать команды присвоения, арифметические команды, циклы и команды условных переходов.
Циклы и условные переходы, пройдем в следующих статьях про ассемблер.
В ассемблере не используются математические знаки, используются слова-сокращения на английском.
MOV — присвоение
Она работает с числами, регистрами и адресами памяти. Эта команда связанна с темой типов адресации в памяти.
ADD — сложение
После слова ADD, ставится первое слагаемое — туда запишется ответ. На второе место можно написать регистр, адрес или число.
Второе слагаемое — регистр: значение первого регитстра + значение второго
Второе слагаемое — адрес: значение первого + значение ячейки по адресу.
Второе слагаемое — число: значение первого + число.
SUB — вычитание
После слова SUB, ставится уменьшаемое — туда запишется ответ. На место вычитаемого можно написать регистр, адрес или число.
Вычитаемое — регистр: значение уменьшаемого – значение вычитаемого.
Вычитаемое — адрес: значение уменьшаемого – значение из ячейки по адресу.
Вычитаемое — число: значение уменьшаемого – число.
MUL — произведение
После слова MUL стоит только регистр и только один. Он умножается на значение из EAX и записывает его туда же, в EAX.
DIV — деление
После слова DIV стоит только регистр и только один. Он делит значение EAX на себя и записывает его туда же. Если есть остаток, он записывается в регистр остатка EDX.
В следующей статье разберём оставшиеся четыре регистра и их команды.