Commit Diff


commit - fd12bf9cb7875bf340e8eb1d9f9f1d7afe930936
commit + eae34170c261c4a0f231ae82e21a062c7c769dc7
blob - 853051ec630297176e9b6154b03491299bf3cc18
blob + a55865f01a60545909a0ed1fefd309c9fbb5eed7
--- capsule/atom.xml
+++ capsule/atom.xml
@@ -8,7 +8,13 @@
         <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
@@ -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
+```