АССЕМБЛЕР В 2023

АССЕМБЛЕР В 2023. Первый и последний урок.
Не смотря на всю сложность “низкоуровневости”, чтобы читать элементарный ассембли, знать нужно гораздо меньше чем вам кажется.

Я wndtn, мне 20 c чем-то лет, и я изучаю computer science и программирую ~10 лет.
Я into С++, и всякие low-level штуки.
У меня есть небольшой проект, xplatform, который вы сможете найти на github, и через него практиковаться в изучении всей базы программирования, и если вам повезет(если вы упорный), вы станете хорошим программистом %)
Если нужна помощь в программировании 1 на 1, чекайте ссылки .
всем добра
Телега – https://t.me/wndtn

Расшифровка видео
0:00
а Сэндлер 2023 году
0:02
да-да но я вам сейчас покажу что это
0:05
может быть полезно сложность будет
0:07
немножко нарастать но все равно
0:08
держитесь и сразу к делу А в процессе
0:10
уже будем объяснять что-то как пуск
0:13
во-первых ассемблер Это такой язык
0:15
программирования как и все только супер
0:16
низкоуровневые Вот пример Hello world на
0:18
плюсах бетоне и Java А вот примерно
0:21
одном из самых популярных ассемиров в
0:23
первом случае даже не подготовленный
0:25
человек может предположить что примерно
0:26
происходит со сэндлером уже все сложнее
0:28
Мы конечно же Можем сейчас скачать Amber
0:31
как и другой язык программирования и
0:33
начать что-то на него программировать но
0:34
эту мысль я сразу хочу прервать и
0:37
ответить на главный вопрос зачем вообще
0:39
программировать на самом деле в
0:40
современном мире ответ мало кто в
0:43
современном мире программирует на самом
0:44
деле ребят Оставьте его изучают чтобы
0:46
читать и не писать И периодически что-то
0:48
в нем исправлять но и это происходит на
0:50
достаточно продвинутом уровне вот
0:52
элементарный пример как мы делали
0:53
обратный инженеринг кейгена и подбирали
0:55
ключ чистобли или на контрасте ребята
1:00
математики чтобы посмотреть как Intel
1:02
реализовал работу с матрицами ну а мы
1:05
сейчас с вами пойдем еще дальше и
1:06
посмотрим на сэмблер с другого ракурса
1:08
Именно поизучаем его на примере
1:09
нахождение багов компиляторах Да ну и в
1:13
целом за несколько минут просто немножко
1:14
прокачаем свое понимание
1:15
программирование выразим уважение нашим
1:17
старичкам программистам кто реально
1:18
кодил на самом деле в прошлом возможно
1:20
кто-то такие есть я вам просто на
1:22
хорошем примере покажу как каждый из вас
1:24
может без особого опыта читать ассемблер
1:26
и ловить баги просто глядя на него Итак
1:28
главный вариант этого видоса ассемблер
1:31
просто нужно уметь читать Джим Келлер
1:33
человек который внес свой вклад в
1:35
развитие X8 что архитектуры на который
1:36
работает 99 процентов
1:38
и Облачный инфраструктуры который также
1:41
внес свой вклад в развитие архитектуры
1:43
под которой весь Мобайл планшеты и весь
1:46
Ну и в общем умный мужик сказал
1:48
следующее 90 процентов мире используют
1:51
25 обходов а 80 процентов софта 6 вот
1:55
это как раз таки об коды самая близкая
1:57
аналогия с высокоуровневыми языками это
1:59
как
2:00
функции которые делают очень примитивные
2:02
операции Ну и 80 процентов с автомобиля
2:04
работает на 5-6 из них а именно добавить
2:07
вычесть сравнить ветвления и перемещение
2:10
все в нашем примере Hello world у нас
2:13
вообще два обхода это перемещение и
2:15
системный вызов то есть по сути вся
2:16
программа просто работает на новых
2:18
перемещая в разные данные Но несмотря на
2:20
то что в большинстве софта используется
2:22
очень мало обходов их на самом деле
2:24
сотни и тысячи и Давайте посмотрим вот
2:26
на такую картинку где мы видим что у нас
2:28
есть процессоры Давайте возьмем x86 ARM
2:30
и 35 процессоры это Железяки которые
2:33
создаются по определенным спецификациям
2:35
в которых написано что и как делает
2:37
процессор примеру У нас есть Intel Core
2:39
i5 он сделан на архитектуре x864 и
2:42
скажем поколение у него skylake То есть
2:45
это то самое как Intel его наполнил
2:47
сколько кэша сколько ядер как что с чем
2:50
взаимодействует и так далее а уже как
2:51
все это потрогать и заставить работать
2:53
это спецификация в простонародье Она
2:56
известна также под другими наречиями
2:57
например набор команд или
3:00
у Intel есть бесплатный мануал для
3:01
разработчиков где описано вся эта
3:03
спецификация почти для всех их
3:05
процессоров если мы тут сделаем Control
3:07
F И найдём наш муфта увидим сотни
3:09
совпадений что и как можно делать это
3:10
инструкцией но по существу это взять
3:12
что-то и положить куда-то важнее немного
3:15
другое вот наш код и вот они наши новые
3:17
когда мы их вызываем процессор исполняет
3:19
как раз таки этот самый Move и
3:21
спецификации Один в один мнимо
3:23
некрасимбера равно то что написано тут
3:25
Но помимо всей вот этой базы на которой
3:28
работает большая часть софта конечно же
3:29
есть и более сложные тяжёлые инструкции
3:31
мне всегда нравится приводить пример
3:33
именно тригонометрии потому что
3:34
какой-нибудь синус или косинус сжирают
3:36
по 200-300 циклов процессора в то время
3:38
как мол это плюс-минус один цикл И
3:41
помимо инструкции конечно же есть что-то
3:44
ещё например такие штуки как регистры То
3:46
есть это самая быстрая память процессоре
3:48
который Доступ буквально моментальный
3:50
вот примерный контраст скорости доступа
3:52
к разной памяти в компьютере
3:55
регистр незамысловато есть также простые
3:58
и маленькие А также есть сложные и
4:00
большие ну и сверху Сюда можно положить
4:02
то что есть разные моды адресации пример
4:04
Вы можете просто обратиться в какой-то
4:06
регистр по названию А можете прыгнуть
4:08
прямо в конкретный адрес памяти но все
4:11
это вы забудете примерно через 10 минут
4:13
после просмотра если не начать это
4:15
как-то использовать поэтому Давайте
4:16
посмотрим что даже с этими знаниями мы
4:18
уже можем сделать но перед этим то что
4:21
мы сейчас обсуждаем это находится в
4:22
категории сложно но войти есть категории
4:24
просто там лежит самый простой быстрый
4:26
способ ворваться сюда и это все еще
4:28
тестирование У меня есть два знакомых
4:30
тестера на High позициях оба они в голос
4:32
кричат что тестер который умеет кодинг
4:34
это дорого и круто именно Такая позиция
4:36
есть в курсах у skillfactory
4:38
тестирование qa только еще куча соуса из
4:40
питона сверху то есть помимо ядра qi в
4:43
котором вы узнаете про сноу то есть что
4:45
такое ручное и тестирование Как писать
4:46
Юнит тесты вы также погоняете и
4:48
регрессионные тестирование и
4:50
интеграционное на разных тестовых
4:52
контурах Ну и плюсик того что там будет
4:54
кодинг компании любит тестеров имеет
4:56
кодить плюс Это хороший претензии на то
4:58
чтобы из qway в перспективе сделать
4:59
транзишен именно в программировании Ну а
5:02
у SF в плане организации все на прежнем
5:03
уровне очень много практики и только
5:05
самые важные теория помощь в поиске
5:07
работы продакшн Задача от настоящих
5:09
компаний Ну и плотная скидка в 45
5:11
процентов плюс курс по нейросетям в
5:13
подарок вот поэтому промо проверяйте
5:15
описание или сканировать qr-код Ну а тем
5:18
временем это самый популярный инструмент
5:20
для всех кто хоть как-то работает
5:21
сэндлером и не только компайлорэкспор
5:24
сделанный в этом году находится в топе
5:25
онлайн инструментов для программистов мы
5:28
можем вбить сюда код на многих языках и
5:30
увидеть либо ассемблер либо скажем если
5:32
это патина реджава их байт-код
5:34
стандартный пример тут это квадратный
5:35
корень и если
5:36
мы тут можем выбрать компилятор и его
5:39
версию а также платформу с 86 ARM риск 5
5:42
мипс в общем Железяки вы также можете
5:45
смотреть на Сэндлер и средствами ваших
5:46
компиляторов и различных инструментов но
5:48
здесь это просто сделано удобнее есть
5:50
все версии компиляторов и много железа
5:52
ну и Наверное это стоит тоже объяснить
5:54
потому что возможно тут есть самый
5:56
маленький разработчики которые тоже
5:57
хотят успевать за мысли а это сердце
5:59
очень высокий уровень кода который
6:01
сделан для удобства людей и Именно его
6:04
вы будете писать и читать это машинный
6:06
код который человеку понять нереально
6:08
нужен хоть какой-то контекст потому что
6:10
вот это все может значить что угодно
6:12
выключить компьютер вывести красный
6:14
пиксель в левом углу монитора
6:16
переместить что-то из одного регистр
6:17
другой и так далее и ваши сорбцы перед
6:20
тем как они станут машинным кодом
6:21
компилируется именно в ассембрикот
6:23
ассемблером Ну и уже сейчас совсем вот
6:26
этим теоретическим соусом мы можем
6:28
перейти к главному нашему примеру это
6:30
баг в компиляторы GTC внимание около
6:33
двух лет назад один человек на рейде
6:34
написал пост который можно резюмировать
6:36
до одного предложения
6:39
если там включен любой уровень
6:41
оптимизации Ну и такого конечно же быть
6:44
по логике не должна Этот человек сто раз
6:46
перепроверил убедился в том что он прав
6:47
а теперь вопрос Сколько из вас
6:49
сталкивалась с тем что вы написали код
6:51
вывод у вас неправильные и вы сидите и
6:54
думаете Черт побери я сделал правильно
6:56
что не так в 99 и 9 процентах в периоде
6:59
это наша ошибка я согласен нас всех
7:02
пропачивают инфой самого старта нашей
7:04
карьеры что компиляторы умные и скорее
7:06
всего ошибка в нашем коде но это не
7:09
всегда так ближе к сути самый простой
7:11
код который смог спровоцировать баг
7:13
описанный на реддите это вот этот вот
7:15
кусок си и бак устранили только 12
7:17
версии меньше двух лет назад код очень
7:20
простой но я все-таки поясню цикл for
7:22
там для переменных с нулями
7:23
инициализация условия цикла пока и
7:26
меньше числа Заходим в тело проверяем
7:28
есть Джей меньше а это возвращаем
7:30
единичку то есть какая-то ошибка Если
7:32
этого так и не произошло возвращаем 0 и
7:34
все окей условия это никогда не будет
7:37
соблюдено потому что Джей не может быть
7:39
меньше Ай по логике кода Ну и Давайте
7:41
посмотрим первая компилируем без
7:44
оптимизации примерно половину вы тут уже
7:47
знаете этому что-то куда-то двигается
7:49
самый первые две строчки вы будете
7:50
видеть везде даже в пустые функции
7:52
например вот так
7:55
rbp и распирегистр это специальный
7:57
регистры для работы со стек фреймами
7:59
каждый вызов функций ложится на стек и
8:01
внутри фрейма хранятся локальные
8:02
переменные плюс скажем аргументом
8:04
функции который мы можем получить доступ
8:06
с помощью этих регистров Вот наши нолики
8:09
инициализированные 4,8 это все где они
8:11
лежат 4,8 это количество байт если бы мы
8:15
сделали например Long Long вот так то
8:17
было бы 8 и 16 соответственно далее
8:20
после нейтрализации прыгаем условия это
8:23
вот так называемые лейблы на которые
8:24
поделена наша программа отдельные ее
8:26
части тела цикла условия инкремент и так
8:29
далее новый обход это прыжок который
8:32
делает следующее если первый операнд
8:34
меньше или равен второму после сравнения
8:36
прыгаем на соответствующий ловил наша
8:39
девятка это вот десятка то есть от 0 до
8:42
9 ой конечно же меньше десяти
8:44
соответственно прыгаем сравнение там
8:46
похоже для сравнения прыжок j&b где сам
8:50
прыжок на лейбл происходит если первый
8:52
пирант больше второго а Джей у нас точно
8:55
больше чем май иначе же он не прыгает и
8:58
выводит единичку то есть код ошибки и
9:00
далее прыгает на выход
9:02
в корректном же случае работы программы
9:04
прыгает на лейбл с инкрементом где
9:05
увеличивает тайну единицу и J на двойку
9:08
Ну и так продолжается по кругу пока
9:10
верно условие цикла круто на самом деле
9:13
ничего сложного и все очень логично
9:15
программа работает как задумано Джей
9:17
никогда не будет меньше I и мы в
9:18
конечном итоге всегда возвращаем 0 но
9:21
если мы включаем любой уровень
9:23
оптимизации то ассемблли у нас начинает
9:25
выглядеть Вот так и сейчас это
9:28
кульминация всего моего вот этого вот
9:30
спича вы теперь А в состоянии читать
9:33
элементарный ассемблер на котором
9:34
строится очень много софта B И самое
9:37
главное просто Глядя на этот код без
9:40
ассемблера многие из нас думали что мы
9:42
какие-то там тупенькие у нас где-то
9:44
ошибка кто-то из начинающих мог бы
9:46
вообще все забросить Ну а просто
9:48
взглянув на сэмбер без оптимизации с
9:49
ними мы видим что происходит явно что-то
9:52
не то и 90 процентов нашего кода просто
9:54
куда-то испарилась зашли в Main сразу
9:57
кладем в дефолтные общий регистр нашей
9:58
единичку и возвращаем ее то есть
10:00
компилятор убирает весь этот код циклами
10:02
условием и оставляет все ровно вот так
10:05
Ну и так как это случалось именно на
10:07
стадии оптимизации то один из явных
10:09
примеров оптимизаций это лупан роллинг
10:12
то есть компилятор избавляется цикла
10:14
Если вы так подумали то хорошее
10:16
предположение на самом деле это было не
10:17
связано с лупан роллингом А у них
10:19
файлики по работе с циклом был вариант
10:21
Что работает все только со знаками
10:24
ребята забыли в комите Видно что они это
10:27
пофиксили
10:28
ассемблер низкоуровневого
10:30
программирования это сложно но по
10:31
большому счету нам нужно знать очень
10:33
мало и просто не бояться все это читать
10:36
тут все очень логично Все делается микро
10:38
шагами которые легко понять и я надеюсь
10:40
что теперь кто-то из вас станет
10:42
во-первых читать больше ассемблеры не
10:44
бояться его во-вторых будет тестировать
10:46
свои программы в разных условиях в
10:49
телеграме У меня есть Подкасты очень
10:50
умные люди которые могут вам помочь
10:52
Подписывайтесь но мы скоро увидимся
10:54
только добра

Поделиться: