LINUX.ORG.RU

X11-приложение на чистом ассемблере под Linux

 , ,


2

5

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

Как сама статья так и перевод - большие и сложные, знаний на такое у меня уже нехватает. Если есть желающие помочь с вычиткой и поиском ошибок - велкам!

На скриншоте обычная Ubuntu и Xfce, самое главное - ч0рное окошко по центру, это и есть та самая тестовая программа из статьи, написанная на чистом ассемблере и вызывающая Х-сервер через unix-сокет.

>>> Просмотр (1366x768, 988 Kb)

★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от PPP328

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

alex0x08 ★★★
() автор топика
Ответ на: комментарий от EXL

почему он не писал на С и C++

Потому что мог.

dataman ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Я если честно не очень в курсе, поскольку всегда считал Wayland поделкой для детей:

There is no single common Wayland server like Xorg is for X11, but every graphical environment brings with it one of many compositor implementations. Window management and the end user experience are often tied to the compositor rather than swappable components.

Ну и напоминаю что IPC это не клиент-сервер:

A core part of Wayland architecture is libwayland: an inter-process communication library that translates a protocol definition in XML to a C language API. This library does not implement Wayland, it merely encodes and decodes Wayland messages. The actual implementations are in the various compositor and application toolkit projects.
alex0x08 ★★★
() автор топика
Ответ на: комментарий от alex0x08

всегда считал Wayland поделкой для детей

Зря.

IPC это не клиент-сервер

И тем не менее. В терминологии протокола wayland есть клиент и сервер.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

И тем не менее. В терминологии протокола wayland есть клиент и сервер.

Да пусть хоть «друзьями по стеку» это все называют, к сокетам сие отношения не имеет.

В плане использования из ассемблера, IPC наверное будет даже проще, но сам я такое не сделаю - знаний не хватит.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от James_Holden

Сейчас он наконец статью прочитает )

alex0x08 ★★★
() автор топика
Ответ на: комментарий от EXL

Hello World на Assembler’е вот вообще не особо интересно

Поэтому меня восхищает автор FASM, пишущий свой компилятор на ассемблере.

$ stat /usr/bin/fasm

Size: 148944

Кто меньше?!

dataman ★★★★★
()
Ответ на: комментарий от alex0x08

«RESTful-вебсервис на Forth»

«Гостевая книга на Cobol»

«Эмулятор ENIAC»

«Эмулятор Xerox»

Ты прикалываешься?!

COBOL, ENIAC… Это же ровестники бабушек-дедушек большинства ЛОРовцев, сами ЛОРовцы даже слов таких не знают. ☺

Хотя вот щаз загуглил дату публикации COBOL (1959), и… Последний стандарт датирован этим, 2023, годом! о_О It’s alive! Alive!

«Профессиональная высокоуровневая разработка на Brainfuck»

Ты точно прикалываешься!

Хотя на программу на Whitespace я бы посмотрел. ☺

«OpenIndiana с suspend/resume на ноутбуке»

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

Будет весело вообщем.

Мазохист! ☺ На таких энтузиастах как ты и держится IT! :3

mord0d ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Вообще клиент-серверная модель подразумевает сокеты, IPC это больше про обмен данными через область памяти, никаких bind и accept там нет.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от PPP328

Я давно провайдеров не спрашиваю, там людей нет, одни роботы.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от devl547

