Для знакомства с архитектурой SPARC напишем классический пример Hello World на ассемблере. Вот такой файл hello.S:
#include <sys/syscall.h>
.section .text
.globl _start
_start:
mov SYS_write, %g1 // system call to print a string
mov 1, %o0 // stdout
set message, %o1 // text to print
mov 14, %o2 // how many bytes
1: ta 0 // syscall
mov SYS_exit, %g1 // system call to finish the program
mov 0, %o0 // status code
2: ta 0 // syscall
message:
.string "Hello, world!\n"
Компилируем в статический бинарник для простоты:Однако... не работает. Чтобы удовлетворить встроенным в OpenBSD механизмам безопасности, надо добавить ещё пару секций:$ cc -E hello.S | as -o hello.o - $ ld -static -nopie hello.o -o hello $ size hello text data bss dec hex 75 0 0 75 4b
// Mark this binary as being built specifically for OpenBSD.
.section ".note.openbsd.ident", "a"
.p2align 2
.long 8, 4, 1
.ascii "OpenBSD\0"
.long 0
// List of allowed syscalls.
.section ".openbsd.syscalls"
.p2align 2
.long 1b, SYS_write
.long 2b, SYS_exit
Вот теперь хорошо:$ ./hello Hello, world!

no subject
Date: 2026-04-13 18:46 (UTC)no subject
Date: 2026-04-13 19:53 (UTC)no subject
Date: 2026-04-18 07:27 (UTC)no subject
Date: 2026-04-18 21:36 (UTC)$ cat pi-macos64.asm ; macOS x86_64 — NASM macho64 ; assemble: nasm -f macho64 -o pi-macos64.o pi-macos64.asm ; link: clang -nostdlib -static -Wl,-e,_start -o pi-macos64 pi-macos64.o %define D 9360 ; digits, 9360 is the limit for 64 KB ra-array %define N (D*7/2) default rel global _start section .text _start: xor esi, esi mov ecx, N/4 ; fill r-array mov rax, 2000*0x1000100010001 lea r8, [rel ra] lea rdi, [r8+2] rep stosq mov word [rel cv], cx mov word [rel kv], strict word N .l0: xor edi, edi ; d <- 0 mov si, word [rel kv] add esi, esi ; i <- k*2 mov cx, 10000 ; r[i]*10000, mul16x16 jmp .l2 .l4: sub edi, edx sub edi, eax shr edi, 1 .l2: movzx eax, word [r8+rsi] ; r[i] mul ecx add eax, edi mov edi, eax dec esi ; b <- 2*i-1 div esi mov word [r8+rsi+1], dx ; r[i] <- d%b dec esi ; i <- i - 1 jne .l4 mov eax, edi xor edx, edx div ecx add ax, word [rel cv] ; c + d/10000 mov word [rel cv], dx ; c <- d%10000 mov cx, ax call PR0000 mov edx, 4 lea rsi, [rel wb] mov rax, 0x2000004 ; SYS_write mov rdi, 1 ; STDOUT syscall xor rsi, rsi xor ecx, ecx sub word [rel kv], 14 ; k <- k - 14 jne .l0 .l5: xor edi, edi ; exit code 0 mov rax, 0x2000001 ; SYS_exit syscall PR0000: ; prints cx lea rdi, [rel wb] mov bx, 1000 call .l0 mov bx, 100 call .l0 mov bx, 10 call .l0 mov al, cl .l2: add al, '0' stosb ret .l0: mov al, 0ffh .l4: inc al mov bp, cx sub cx, bx jnc .l4 mov cx, bp jmp .l2 section .bss align 8 cv: resw 1 kv: resw 1 wb: resw 1 ; 2 bytes; PR0000 writes 4 bytes into wb..wb+3 (spills into start of ra) ra: resw (N+1)Компилируется, запускается и выдаёт 9360 знаков числа пи:
31415926535...56003727983
no subject
Date: 2026-04-19 06:34 (UTC)no subject
Date: 2026-04-18 22:06 (UTC)no subject
Date: 2026-04-19 07:03 (UTC)Кстати, этот алгоритм из серии "Всё придумал Рабинович". Потому как его впервые описал именно Рабинович в сооавторстве с Вагоном в 1995 - https://en.wikipedia.org/wiki/Spigot_algorithm - там и реализация на паскале с поцифирным выводом, на С заоптимизировали вывод по 4 цифры.
Не стоило наверное упоминать tricky, MMS, Thorham, meynaf и др. - некоторые оказали лишь некоторую психолгическую поддержку, некоторые проявили минимальное скорее бесполезное участие. Реально сильно вложился главный в мире энтузиаст PDP-11 Джонни Биллквист. Он несколько месяцев пытался сделать код быстрее, чем есть в моей базе. Он смог слегка оптимизировать код - ftp://guest:guest@Mim.Update.UU.SE/US:[BQT]PIRSX.MAC - но вне главного цикла, что скорее никак не отразилось на таймингах. И ещё англичан задело, несколько лет таились, а потом выскочили из засады - https://stardot.org.uk/forums/viewtopic.php?t=29301 - и прислали мне сообщение, типа "а у нас круче!" Да, у них круче, но затвор не той системы. :) Сложнее всего оптимизировать код Z80 - очень путанный процессор. Несколько человек косвенно подсказали как с ним справиться. Кто-то ещё помог на пару циклов дожать код для 68000.
no subject
Date: 2026-04-19 09:38 (UTC)perestoronin - начал проект, хотя сам никаких кодов не писал, - https://zx-pk.ru/threads/25783-vychislenie-chisla-pi-na-assemblere.html
ivagor - один из главных энтузиастов форума, существенно помог с кодами для 8080 и z80 и немного для других платформ
blackmirror - автор оптимальнейшего алгоритма деления для 8080, z80, pdp-11 noeis, 6809 и возможно некоторых других процессоров
saimo - помог с оптимизацией для 68000
meynaf - помог с оптимизацией умножения на 10000 для 68000 и PDP-11
BigEd - привлек внимание к проекту сообщества пользователей компьютеров Acorn
no subject
Date: 2026-04-18 23:45 (UTC)Пришлось помочь ему маленько в отладке.
no subject
Date: 2026-04-19 07:09 (UTC)