В качестве упражнения я создал простое решение этой проблемы на языке ассемблера x86. Я запускаю это с FASM на Windows. Вот мой исходный код:
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'
Когда я компилирую это, я получаю исполняемый файл больше, чем я ожидал. Вот hexdump:
Я заметил, что между разделом кода и разделами импорта данных и библиотек есть много пустого пространства, а также встроенное в код сообщение «Эта программа не может быть запущена в режиме DOS». Как собрать исходный код в небольшой файл, подходящий для Code Golf?
В качестве примечания приветствуются предложения по улучшению способов печати stdout
без импорта msvcrt
и вызова printf
.
Ответы:
Совсем немного общего совета, но
Используйте формат файла COM вместо PE EXE.
PE EXE имеет несколько недостатков, делающих формат практически бесполезным в коде-гольфе. Первый - выравнивание изображения (Windows не запускает EXE-файл, если он не выровнен должным образом), а второй - размер заголовка. Есть несколько факторов, которые не так важны (деление исполняемого файла на разделы).
Преимущества использования формата файла COM (который в значительной степени эквивалентен плоскому двоичному файлу):
Я изменил ваш код, чтобы работать как плоский двоичный файл. Это очень просто:
Выходной двоичный файл имеет размер всего 32 байта. Я считаю, что можно уменьшить размер еще больше, но это только отправная точка.
Собрать с
nasm -fbin file.asm -o file.com
. Обратите внимание, что этот пример был сделан для NASM, но вы можете свободно перевести его в FASM, и он будет работать безупречно.источник