commit - fd12bf9cb7875bf340e8eb1d9f9f1d7afe930936
commit + eae34170c261c4a0f231ae82e21a062c7c769dc7
blob - 853051ec630297176e9b6154b03491299bf3cc18
blob + a55865f01a60545909a0ed1fefd309c9fbb5eed7
--- capsule/atom.xml
+++ capsule/atom.xml
<name>continue</name>
<email>continue@to.any-key.press</email>
</author>
- <updated>2024-11-08T12:00:37.482884+00:00</updated>
+ <updated>2024-11-08T17:05:05.092885+00:00</updated>
+ <entry>
+ <id>gemini://any-key.press/esoteric/gnu_as_hello_world.gmi</id>
+ <link href="gemini://any-key.press/esoteric/gnu_as_hello_world.gmi" rel="alternate"/>
+ <title>Динамически скомпонованный "Hello, world!" на GNU ассемблере x86_64 (amd64)</title>
+ <updated>2024-11-08T17:05:05.092885+00:00</updated>
+ </entry>
<entry>
<id>gemini://any-key.press/readed/Compost_Ferment.gmi</id>
<link href="gemini://any-key.press/readed/Compost_Ferment.gmi" rel="alternate"/>
blob - 98f6e5437e43f47557f21f5717384c788664cb50
blob + ed2937ff85bf62d4b45bea5b07c431e95af46837
--- capsule/esoteric/index.gmi
+++ capsule/esoteric/index.gmi
=> 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
+# Динамический "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
+```