Als Übung habe ich eine einfache Lösung für diese Herausforderung in x86-Assemblersprache erstellt. Ich führe dies mit FASM unter Windows aus. Hier ist mein Quellcode:
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'
Wenn ich dies kompiliere, erhalte ich eine ausführbare Datei, die größer ist als erwartet. Hier ist ein Hexdump:
Ich stelle fest, dass zwischen dem Codeabschnitt und den Daten- und Bibliotheksimportabschnitten viel Leerraum vorhanden ist und dass im Code die Meldung "Dieses Programm kann nicht im DOS-Modus ausgeführt werden" eingebettet ist. Wie kann ich meinen Quellcode zu einer kleinen Datei zusammenstellen, die für Code Golf geeignet ist?
Als Randnotiz sind Vorschläge für bessere Druckmöglichkeiten stdout
ohne Importieren msvcrt
und Aufrufen printf
willkommen.
Antworten:
Ganz allgemeiner Tipp, aber
Verwenden Sie das COM-Dateiformat anstelle von PE EXE.
PE EXE hat einige Fehler, die das Format im Code-Golf so gut wie unbrauchbar machen. Das erste ist die Bildausrichtung (Windows führt die EXE-Datei nicht aus, wenn sie nicht richtig ausgerichtet ist), und das zweite ist die Headergröße. Es gibt einige Faktoren, die nicht so wichtig sind (Unterteilen der ausführbaren Datei in Abschnitte).
Die Verwendung des COM-Dateiformats bietet folgende Vorteile:
Ich habe Ihren Code überarbeitet, um als Flat Binary zu arbeiten. Es ist ganz einfach:
Die Ausgabe-Binärdatei ist nur 32 Byte groß. Ich glaube, es ist möglich, die Größe noch weiter zu reduzieren, aber dies ist nur ein Ausgangspunkt.
Zusammenbauen mit
nasm -fbin file.asm -o file.com
. Beachten Sie, dass dieses Beispiel für NASM erstellt wurde, Sie es jedoch frei in FASM übersetzen können und es einwandfrei funktioniert.quelle