Топикстартер не ставит невозможных задач. Но и не ищет лёгких путей. (=

С «Далее → Далее → Далее → Готово» справится и обезьяна, а гребля с препятствиями это весело! ☺

mord0d ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Так и скажи что автор-дурак, зачем все эти пляски? Достойный конец после обсера, можно сказать традиционный. И клоунов выставить не забудь.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от alex0x08

Достойный конец после обсера

Какого обсера? Я тут спокойно общаться пытаюсь вообще то.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от aol

Вообщем поправил, заодно добавил про подсветку синтаксиса ассемблера в gedit.

alex0x08 ★★★
() автор топика

большие и сложные

Ну то что кода больше чем на С это да, можно макросы использовать. А то что сложные, так наоборот же, сложность только в том что бы вместо rax не написать rcx по случайности, но в целом записал байт сюда, вызвал syscall этот и все.

MOPKOBKA ★★★★
()
Ответ на: комментарий от etwrq

syscall вызывают приложения, обычно в коде они напрямую не вызываются и зарыты в libc, тут по сути минимальная имплементация -lX11

MOPKOBKA ★★★★
()
Ответ на: комментарий от EXL

Программа не слишком большая, наверное он и подумал что самое то для fasm, сборка очень быстрая, никаких Make/Cmake/VSProject не требуется, во встроенном редакторе fasm кнопку Run нажал и скомпилировалось/запустилось моментально https://fasmworld.ru/content/course/002/shot00.png

MOPKOBKA ★★★★
()
Ответ на: комментарий от MOPKOBKA

Ну тогда точно стоит свою статью писать, с таким-то умищем.

alex0x08 ★★★
() автор топика

Статья интересная, но мало практичная. Так как в данном случае ассемблер выступает как язык бизнесе логики использующий си библиотеки. В такой связке ассемблер ничего не даст в плане производительности, а только поставит крест на портабельности итоговой программы.

Но это ни как не портит саму задумку автора. Почему собственно и нет.

JordanCpp
()
Ответ на: комментарий от JordanCpp

ассемблер выступает как язык бизнесе логики использующий си библиотеки

Спасибо за теплые слова но статью все же стоит прочитать )

alex0x08 ★★★
() автор топика
Ответ на: комментарий от alex0x08

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

Наверное намного полезнее было бы сделать что то подобное на С, но без библиотек кроме libc, тогда читателю понять как взаимодействовать с чем то без библиотек было бы намного проще.

А взаимодействие с syscall сделать отдельной статьей, в принципе если на С умеешь писать, то с ними разобраться проблемы не будет, там все одинаковое почти https://filippo.io/linux-syscall-table/

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

Если бы я знал ассемблер, то сел бы

Но при этом давать советы и высказывать мнения о «нинужности» разумеется не стесняешься?

alex0x08 ★★★
() автор топика
Ответ на: комментарий от alex0x08

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

В статье я не вижу ничего интересного по этому поводу. Я думаю что такие статьи это лучше чем ничего, но смысла не вижу, это ЛОР, тут «нинужно» пишут под всем, это же не значит что я за тотальную аннигиляцию.

MOPKOBKA ★★★★
()
Ответ на: комментарий от alex0x08

А зачем тебе, как это вытекает из разговора? Обиделся на свою бестолковость и решил до меня докопаться?

MOPKOBKA ★★★★
()
Ответ на: комментарий от alex0x08

В общем из PDF у меня сорец нормально не копируется без потери форматтинга, то что я увидел (копировал из PDF, кое-где могли куски слететь):

cmp rax, 0
jle die

Тут лучше объявить %define EXIT_SUCCESS 0

//

mov rdi, rax ; Store socket fd in `rdi` for the remainder of the functio
sub rsp, 112 ; Store struct sockaddr_un on the stack.

И

mov ecx, 19 ; Length is 19 with the null terminator.

И

%define SIZEOF_SOCKADDR_UN 2+108

И

add rsp, 112

NASM всё-таки не настолько ущербный, он умеет в структуры и size элемента:

struc   mytype 

  mt_long:      resd    1 
  mt_word:      resw    1 
  mt_byte:      resb    1 
  mt_str:       resb    32 

endstruc

//

sub rsp, 1 <15

И

mov rdx, 1 <15

Тут лучше хотя бы парой слов описать, зачем

//

mov BYTE [rsp + 0], 'l' ; Set order to 'l'.
mov WORD [rsp + 2], 11 ; Set major version to 11.

Соответственно если вы сделаете %define X_ORDER_... 'l' и пр, то необходимость в комментариях пропадет //

mov rdx, 12*8

Опять же, зачем?

//

mov rdx, 8

Аналогично, напрашивается константа

