Как стать автором
Обновить

Комментарии 30

Меня терзают смутные сомнения, что и на си и с++, можно добиться аналогичного результата. Причем оно будет переносимо.

Хм. На С++ в Linux (gcc 14.2.1) минимальный ПриветМир с использованием unistd.h даёт бинарник размером 14392 байта, с использованием iostream.h - 14400 байтов. Это чисто для терминала. Довольно толстенько.

Программисты C++ начинают отсчет сразу с мегабайтов, все что меньше — погрешность (ц)

Хех) Пишу прогу на плюсах - чисто терминальная, ничего такого особенного, работа с файлами. Я её ещё даже не доделал, а бинарник уже за 430 КБ перевалил. А я думал, что килобайтов в 250 уложусь.

С другой стороны, у меня всё-всё в одном бинарнике, так что может это и не плохой результат.

С другой стороны, хоть разница и в два раза, но это примерно такая же разница как сэкономить спичку, использовав одну вместо двух.

Я тоже устал от монстроузности в софте. Но я пошел путем С++, позволивший поддерживать как новые, так и старые api. И получилось сделать очень переносимый код, не только на уровне разных компиляторов, но и архитектур.

Скромненько выскажусь, что ассемблер в таких количествах - это антипатиерн.

Скромненько выскажусь, что ассемблер в таких количествах - это антипатиерн.

Статья же в хабе "Ненормальное программирование" + автор пишет, что:

Эта статья появилась на свет, потому что я хотел улучшить свои знания ассемблера заодно сделав чего-нибудь интересное и мотивирующее.

Да и в целом текст написан в развлекательном ключе и перевод отличный, а нецензурированный вдвойне классный! Побольше бы таких статей/переводов, вместо всякого унылого треша от нейросеток.

А X сервер-то здесь зачем - тот еще монстр?
Чем писать в видеопамять напрямую плохо-то?

Чем писать в видеопамять напрямую плохо-то?

Конечно же ничем, но враги зачем‑то придумали какие‑то дурацкие права пользователя и протоколы — ересь сплошная да порнография. Милонова на них нет!

Я, когда проделал аналогичное упражнение на винде, - приложение на ассемблере создавало окно используя win api, испытал странное чувство что я сделал какую-то фигню, но не мог понять почему.
А потом меня озарило. Я вспомнил споры со своим другом - аудиофилом. Аргумент про дорогучий силовой кабель из бескислородной меди (тут про технологию точно соврал, но деталей не помню) который ну никак, ни за какие деньги не сможет исправить кривое электричество которое было погнуто в процессе передачи по километрам зоопарка проводки от электростанции до розетки.

Когда учился в ВУЗе, мой одногруппник написал клон Notepad целиком на ассемблере. Было время — были люди.

Мне интересно было что-то делать на ассемблере КМ1801 (PDP-11 который) и КР580 (Интел 8080, вроде). Тогда вообще все происходящее на тех компьютерах укладывалось в одной голове и ассемблер был вполне органичен. В MSDOS, пожалуй тоже. А вот что-то делать в системах типа винда на ассемблере, имхо, странно.

mov ax, 13h
int 10h
mov ax, 0A000h
mov es, ax
; ...

Ага, ага...

FASM конечно поудобнее (для меня). А так хотелось бы похожую статью о Wayland.

Wayland не имеет никаких АПИ для рисования

Когда-то асм был суровой необходимостью.

16кб ОЗУ и 1Мгц проц.

PDP-11 и вперед, делать графические игрушки для БК0010

Компиляция ассемблера с кассеты в память. Даже дизасемблер и дебугер был - с кассеты грузился.

До появления графических ускорителей только на асме можно было выжать 3d из чахлых 286-386. С другом натягивали битмап на крутящийся шар. Экранов 5 на ассемблере за один день.

Было весело в детстве)

FAQ-и из demo.design, ru.algorithms и ru.game.design наверное были изучены почти в наизусть =)

Журнал электроника 1987 года - вот источник знаний. Случайно на даче читал рекламную статью про новый графический адаптер КГД для ДВК. Там было описано в какую ячейку положить адрес графической памяти и в какую ячейку положить затем значение. Как раз в школе поставили эти КГД (забивал молотком лично). Ну и понеслось - спрайты вручную прогал, графический редактор на асме.

ubunchu)))

Это отсылка?

может, глагол? )

Linux это единственная современная (mainstream) операционная система, которая официально предоставляет стабильное ABI уровня пользователя, другие ОС часто ломают их ABI от версии к версии

Зато на уровне ядра ломают с завидной периодичностью, часто даже в пределах одной версии.

До вызова функции, указатель стека должен быть 16 байт (16 bytes aligned)

Наверное "выровнен по 16 байт"?

Беглый просмотр кода даёт основания считать, что процентов 15 можно отрезать, схлопнув запись байтов и не выполняя явно лишних операций вида mov rdi, rdi или lea rdi, [rsp], а также избавиться от rex-префикса инструкций mov rax, SYSCALL_EXIT и mov rdi, 0

На ЛОРе это тоже заметили, но автор оригинальной статьи честно писал что получил ассемблерный код декомпиляцией из Си и затем уже чистил. Я так тоже делал, когда пробовал портировать под FreeBSD, могу сказать что ассемблерных листингов получается чудовищное количество даже для пустого окна.

Так что совсем уж обвинять автора в криворукости я бы не стал.

Речь конечно же не про криворукость. Но раз упор делается на малый размер бинарника, то было бы неплохо поработать над тем, чтобы хоть какой-то прогресс по нему обеспечить.

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

Побольше таких статей.

Это классно, но видно что ядро ОС заставляет играть по ее правилам и все класть на стек.

Вы сейчас про что именно? Про данные в памяти и указатель на неё? Тут может быть что угодно, не только стек. Просто стек удобен.

В регистрах много информации не разместишь.

Перечитаю позже, и если не забуду займусь выводом в графическое окно. Пока текст только в терминал выводил.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории