Главная страница

Ассемблер. Всем добрый день. Сегодня я вас познакомлю с очень интересной, но сложной штукой


Скачать 19.8 Kb.
НазваниеВсем добрый день. Сегодня я вас познакомлю с очень интересной, но сложной штукой
АнкорАссемблер
Дата23.03.2023
Размер19.8 Kb.
Формат файлаdocx
Имя файлаAssemblerScenar.docx
ТипДокументы
#1010010

1-ый слайд:
Всем добрый день. Сегодня я вас познакомлю с очень интересной, но сложной штукой.
Язык ассемблера в IT - это как приручение огня на этапе развития человечества.
Как говорится, когда будешь летать, не забывай с кем ползал).
Приводить какие-то плюсы и минусы языка ассемблера по сравнению с высокоуровневыми яп это тоже самое, что сравнивать фундамент с домом, говоря, что фундамент не нужен, потому что дом крутой.

2-ой слайд:
Ассемблер от языка ассемблера отличается тем, что язык асма это яп, состоящий из команд процессора, представленных в виде символических обозначений, а ассемблер - компилятор этого языка в машинный код.
3-ий слайд:
Язык ассемблера - яп, знание которого автоматически продвигает вас как минимум от джуна
к мидлу, если не к сеньору.
Язык ассемблера — это собирательное название языков низкого уровня: код всё ещё пишет человек, но он уже гораздо ближе к принципам работы компьютера, чем к принципам мышления человека.

Первые ассемблеры были спроектированы Кэтлин Бут в 1947 под ARC2 и Дэвидом Уилером в 1948 под EDSAC, при этом термин «ассемблер» не использовали, просто называя язык «множеством базовых команд»
В итоге язык Ассемблера начали использовать примерно с 1950-го года.

4-ый слайд:
Начать изучать асм сейчас означает: Я хочу разобраться как работает мой код. Стремление человека понять, как и что работает, пожалуй, единственный, верный путь, по которому нужно идти специалисту. Программа на асме - программа без абстракций, здесь можно понять, как работает компьютер. Здесь привычных пониманий абстракций вроде, циклов for, while. В асме вы создаёте этот фундамент сами.
В среде программирования такое иногда случается, когда без асма не обойтись. Потому что высокоуровневые яп не состоянии решать такие задачи.
Сейчас я с вами разберу примерно пять основных тем (не затрагивая операндов, меток, и т.д.), которые предшествуют написанию кода на асме.

5-ый слайд:

СЕМЕЙСТВА ПРОЦЕССОРОВ.

У каждого семейства процессоров ассемблеры будут отличаться, то бишь для семейства x86 процессоров это будет один асм, со своим набором команд, а для ARM это будет другой и другой набор команд. В асме нет кроссплатформенности. Но есть обратная совместимость, поэтому с i386 или intel 80386 (а это прям динозавр) будет работать даже на core i7. Но обратная совместимость работает только в одну сторону, то есть модель 2 будет включать в себя все команды с модели 1, но не наоборот.

6-ой слайд:

РЕГИСТРЫ
По сути своей, это маленькие ячейки памяти на процессоре. В них помещаются инструкции из памяти для дальнейшего их выполнения.

Разделяют несколько типов, большинство представлено на слайде
Указательные.
Сегментные.
Управляющие.
Флаги.
Индексные.
Програмно-недоступные.
Програмно-доступные.
Регистры общего назначения.

7-ой слайд:
Регистры общего назначения:
AH, AL, AX, EAX, RAX - используется для хранения результатов действий вычислений или каких-либо операций.
BH, BL, BX, EBX, RBX - для косвенной адресации памяти .

CH, CL, CX, ECX, RCX - используется как счётчик циклов. Также исп. для счётчика в инструкциях rep, loop.

DH, DL, DX, EDX, RDX - для сохранения большей части результата.
И остальные, например ZF, для cmp – compare, сравнить. Если равны - ZF = 1. Иначе ноль. А дальше jn, или jne, или ещё какой-нибудь jump. Примерно такой штукой на асме пишется if.

8-ой слайд:
КОМПИЛЯТОРЫ.
Есть множество компиляторов, диалектов. MASM, FASM, NASM, TASM, gas

Они отличаются друг от друга не только синтаксисом или набором директив, но и документацией, наличием примеров кода, сообществом.
Формат записи команд тоже может сильно отличаться, это разделение обусловлено двумя разными синтаксисами
Первая от компании Intel (используется в большинстве случаев, самая здоровая)
Вторая - AT&T - меншьее признание программистов.

