Вспомнил универ, спасибо) но я бы битовую маску наложил и возвращал что получится. NUM & 1: вернёт 1 если младший байт 1, и ноль если ноль. 1 может быть только тогда, когда число нечётное и наоборот соответственно
У меня такой вопрос. В файле fizzbuzz.c указываетеся, что обе функции fizz() и buzz() возвращают и принимают как аргумент 64-битный int. Однако в реализации на ассемблере используются регистры EDI и EAX, которые в свою очередь являются 32-битными. Означает ли это что эти функции не будут работать корректно, если им пердоставить число большее чем 2^32? Если да, то решиться ли эта проблема, если использовать RDI и RDX соотвественно?
Да, в коде допущена ошибка. Надо либо использовать 64-х битные регистры (и в связи с этим возможно ассемблерный код придётся переписать, используя другие инструкции), либо исправить объявление функций на int32_t.
Наконец то понятная для меня тема на канале 😆. Могу предложить тему для другого видео: - медианный фильтр на основе связанного списка. В сети очень мало инфы по нему. Я нашел только 2 реализации. От профессора Филла Экстрома и нашего соотечественника Пашгана
Большое спасибо за ролик. У меня вопрос про оптимизацию: с одной стороны мы сократили число команд, но с другой все команды выполняются за различное время, и битовые операции выполняются явно быстрее, чем вычитание. Или вам было важно именно память сэкономить?
Привет! Согласно коллинг конвенции amd64 system v, регистр rbx является callee-saved, то есть его значение не должно меняться для вызывающего метода. Получается, здесь это соглашение нарушено. Повезло, что программа отработала корректно. Я бы рекомендовал вместо rbx использовать регистр rcx, например, который является caller-saved и его можно менять.
В данном конкретном случае использование rbx абсолютно безопасно. Если сильно этот момент беспокоит, то можешь добавить пролог и эпилог, тогда будет по спеки все.
@@S0ERDEVS если бы вызывающая функция была гораздо более сложной, то компилятор мог бы положить в %rbx какое-то значение, а вы бы его "испортили" в асм-функции. Не думали о таком сценарии?
Ты сейчас решаешь несуществующую проблему. Еще раз повторяю, когда ты не контролируешь вызывающую функцию, то просто добавляешь пролог и эпилог к своим функциям.
@@S0ERDEVS а каким образом вы контролируете вызывающую функцию здесь? код для неё генерит компилятор, который полагает, что вы соблюдаете коллинг конвеншн.
А что тебя заставляет думать, что компилятор соблюдает соглашение System V или что в нем нет какого-либо бага нарушающего это соглашение? Смысл впадать в паранойю? Если есть что-то конкретное, то всегда рад разобраться, а просто фантазировать - это без меня.
Не расскажете ли как Вы достигли такой скорости работы в наборе текста? Очень быстро работаете, хотелось бы узнать какие усилия нужно приложить для получения аналогичной скорости. Спасибо.
Можно учить самостоятельно. Инфы море. Если сейчас уже не выпускают много книг на эту тему, то в 80-90е их было очень много. Все эти книги до сих пор можно найти в интернете.
@@разгов тут посоветовать ничего немогу. Занимался этой темой давно и названий книг не помню. Я читал все подряд. Если книга не нравилась, бросал, переходил к следующей. Благо, выбор есть. Нуи главное решить для себя, надо ли вообще погружаться так глубоко. Помню сам много времени потратил на изучение низкоуровнего программирования, но на практике так и не использовал эти знания. Сейчас уже мало чего помню. Например, на ассемблере уже программку написать не смогу, только если с помощью справки.
По поводу оптимизации - кол-во команд ≠ производительность. Некоторые команды выполняются быстрее других. Так mov eax, 0 медленнее чем xor eax, eax Возможно ваша реализация действительно быстрее, но это стоит доказывать как раз производительностью команд, а не количеством
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 реализации. От профессора Филла Экстрома и нашего соотечественника Пашгана
Вы крут)))
Большое спасибо за ролик.
У меня вопрос про оптимизацию: с одной стороны мы сократили число команд, но с другой все команды выполняются за различное время, и битовые операции выполняются явно быстрее, чем вычитание.
Или вам было важно именно память сэкономить?
Посоветуйте пожалуйста книгу по asm
Продолжай в том же духе!!!!
класс
Почему после sub edx,1 нельзя сделать проверку на флаг CF(командой SETC al)?
Neg eax не было смысла делать, в си, все что не ноль = true, можно ещё одну команду оптимизировать 😀
ничего вообще не понял, но было очень интересно 🤟🏼🤟🏼🤟🏼
Ай маладца
Вот видео как раз по интересующей теме. Кто может подсказать, каким компилятором си можно получить чистый 16/32 битный бинарник не привязанный к ОС ?
Привет! Согласно коллинг конвенции amd64 system v, регистр rbx является callee-saved, то есть его значение не должно меняться для вызывающего метода.
Получается, здесь это соглашение нарушено. Повезло, что программа отработала корректно.
Я бы рекомендовал вместо rbx использовать регистр rcx, например, который является caller-saved и его можно менять.
В данном конкретном случае использование rbx абсолютно безопасно. Если сильно этот момент беспокоит, то можешь добавить пролог и эпилог, тогда будет по спеки все.
@@S0ERDEVS если бы вызывающая функция была гораздо более сложной, то компилятор мог бы положить в %rbx какое-то значение, а вы бы его "испортили" в асм-функции. Не думали о таком сценарии?
Ты сейчас решаешь несуществующую проблему. Еще раз повторяю, когда ты не контролируешь вызывающую функцию, то просто добавляешь пролог и эпилог к своим функциям.
@@S0ERDEVS а каким образом вы контролируете вызывающую функцию здесь? код для неё генерит компилятор, который полагает, что вы соблюдаете коллинг конвеншн.
А что тебя заставляет думать, что компилятор соблюдает соглашение System V или что в нем нет какого-либо бага нарушающего это соглашение? Смысл впадать в паранойю? Если есть что-то конкретное, то всегда рад разобраться, а просто фантазировать - это без меня.
Интересно, спасибо
только сегодня смотрел видос по тому как писать операционную систему и там это было.
Какой у тебя эмулятор терминала?
Да и сама DE интересно, какая
у него линукс
Спасибо.
Эх, вспомнил сразу старые добрые cracking tutorials ...
Не расскажете ли как Вы достигли такой скорости работы в наборе текста? Очень быстро работаете, хотелось бы узнать какие усилия нужно приложить для получения аналогичной скорости. Спасибо.
Всё там уже напечатано... printer.sh - это такая прожка, которая неспеша выводит текст файла в консоль.
Посоветуйте ресурсы, где вы учили ассемблер. Можно и на английском. Нужно для универа)
А канал твоего товарища ещё остался? Интересно подцепить оттуда инфы=)
О каком товарище речь?
У которого по ассемблеру канал
Валерий Лис, знаем, жалко что он пропал(
Что это за linux-дистрибутив?
Опа, у меня примерно такая последняя лабораторная по системному программированию
Го проговммировать в спальне
@@batfist6595 Парное програмирование - топ
Ностальгическое чувство студенческих времён
Да пошел ты
Где можно учить C и ASM ?
Можно учить самостоятельно. Инфы море. Если сейчас уже не выпускают много книг на эту тему, то в 80-90е их было очень много. Все эти книги до сих пор можно найти в интернете.
@@phat80 да, но что из этого всего читать?
@@разгов тут посоветовать ничего немогу. Занимался этой темой давно и названий книг не помню. Я читал все подряд. Если книга не нравилась, бросал, переходил к следующей. Благо, выбор есть. Нуи главное решить для себя, надо ли вообще погружаться так глубоко. Помню сам много времени потратил на изучение низкоуровнего программирования, но на практике так и не использовал эти знания. Сейчас уже мало чего помню. Например, на ассемблере уже программку написать не смогу, только если с помощью справки.
@@phat80 стоит ,хорошая это база в дополнении другим языкам
@@разгов по С могу посоветовать Стивина Прата
4:18
там варниг будет i целое, а передается инт64
Исходный код (для экспериментов) godbolt.org/z/84TjY5
А как компилировать с gas файлом(.s)?
ничего не понятно, но очень...
Диз поставил я
На момент твоего коммента - 0 дизов. Врещь товарищ
Я тоже
@@3955006 у тебя заторможенный клиент
Нихрена, диз поставил мой скрипт - ДизБаз называется )
Теперь осталось выяснить кто поставил 4-й диз
7:55
al это младшие 8 бит, а не 16
16 это ax
По поводу оптимизации - кол-во команд ≠ производительность. Некоторые команды выполняются быстрее других. Так mov eax, 0 медленнее чем xor eax, eax
Возможно ваша реализация действительно быстрее, но это стоит доказывать как раз производительностью команд, а не количеством