Jako ćwiczenie stworzyłem proste rozwiązanie dla tego wyzwania, w języku asemblera x86. Korzystam z FASM w systemie Windows. Oto mój kod źródłowy:
format PE console
entry start
include 'WIN32A.inc'
section '.text' code executable
start:
push char ; Start at 'A'
call [printf] ; Print the current letter 4 times
call [printf]
call [printf]
call [printf]
inc [char] ; Increment the letter
cmp [char], 'Z' ; Compare to 'Z'
jle start ; char <= 'Z' --> goto start
section 'r.data' data readable writeable
char db 'A', 10, 0 ; Stores the current letter
section '.idata' data readable import
library msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf'
Kiedy to kompiluję, otrzymuję plik wykonywalny większy niż się spodziewałem. Oto zrzut heksowy:
Zauważyłem, że między sekcją kodu a sekcjami importu danych i bibliotek jest dużo pustej przestrzeni, a także komunikat „Nie można uruchomić tego programu w trybie DOS” w kodzie. Jak mogę złożyć kod źródłowy w mały plik odpowiedni dla Code Golf?
Na marginesie mile widziane są sugestie dotyczące lepszych sposobów drukowania stdout
bez importowania msvcrt
i dzwonienia printf
.
Odpowiedzi:
Dość ogólna wskazówka, ale
Użyj formatu pliku COM zamiast PE EXE.
PE EXE ma kilka wad, które sprawiają, że format ten jest praktycznie bezużyteczny w golfowym kodzie. Pierwszy to wyrównanie obrazu (system Windows nie uruchomi pliku EXE, jeśli nie jest poprawnie wyrównany), a drugi to rozmiar nagłówka. Istnieje kilka czynników, które nie są tak ważne (dzielenie pliku wykonywalnego na sekcje).
Zalety korzystania z formatu pliku COM (który jest prawie równoważny płaskiemu plikowi binarnemu) to:
Zmodyfikowałem twój kod, aby działał jako płaski plik binarny. To bardzo proste:
Wyjściowy plik binarny ma tylko 32 bajty. Wierzę, że można jeszcze bardziej zmniejszyć rozmiar, ale to tylko punkt wyjścia.
Zbierz z
nasm -fbin file.asm -o file.com
. Uwaga: ten przykład został stworzony dla NASM, ale możesz go swobodnie przetłumaczyć na FASM i będzie działał bezbłędnie.źródło