Вообще, формат записи команд следующий:
Сначало идёт название команды, которая обозначает какое-то действие, следом её операнд, который разделяются запятой. Операнд может быть один, два, или вообще отсутствовать. Всё зависит от команды.
9-ый слайд:
СЕГМЕНТЫ ПРОГРАММЫ.

Сегментная адресация памяти размещает сегменты программы в различных местах оп.

Code Segment хранит начальный адрес сегмента кода, что содержит все инструкции, которые должны будут выполнены.

Data Segment хранит начальный адрес сегмента данных(содержит переменные - например строки) Stack Segment хранит начальный адрес стека.

SS (Stack Segment) — сегмент, хранящий начальный адрес стека.

Extra Segment, FS, GS дополнительные сегменты, могут вообще не использоваться приложениями.

Программы под архитектурой x86 используют сегментную адресацию памяти. В данном случае операционная система (исключая DOS) может размещать сегменты программы в различных местах оперативной памяти или даже временно на энергонезависимую память. Это полезно, но ведь нужно как-то назначать адреса в исполняемой программе. Решили, что для формирования конечного адреса необходим адрес начала какого-либо сегмента и смещение относительно этого сегмента. Даже если адрес сегмента каким-либо образом изменится, но мы знаем его, то можно обратиться к нужным для нас данным.

Сегменты, описанные выше, представлены разными разделами (секциями) в языке ассемблера. Во время написания кода можно использовать слово segment или section, но мы используем section. Самые используемые секции в программе — это: section .txt — секция с кодом программы. section .data — секция с инициализированными данными или переменными. Это данные, для которых память выделена и присвоено значение. section .bss — секция с неинициализированными данными или зарезервированными байтами. Это данные, для которых память выделена, но значение может изменяться во время выполнения программы.
.code - сегмент кода
.stack
.data
.data?
.const

10-ый слайд:

ПРОЦЕСС КОМПИЛЯЦИИ
Мы не будем сейчас разбирать, как устроен компилятор внутри. Нам нужно получить общее представление того, что происходит внутри.
Поэтому, просто. Две вещи.
Происходит компиляция в два прохода.
Компилируется каждая строка в программе, наборы операндов, различные директивы, коды операций, символические имена. Происходит расширение макросов и т. д. и т. д. А во втором проходе получаются объектные модули, (.o или .obj).
1. Идентификация
2. Таблица точек входа.
3. Таблица внешних ссылок.
4. Машинные команды и константы.
5. Словарь перераспределения.
6. Конец модуля.

После компиляции мы получаем какой-то объектный файл, а не exe. Почему? Дело в том, что компилятор транслирует каждый модуль программы как отдельную единицу. В лучшем случае с одного файла asm у нас появится один объектный модуль, а с большими программами могут быть сразу несколько об. Модулей. Каждый из них занимает своё собственное адресное пространство. То есть задача компоновщика расставить по местам, скомпоновать, связать все ссылки на определённые имена, которые он собирает. И в итоге получить исполняемый файл.
В чём смысл? Все эти действия мог бы выполнить и один компилятор, но сложность заключалась бы в том, что при дальнейшем изменении одного модуля, компилятору пришлось бы заново компилировать их все. Просто не морочьте себе голову, так быстрее.

11-ый слайд:

  • Для того, чтобы писать программы на Ассемблере, нужно думать как кремний:

  • понимать архитектуру процессора;

  • знать устройство железа, которое работает с этим процессором;

  • знать все команды, которые относятся именно к этому типу процессоров;

  • уметь работать с данными в побайтовом режиме (забудьте о строках и массивах, ведь ваш максимум — это одна буква);

  • понимать, как в ограниченных условиях реализовать нужную функциональность.

  • Теперь добавьте к этому отсутствие большинства привычных библиотек для работы с чем угодно, сложность чтения текста программы, медленную скорость разработки — и вы получите полное представление о программировании на Ассемблере.

17-ый слайд:
Ну, и, форумы асма.
Языку асма уже за 70 лет, но он не собирается на пенсию, хоть его сообщество прошло даже пенсию. Я приложил пару форумов с разными диалектами. Если кому интересно - можете посмотреть, какими были форумы в 2004-ом году.

Императи́вное программи́рование — это парадигма программирования (стиль написания исходного кода компьютерной программы), для которой характерно следующее: в исходном коде программы записываются инструкции (команды);


написать администратору сайта