commit eae34170c261c4a0f231ae82e21a062c7c769dc7 from: Aleksey Ryndin date: Fri Nov 08 17:08:06 2024 UTC Add esoteric/gnu_as_hello_world.gmi commit - fd12bf9cb7875bf340e8eb1d9f9f1d7afe930936 commit + eae34170c261c4a0f231ae82e21a062c7c769dc7 blob - 853051ec630297176e9b6154b03491299bf3cc18 blob + a55865f01a60545909a0ed1fefd309c9fbb5eed7 --- capsule/atom.xml +++ capsule/atom.xml @@ -8,7 +8,13 @@ continue continue@to.any-key.press - 2024-11-08T12:00:37.482884+00:00 + 2024-11-08T17:05:05.092885+00:00 + + gemini://any-key.press/esoteric/gnu_as_hello_world.gmi + + Динамически скомпонованный "Hello, world!" на GNU ассемблере x86_64 (amd64) + 2024-11-08T17:05:05.092885+00:00 + gemini://any-key.press/readed/Compost_Ferment.gmi blob - 98f6e5437e43f47557f21f5717384c788664cb50 blob + ed2937ff85bf62d4b45bea5b07c431e95af46837 --- capsule/esoteric/index.gmi +++ capsule/esoteric/index.gmi @@ -4,5 +4,6 @@ => https://ru.wikipedia.org/wiki/%D0%AD%D0%B7%D0%BE%D1%82%D0%B5%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F Википедия: Эзотерический язык программирования +=> gnu_as_hello_world.gmi Динамический "Hello, world!" на GNU ассемблере x86_64 (amd64) (2024-11-08) => bggp5_pyc.gmi Binary Golf Grand Prix 5 - py[c] (2024-07-09) => bggp5_openssl.gmi Binary Golf Grand Prix 5 - openssl s_client (2024-07-03) blob - /dev/null blob + 25bbca798d9e4d5cfd75acc8667a5429547fdf36 (mode 644) --- /dev/null +++ capsule/esoteric/gnu_as_hello_world.gmi @@ -0,0 +1,30 @@ +# Динамический "Hello, world!" на GNU ассемблере x86_64 (amd64) + +Понадобилась мне программа-заглушка, выводящая "Hello, world!" в стандартный поток вывода. На GNU ассемблере для платформы x86_64 (amd64). И динамически скомпонованная с libc (тут я передаю пламенный привет OpenBSD, в которой теперь нельзя просто взять и вызвать системный вызов). + +С одной стороны GNU'тый диалект ассемблера мне знаком плохо. Практика полезна: + +``` + .global main + .extern write, exit + + .section .rodata +message: + .ascii "Hello, world!\n" + + .section .text +main: + mov $1, %rdi /* STDOUT */ + lea message(%rip), %rsi + mov $14, %rdx + call write + + xor %rdi, %rdi + call exit +``` + +А с другой я никогда "руками" (ну точнее с помощью ld) не собирал работоспособные динамически скомпонованные ELF'ы. Оказалось это тот ещё геморрой с указанием crt и интерпретатора-компоновщика на разных платформах: Debian, Alpine и OpenBSD. Плюнул и для кросс-платформенной сборки использую cc (содержимое hello.s приведено в ассемблерном листинге выше): + +``` +$ as -o hello.o hello.s && cc -l c -o hello hello.o +```