Bagaimana cara mengurangi ukuran EXE dari AS86 x86 yang dikompilasi dengan FASM?

14

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:

https://pastebin.com/W5sUTvTe

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 stdouttanpa mengimpor msvcrtdan menelepon printfdipersilakan.

vasilescur
sumber
@ iBug Maaf mendengarnya. Bisakah Anda menyarankan tempat yang lebih cocok untuk saya tanyakan?
vasilescur
12
@iBug Tips pertanyaan meminta bantuan golf dalam kasus-kasus tertentu jelas bukan di luar topik di sini.
AdmBorkBork
12
Meta yang relevan
AdmBorkBork
1
Itu harus: mulai: push char Lb: panggilan [printf] panggilan [printf] panggilan [printf] panggilan [printf] inc [char] cmp [char], 'Z' jb Lb karena jika tidak, dapat mengkonsumsi tumpukan ; kita harus melihat apakah setiap panggilan untuk mencetak kita harus menambahkan instruksi yang menyesuaikan esp
RosLuP
1
alih-alih printf, Anda dapat WriteFile (stdout), tidak memerlukan impor selain kernel32 (yang ada secara default, Anda hanya perlu menentukan alamatnya)
peter ferrie

Jawaban:

2

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:

  • Kode tajuk nol, file tidak dibagi menjadi beberapa bagian
  • Tidak ada penyelarasan gambar (sehingga ukuran gambar mungkin tidak dapat dibagi oleh kekuatan dua yang didefinisikan dengan ketat, tetapi harus lebih kecil dari 65K. Namun tidak banyak berubah, karena jika kiriman Anda lebih besar dari 65K, Anda melakukan sesuatu yang salah).
  • Anda tidak dapat menggunakan perpustakaan eksternal - ini sebenarnya merupakan nilai tambah, karena Anda tanpa ragu memiliki cara lain untuk melakukan I / O. Di situlah gangguan BIOS berguna.
  • Anda memiliki kendali langsung atas memori dan perangkat yang terhubung ke sistem, oleh karena itu tidak ada paging, tidak ada pelanggaran akses, tidak ada perlindungan memori, tidak ada konkurensi, dan sebagainya. Fitur - fitur ini memudahkan golf dengan program yang benar-benar kreatif.

Saya telah merevisi kode Anda agar berfungsi sebagai biner datar. Sederhana sekali:

ORG 100H

MOV DX, P
MOV AH, 9

L:
    INT 21H
    INT 21H
    INT 21H
    INT 21H

    INC BYTE [P]
    CMP BYTE [P], 'Z'
    JLE L

MOV AX, 4C00h
INT 21h

P DB "A", 10, "$"

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.

Krzysztof Szewczyk
sumber
Saya tidak percaya saya telah menjawab pertanyaan ini dan kembali dari google
Krzysztof Szewczyk