//

imul rax, 8 ; sizeof(format) = 8

А вот если бы вы объявили константу с вычислением в compile time, то…

//

add rdi, 3
and rdi, -4

Ладно со skip over padding, но and с отрицательной константой??

//

mov BYTE [rsp + 3*4 + 0], 'f'
mov BYTE [rsp + 3*4 + 1], 'i'
mov BYTE [rsp + 3*4 + 2], 'x'
mov BYTE [rsp + 3*4 + 3], 'e'
mov BYTE [rsp + 3*4 + 4], 'd'

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

//

Все Х11 константы лучше вынести или вверх или в отдельный файл. Они сейчас разбросаны по всему файлу. Уж не помню, определяет ли NASM %define в пределах области видимости или до конца файла, но такая практика плоха в любом случае. //

Вообще впечатление такое, что код писался как gcc x11.c -E. В некоторых местах прям видно, что человек так не написал бы. Тогда не видно смысла самой статьи. Код в файлах машиночитаем, а не человекочитаем

//

Ну и в качестве рекомендации-эксперимента. У вас часто есть длинные функции. Способа с этим бороться два. Либо делить на субрутины с call xxx, либо есть другой метод. Да, функция останется длинной, но будет понятно какой раздел что делает. Примерно вот так:

.proc _headdown_sidemove
    init:
        psh a, x, y
        ptr_sprite_index   = zp_temp_16_0
        ptr_palette_index  = zp_temp_16_1
        ptr_side_animation = zp_temp_16_2

        position_x_start   = ram_temp_8_0
        position_x         = ram_temp_8_1
        position_y_start   = ram_temp_8_2
        position_y         = ram_temp_8_3

    head_sprites_pointer:
        ldx ram_balls_selected
        lda ram_field_table, x
        asl
        p16_set ptr_sprite_index, #ball_heads_sprites, 16
        p16_add ptr_sprite_index, a
        p16_ref ptr_sprite_index

    head_palette_pointer:
        p16_set ptr_palette_index, #ball_heads_spritepalettes, 16
        p16_add ptr_palette_index, a
        p16_ref ptr_palette_index

    shift_set:
        lda ram_balls_selected
        lsr
        lsr
        tax
        lda ball_pointer_position_x, x
        sta position_x_start
PPP328 ★★★★★
()
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

Да нет что-ты, я уже привык что фанаты Rust на нем не программируют, фанаты NixOS используют ее только дома а не для работы. Человек не знающий ассемблер, но при этом его критикующий - просто очередное добавление в эту коллекцию.

Ничего нового.

Тут в соседнем треде снова FreeBSD хоронят, уже порвали два баяна.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от PPP328

О! Спасибо за столь глубокий разбор!

Тут лучше объявить %define EXIT_SUCCESS 0

Так все уже вроде знают что 0 это выход без ошибок, ради этого же константа предлагается? Я просто и в сишном коде и в более высокоуровневых языках видел зашитый 0 и вопросов это видимо не вызывает.

NASM всё-таки не настолько ущербный, он умеет в структуры и size элемента:

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

Вообще впечатление такое, что код писался как gcc x11.c -E. В

Издержки производства :)

Но повторюсь что у меня не получилось под фрибзд это завести, несмотря на измененные номера сискаллов. Что-то на уровне структур данных отличается при взаимодействии с Х-сервером.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от alex0x08

Так все уже вроде знают что 0 это выход без ошибок, ради этого же константа предлагается?

Я на одном 6502 форуме слышал такой аргумент: «Ну зачем мне выносить 3400, 3420, 3440 в именованные константы, если все и так знают, куда эти регистры ведут».

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

поскольку код был получен реверсом С-приложения:

То есть глаза меня не подвели. Тогда смысла в таком коде ровно 0.

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Ну почему ноль, получился бинарник меньше 1Кб без каких-либо библиотек рисующий окно в Х-сервере. Это ж круто.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от cdtemp

На двачах cмастерили, там знают толк в красивых мальчиках c большими ушами :)

alex0x08 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.