Latar Belakang
Ada .ZIP
file yang mengekstraksi sendiri . Biasanya mereka memiliki ekstensi .EXE
(dan dengan mengeksekusi file mereka akan diekstraksi) tetapi ketika mengubah nama mereka .ZIP
, Anda dapat membuka file dengan beberapa perangkat lunak pengekstrak ZIP.
(Ini dimungkinkan karena .EXE
file memerlukan header tertentu tetapi .ZIP
file memerlukan trailer tertentu sehingga memungkinkan untuk membuat file yang keduanya memiliki .EXE
header dan .ZIP
trailer.)
Tugas Anda:
Buat program yang membuat file gambar "menampilkan sendiri":
- Program harus mengambil beberapa gambar 64x64 (setidaknya 4 warna harus didukung) sebagai input dan beberapa file "gabungan" sebagai output
- File keluaran program harus diakui sebagai file gambar oleh pemirsa gambar biasa
- Saat membuka file output dengan penampil gambar, gambar input harus ditampilkan
File output juga harus diakui sebagai file yang dapat dieksekusi untuk semua sistem operasi atau jenis komputer
(Jika file untuk sistem operasi atau komputer yang tidak biasa diproduksi, alangkah baiknya jika emulator PC open-source ada. Namun, ini tidak diperlukan.)
- Saat mengeksekusi file output, gambar input juga harus ditampilkan
- Mungkin mengganti nama file (misalnya dari
.PNG
ke.COM
) diperlukan - Tidak diperlukan bahwa program dan file outputnya dijalankan pada OS yang sama; program misalnya dapat berupa program Windows dan file output yang dapat dieksekusi pada Commodore C64.
Kriteria menang
- Program yang menghasilkan file keluaran terkecil akan menang
- Jika ukuran file output berbeda tergantung pada gambar input (misalnya karena program kompres gambar), file output terbesar yang mungkin dibuat oleh program yang mewakili gambar 64x64 dengan hingga 4 warna jumlah
Ngomong-ngomong
Saya punya ide untuk teka-teki pemrograman berikut ketika membaca pertanyaan ini di StackOverflow.
sumber
.exe
bagian dari tantangan, dan ketika melihatnya sebagai.png
ada piksel yang dimodifikasi berdasarkan pada.exe
-kode ini . Apakah ini diizinkan selama masih.png
bisa kita lihat? Apakah gambar output juga harus memiliki setidaknya 4 warna?Jawaban:
8086 MS-DOS .COM file / BMP, ukuran file output = 2192 byte
Encoder
Encoder ditulis dalam C. Dibutuhkan dua argumen: File input dan file output. File input adalah gambar RGB RAW 64x64 (berarti hanya 4096 RGB triplet RGB). Jumlah warna dibatasi hingga 4, sehingga palet bisa sesingkat mungkin. Hal ini sangat mudah dilakukan; itu hanya membangun palet, mengemas pasangan piksel menjadi byte dan menempelkannya bersama dengan header yang dibuat sebelumnya dan program dekoder.
Berkas keluaran
File output adalah file BMP yang dapat diubah namanya .COM dan dijalankan di lingkungan DOS. Setelah dieksekusi, itu akan berubah ke mode video 13j dan menampilkan gambar.
File BMP memiliki BITMAPFILEHEADER header pertama, yang berisi antara lain bidang ImageOffset, yang menunjukkan di mana dalam file data gambar dimulai. Setelah ini datang BITMAPINFOHEADER dengan berbagai informasi de- / encoding, diikuti oleh palet, jika digunakan. ImageOffset dapat memiliki nilai yang menunjuk di luar ujung header apa pun, memungkinkan kami untuk membuat celah bagi decoder untuk berada. Secara kasar:
Masalah lain adalah memasukkan decoder. BITMAPFILEHEADER dan BITMAPINFOHEADER dapat dipecahkan untuk memastikan kode mesin legal (yang tidak menghasilkan keadaan tidak dapat dipulihkan), tetapi paletnya lebih rumit. Kita tentu saja dapat membuat palet secara artifisial lebih lama, dan menempatkan kode mesin di sana, tetapi saya memilih untuk menggunakan bidang biXPelsPerMeter dan biYPelsPerMeter, yang pertama membuat kode disejajarkan dengan benar, dan yang terakhir untuk melompat ke decoder. Bidang-bidang ini tentu saja akan memiliki sampah di dalamnya, tetapi setiap penampil gambar yang saya uji dengan menampilkan gambar baik-baik saja. Mencetaknya mungkin menghasilkan hasil yang aneh.
Sejauh yang saya tahu, standar-patuh.
Seseorang dapat membuat file yang lebih pendek jika
JMP
instruksi dimasukkan ke dalam salah satu bidang yang disediakan di BITMAPFILEHEADER. Ini akan memungkinkan kita untuk menyimpan ketinggian gambar sebagai -64 dan bukannya 64, yang di negeri ajaib dari file BMP berarti bahwa data gambar disimpan dengan cara yang benar, yang pada gilirannya akan memungkinkan dekoder yang disederhanakan.Dekoder
Tidak ada trik khusus dalam dekoder. Palet diisi oleh encoder, dan ditampilkan di sini dengan nilai-nilai dummy. Ini bisa menjadi sedikit lebih pendek jika tidak kembali ke DOS saat tombol ditekan, tetapi tidak mengasyikkan pengujian tanpa itu. Jika Anda merasa harus melakukannya, Anda dapat mengganti tiga instruksi terakhir dengan
jmp $
menyimpan beberapa byte. (Jangan lupa untuk memperbarui header file jika Anda melakukannya!)BMP menyimpan palet sebagai BGR ( bukan RGB) kembar tiga, diisi dengan nol. Ini membuat pengaturan palet VGA lebih mengganggu dari biasanya. Fakta bahwa BMP disimpan terbalik hanya menambah rasa (dan ukuran).
Tercantum di sini dalam gaya NASM:
sumber
int 0x20
lebihret
.