Программа на С с линковкой функций на ASM
Вставка
- Опубліковано 16 жов 2024
- #soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwaree...
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/...
GitHub - github.com/soe...
Чат для программистов - / discord
Группа ВК - codeart...
00:00 Введение
00:29 Реализация fizzbuzz.c
02:40 ELF64
03:32 Fizz.asm
09:26 Buzz.asm
09:52 Оптимизация
12:50 Компиляция
Спасибо, за видос. Не так кринжово как обычно
В следующем видео предлагаю спаять fizzbuzz на интегральных микросхемах или транзисторах)
Не знаю зачем я это посмотрел, ведь не пишу ни на си, ни на ассемблере. Но было интересно!
Спасибо за то, что делитесь знаниями
Начал делать учебный проект на asm - Соер выпускает видос как раз на эту тему... 👌🏻
Большое спасибо за ролик.
У меня вопрос про оптимизацию: с одной стороны мы сократили число команд, но с другой все команды выполняются за различное время, и битовые операции выполняются явно быстрее, чем вычитание.
Или вам было важно именно память сэкономить?
Вспомнил универ, спасибо) но я бы битовую маску наложил и возвращал что получится. NUM & 1: вернёт 1 если младший байт 1, и ноль если ноль. 1 может быть только тогда, когда число нечётное и наоборот соответственно
У меня такой вопрос. В файле fizzbuzz.c указываетеся, что обе функции fizz() и buzz() возвращают и принимают как аргумент 64-битный int. Однако в реализации на ассемблере используются регистры EDI и EAX, которые в свою очередь являются 32-битными. Означает ли это что эти функции не будут работать корректно, если им пердоставить число большее чем 2^32? Если да, то решиться ли эта проблема, если использовать RDI и RDX соотвественно?
Да, в коде допущена ошибка. Надо либо использовать 64-х битные регистры (и в связи с этим возможно ассемблерный код придётся переписать, используя другие инструкции), либо исправить объявление функций на int32_t.
Наконец то понятная для меня тема на канале 😆. Могу предложить тему для другого видео: - медианный фильтр на основе связанного списка. В сети очень мало инфы по нему. Я нашел только 2 реализации. От профессора Филла Экстрома и нашего соотечественника Пашгана
я слишком фронтедер для этого.
спасибо за интересный материал
Спасибо, классное видео! :)
Вы крут)))
класс
Neg eax не было смысла делать, в си, все что не ноль = true, можно ещё одну команду оптимизировать 😀
Продолжай в том же духе!!!!
Посоветуйте пожалуйста книгу по asm
Почему после sub edx,1 нельзя сделать проверку на флаг CF(командой SETC al)?
А канал твоего товарища ещё остался? Интересно подцепить оттуда инфы=)
О каком товарище речь?
У которого по ассемблеру канал
Привет! Согласно коллинг конвенции amd64 system v, регистр rbx является callee-saved, то есть его значение не должно меняться для вызывающего метода.
Получается, здесь это соглашение нарушено. Повезло, что программа отработала корректно.
Я бы рекомендовал вместо rbx использовать регистр rcx, например, который является caller-saved и его можно менять.
В данном конкретном случае использование rbx абсолютно безопасно. Если сильно этот момент беспокоит, то можешь добавить пролог и эпилог, тогда будет по спеки все.
@@S0ERDEVS если бы вызывающая функция была гораздо более сложной, то компилятор мог бы положить в %rbx какое-то значение, а вы бы его "испортили" в асм-функции. Не думали о таком сценарии?
Ты сейчас решаешь несуществующую проблему. Еще раз повторяю, когда ты не контролируешь вызывающую функцию, то просто добавляешь пролог и эпилог к своим функциям.
@@S0ERDEVS а каким образом вы контролируете вызывающую функцию здесь? код для неё генерит компилятор, который полагает, что вы соблюдаете коллинг конвеншн.
А что тебя заставляет думать, что компилятор соблюдает соглашение System V или что в нем нет какого-либо бага нарушающего это соглашение? Смысл впадать в паранойю? Если есть что-то конкретное, то всегда рад разобраться, а просто фантазировать - это без меня.
Интересно, спасибо
Какой у тебя эмулятор терминала?
Да и сама DE интересно, какая
у него линукс
Спасибо.
ничего вообще не понял, но было очень интересно 🤟🏼🤟🏼🤟🏼
Эх, вспомнил сразу старые добрые cracking tutorials ...
Ай маладца
только сегодня смотрел видос по тому как писать операционную систему и там это было.
Валерий Лис, знаем, жалко что он пропал(
Вот видео как раз по интересующей теме. Кто может подсказать, каким компилятором си можно получить чистый 16/32 битный бинарник не привязанный к ОС ?
Не расскажете ли как Вы достигли такой скорости работы в наборе текста? Очень быстро работаете, хотелось бы узнать какие усилия нужно приложить для получения аналогичной скорости. Спасибо.
Всё там уже напечатано... printer.sh - это такая прожка, которая неспеша выводит текст файла в консоль.
Посоветуйте ресурсы, где вы учили ассемблер. Можно и на английском. Нужно для универа)
Что это за linux-дистрибутив?
Опа, у меня примерно такая последняя лабораторная по системному программированию
Го проговммировать в спальне
@@batfist6595 Парное програмирование - топ
Ностальгическое чувство студенческих времён
Да пошел ты
там варниг будет i целое, а передается инт64
Где можно учить C и ASM ?
Можно учить самостоятельно. Инфы море. Если сейчас уже не выпускают много книг на эту тему, то в 80-90е их было очень много. Все эти книги до сих пор можно найти в интернете.
@@phat80 да, но что из этого всего читать?
@@разгов тут посоветовать ничего немогу. Занимался этой темой давно и названий книг не помню. Я читал все подряд. Если книга не нравилась, бросал, переходил к следующей. Благо, выбор есть. Нуи главное решить для себя, надо ли вообще погружаться так глубоко. Помню сам много времени потратил на изучение низкоуровнего программирования, но на практике так и не использовал эти знания. Сейчас уже мало чего помню. Например, на ассемблере уже программку написать не смогу, только если с помощью справки.
@@phat80 стоит ,хорошая это база в дополнении другим языкам
@@разгов по С могу посоветовать Стивина Прата
Исходный код (для экспериментов) godbolt.org/z/84TjY5
4:18
ничего не понятно, но очень...
Диз поставил я
На момент твоего коммента - 0 дизов. Врещь товарищ
Я тоже
@@3955006 у тебя заторможенный клиент
Нихрена, диз поставил мой скрипт - ДизБаз называется )
Теперь осталось выяснить кто поставил 4-й диз
А как компилировать с gas файлом(.s)?
По поводу оптимизации - кол-во команд ≠ производительность. Некоторые команды выполняются быстрее других. Так mov eax, 0 медленнее чем xor eax, eax
Возможно ваша реализация действительно быстрее, но это стоит доказывать как раз производительностью команд, а не количеством
7:55
al это младшие 8 бит, а не 16
16 это ax