Практика языка C (МФТИ, 2023-2024). Семинар 6.1. Изобретаем ассемблер.

preview_player
Показать описание
Практические занятия по языку C на первом курсе МФТИ. Кафедра информатики.

На этом занятии мы начнём своё путешествие в ассемблер. Для начала мы изобретём свой собственный несложный ассемблер и даже потренируемся писать для него кодировщик и декодер инструкций. Далее мы посмотрим на более взрослый x86 его регистры и систему команд. Я также устрою большой сеанс live-coding и в конце мы подумаем над одной увлекательной головоломкой.

Семинарист: Константин Владимиров.
Дата: 26 февраля 2024 года.
Съёмка: Марк Гончаров.
Звук: Юлий Тарасов.

Timeline
00:00 Микрокалькуляторы
05:05 Придумываем кодировку
13:53 Первая программа на ассемблере
21:50 Три задачи: encoder, decoder, simulator
26:55 Регистры и система команд в x86
36:20 Время решать задачи
39:30 Пример решения Problem AS2, live coding
01:11:10 Условные переходы и первое упражнение в угадывании кода.

Errata
* слайд 13 для jle/jng флаг четности pf вместо флага переполнения of
Рекомендации по теме
Комментарии
Автор

Прекрасное объяснение. Огромное спасибо Вам за ваш труд.

ArtemDaineko-fp
Автор

Огромное спасибо вам!!! Вы прям настоящая находка! Низкий вам поклон!!!

ИльдарБулатов-тх
Автор

Восхищен как никогда! Лекция - огонь! Прекрасная подача материала!! Спасибо :)

andreykhakimov
Автор

Отличное объяснение. Обычно начинают грузить терминами, а тут сразу ясно не только что работает, а как и почему работает

misternether
Автор

Как всегда доходчиво, ёмко и интересно. Спасибо

alexandrgonzales
Автор

посмотрел на одном дыхании, вы лучшие как всегда

kirich_yo
Автор

Спасибо за Ваши лекции, всегда рада их слушать и внимать

moshamiracle
Автор

Великолепная лекция! Сразу видно, что преподаватель знает и любит свой предмет. Очень интересная лекция, лайк и подписка однозначно. Но мне показалось, что есть несколько мелких неточностей:
12:20 Illegal можно сделать а не
21:27 Каждая команда кодируется опкодом НЕ "от 0 до 6", а опкодом от "1 до 6" (написан текст на слайде, п.3);
29:00 Intel 4004 — 4-битный микропроцессор, поэтому регистры НЕ 8-битные, а 4-х битные.

РусланМочалов-нь
Автор

Лучший контент по копутер сайнс и си!!!

kotanvich
Автор

Нас так не учили! Очень интересно и круто

sergeyegorov
Автор

Посмотрел все лекции на этом канале. Начал видеть сквозь стены.

kvt
Автор

Неожиданно для себя захотел написать ассемблер на си))

ode
Автор

У нас вообще лекций не было по Ассемблеру, тупо грузили практиками и требовали понимая, что в теории невозможно. Тогда я просто забил на это все дело, а оказывается можно объяснять понятно и интересно. Все таки не я тупой, а зависит многое от преподавателя

theflipofun
Автор

прослушал первую минуту и сразу понял, что чел шарит. респектово

_test_test
Автор

29:18 Если не ошибаюсь, Intel 4004 всё-таки 4-битный процессор. Возможно, Вы имели в видu Intel 8008?

DmitryKandiner
Автор

34:04 ну есть еще "AMD64 Architecture Programmer's Manual, Volume 3" . Там vpn не нужен.

Japrajah
Автор

Спасибо. Лекция, как всегда - отличная.
Однако ввиду собственного мерзкого характера, не могу не отметить, что в дизассемблере problem_as2 проверять входные данные assert''ом 46:00 не стоит, сами же говорили. Даже невзирая на то, что дальше исходные данные подрезаются до char. Релиз станет "правильно" дизассемблировать всё-таки, изначально неправильный код - "политически неверно".

А ещё (дело вкуса, конечно, недолюбливаю линейный switch), я бы полез решать эту задачку вокруг массива структур, индексированных опкодом. В структуре можно было бы даже набором параметров описать инструкцию (например, в какой позиции хранится код регистра в одно-операндной инструкции, если бы она у IN и OUT отличались), и оставить указатель на дизассемблирующую инструкцию функцию (скажем, для ADD/SUB/DIV/MUL - одна функция, IN/OUT - вторая и т.д., они бы получали аргументом указатель на "спровоцировавший" её вызов элемент массива).
Но кажется меня тащит в сторону С++, причём процесс осложнён ересью мысленного расширения задачи )).

magicmetal
Автор

Интересно, а насколько эффективнее использовать при проверке (на 57:14) логическое И с маской и сравнение вместо сдвига? Конечно все зависит от процессора под который все это будет скомпилировано. Но чисто теоретически должно быть быстрее.

max-hexz
Автор

Уважаемый лектор!

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

unixway
Автор

Так вот как работает реверс инжениринг))

stanislavstanislavius