Sebagai latihan, saya telah membuat solusi sederhana untuk tantangan ini , dalam Bahasa Assembly x86. Saya menjalankan ini dengan FASM di Windows. Ini kode sumber saya:
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'
Ketika saya kompilasi ini, saya mendapatkan executable lebih besar dari yang saya harapkan. Ini hexdump:
Saya melihat ada banyak ruang kosong antara bagian kode dan bagian impor data dan perpustakaan, serta pesan yang mengatakan "Program ini tidak dapat dijalankan dalam mode DOS" yang tertanam dalam kode. Bagaimana saya bisa merakit kode sumber saya ke file kecil, cocok untuk Code Golf?
Sebagai catatan tambahan, saran untuk cara mencetak yang lebih baik stdout
tanpa mengimpor msvcrt
dan menelepon printf
dipersilakan.
Jawaban:
Tip yang agak umum, tapi
Gunakan format file COM sebagai ganti PE EXE.
PE EXE memiliki beberapa kekurangan yang membuat format ini cukup berguna dalam kode-golf. Yang pertama adalah penyelarasan gambar (Windows tidak akan menjalankan file EXE jika tidak disejajarkan dengan benar), dan yang kedua adalah ukuran tajuk. Ada beberapa faktor yang tidak penting ini (membagi yang dapat dieksekusi menjadi beberapa bagian).
Keuntungan menggunakan format file COM (yang hampir setara dengan biner datar) adalah:
Saya telah merevisi kode Anda agar berfungsi sebagai biner datar. Sederhana sekali:
Biner keluaran hanya 32 byte. Saya percaya, mungkin untuk mengurangi ukuran lebih jauh, tetapi ini hanyalah titik awal.
Berkumpul dengan
nasm -fbin file.asm -o file.com
. Catatan, contoh ini telah dibuat untuk NASM, tetapi Anda dapat menerjemahkannya secara bebas ke FASM, dan itu akan berfungsi dengan sempurna.sumber