# 03 - Dan seluruh byte tidak cukup ... | 2B atau tidak 2B

Jadi, teman-teman, pada 1 April, saatnya untuk mengungkapkan kartu, apa sebenarnya “ 2B atau tidak 2B ”. Ini adalah teks bersama dari penulis karya.nasib sial dan sudah tidak asing lagi bagimu kakek kafir

gambar

Pastikan untuk mengunduh arsip dengan karya di Pouet dan baca artikel pendahuluan (April Mop '), serta komentar di atasnya. Tonton video pertama dengan demonstrasi praktis tentang bagaimana kode dua byte bekerja pada x86. Dan baru kemudian mencoba menguasai seluruh teks di bawah ini.


Ya, 2B atau tidak 2B benar-benar sebuah lingkungan untuk meluncurkan berbagai karya sizecoding, sangat sederhana dan, mungkin, yang terkecil dari yang ada. Namun, ia memiliki persyaratan dan batasannya sendiri.

Jika orang lain belum menangkapnya, alat 2b.com diluncurkan dari bawah DOS (DOSBox, FreeDOS, MS-DOS) dan melompat ke area baris perintah (dengan mengimbangi $ 82 * dari segmen PSP), meluncurkan kode yang ditransfer ke eksekusi baris perintah dalam biner. Sebenarnya, kode ini mungkin memiliki bentuk string yang dapat diketik di keyboard (mis., Terdiri dari karakter ASCII dengan kode dari 33 hingga 126), tetapi lebih lanjut tentang itu nanti.

* Angka heksadesimal kami akan menulis dalam notasi Pascal $ XX, ini nyaman, dan fasme memungkinkan Anda untuk melakukan ini.

Apa yang penting diketahui?


Null, kami sarankan menggunakan fasm sebagai kompiler , semua alat kami ditulis khusus untuk itu.

Pertama, kode utama dapat memiliki ukuran maksimum 125 byte (ini adalah batasan pada panjang baris perintah) dan akan mulai sebagai program COM biasa, hanya dengan offset $ 82, bukan $ 100, seperti biasa. Segera setelah kode utama, simbol carriage return (CR) dengan kode 13 ($ 0D) akan ditambahkan secara otomatis, dan perintah jmp short $82($ EB, $ 80) akan berada di $ 100 .

Kedua, karena peluncuran seharusnya berasal dari file BAT (baik, atau dari penerjemah baris perintah), kode tidak boleh mengandung beberapa karakter. Pertama-tama, ini adalah karakter pengalihan I / O ("<", ">" dan "|"), serta karakter parameter substitusi dan variabel lingkungan ("%"). Dalam beberapa sistem (termasuk Windows, mendukung peluncuran program-program DOS dari bawah V86), karakter "&", "^" juga memiliki arti khusus. Karakter khusus dengan kode hingga 32 tidak didukung oleh semua DOS, dan beberapa tidak didukung oleh apa pun atau hampir tidak ada (DOSBox memiliki set yang sangat sedikit), sehingga semua karakter ini juga dikecualikan.

Ketiga, nilai awal semua register dan flag sama dengan ketika memulai program COM. Pada sebagian besar DOS, permulaannya adalah: ax = bx = 0 (hampir selalu), cx = $ FF, dx = cs = ds = es = ss, si = $ 100, di = sp = $ FFFE (dengan jumlah operasional yang cukup) memory), bp = $ 9XX (byte rendah berbeda di mana-mana, tetapi tetrad-nya tinggi, yaitu, gigitan, biasanya = 1), flag cf = df = 0. Untuk menggunakannya atau tidak, itu terserah Anda.

Yang terpenting, poin "kedua" membingungkan di sini, bukan?
Misalkan kita perlu menulis:

   mov ah,0
   int $16
   cmp al,27
   je x

Dan kemudian segera ada 5 karakter terlarang sekaligus: 0 in mov ah,0, $ 16 in int $16, $ 3C (karakter "<") dan 27 ($ 1B) masuk cmp al,27dan beberapa angka dengan kode <32 in je xjika xterletak di suatu tempat di dekat kode.

Apa yang harus dilakukan? Apa yang bisa diganti dengan perintah lain digantikan oleh:

  • alih-alih mov ah,0kami menulis xor ah,ahatau bahkan cbw(jika mungkin);
  • alih-alih cmp al,27kita menulis not al+ sub al,not 27atau xor al,not 27+ inc al, dan bahkan lebih baik (karena di sini kita perlu menunggu tombol ditekan dan membandingkan kode yang diterima dengan kode kunci ESC) - dec ah.

C int $16lebih rumit, tetapi jika Anda memikirkannya, maka konstruksi xor ah,ah+ int $16dapat diganti, misalnya, dengan mov ah,$83+ ror ah,1+ int $21.

Masih ada je $+10. Setidaknya ada 2 cara: membuat lompatan mundur (ke jarak yang cukup), dan dari sana maju. Atau ganti byte dalam kode. Misalnya, Anda dapat menulis z: je ($*2+3)-x, tetapi di suatu tempat di atas: not byte [si-($100-(z+1))].

Sebagai hasilnya, kita mendapatkan:

   not byte [si-($100-(z+1))]  ;  2-  ( ) je  si=$100
   mov ah,$83
   rol ah,1  ; ah=7
   int $21  ;   ,    al
   not al
   sub al,not 27  ; cmp al,27
z: je ($*2+3)-x  ;    x (   )

Solusi alternatif


Tentu saja, dalam pengantar akhir untuk 100+ byte karakter terlarang dapat ada cukup banyak (misalnya, 15-20 dan bahkan lebih), dan setiap kali membuat manipulasi semacam itu adalah pekerjaan yang agak suram, apalagi, mereka sering mengarah pada peningkatan panjang kode.

Karena itu, Anda dapat menggunakan enkripsi. Baik seluruh kode, atau tempat individual. Dalam contoh 2b_life.asm, kami mengenkripsi semua kode dengan menambahkan $ AC ke setiap byte. Setelah enkripsi pertama, kita memiliki sekitar 4 karakter terlarang yang tersisa, yang bisa kita selesaikan dengan mengganti dengan perintah lain. Tentu saja, pilihan metode enkripsi (tambah, sub, xor, tidak, dll.), Serta kuncinya, juga membutuhkan waktu, tetapi ini adalah yang paling kecil dari semua kejahatan. Kode dekoder hanya 8 byte - ini cukup dapat diterima dalam situasi ini. Enkripsi terjadi secara otomatis menggunakan arahan.repeat, loaddan store(mis. kita mendapatkan kode yang sudah dienkripsi).


Lokasi individual dienkripsi dalam contoh 2b_note.asm . Di sini, sekali lagi, dengan bantuan repeat, loaddan storenilai $ 3D ditambahkan ke beberapa byte, dan daftar alamat byte ini disimpan secara terpisah (1 byte alamat untuk setiap byte tersebut). Secara total, kami mengenkripsi 20 byte + 13 byte ditempati oleh decryptor. Ya, metode pertama lebih ekonomis :)

Pada awal artikel, kami berjanji untuk berbicara tentang kode, yang dapat berupa string yang terdiri dari karakter ASCII dengan kode dari 33 hingga 126 (sehingga dapat diketik, misalnya, tanpa kesulitan khusus pada keyboard). Ini dimungkinkan, misalnya, jika kode dienkripsi menggunakan karakter heksadesimal atau sejenisnya. Ya, ini boros, tetapi jika dienkripsi menggunakan metode BASE64, biayanya bisa menjadi lebih besar, karena dekoder hanya terdiri dari karakter-karakter seperti itu.


Alat


Untuk kenyamanan penulisan kode di bawah " 2B atau tidak 2B " 4 file dibuat:

  • 2b.draft.asm – 128- BAT-, 2b ( , - , ). , .
  • 2b.draft44.asm – 44- , ASCII- 33 126. - : + «A» ( «A»...«P»), + «K» ( «K» «Z»). – 37 (+ 2 pusha + popa, ). : (125 — 37) / 2 = 44 ( 43, pusha + popa). :). , – 2b_snow.asm 2b_hello.asm
  • 2b.check.inc – include- . , , ( BAT-).
  • 2b.debug.inc – include- ( COM- BIN- ).

?


Himpunan platform yang ada saat intras ditulis tetap tidak berubah selama bertahun-tahun, jika Anda tidak memperhitungkan kategori Wild (AON, setrika solder, cotton buds). Kami menawarkan Anda ... bukan hanya platform baru, tetapi setidaknya beberapa variasi, dengan keterbatasannya. Keterbatasan dan penanggulangannya adalah esensi dari demoscene sebagai suatu proses. Akan menyenangkan untuk melihat seluruh kontes dalam kerangka konsep ini di demopati terdekat, di mana penulis yang berbeda akan dapat mencoba tangan mereka di "2B atau tidak 2B kompo" :)

--- EOF ---

#FF - Dan seluruh byte tidak cukup ... | Pilot)
# 00 - ICBM ... | Undangan ke Revision Online 2020
# 01 - IBMP ... | Apa itu intro?
# 02 - MBM ... | Salib Perubahan
# 03 - IBMP ... | 2B atau tidak 2B
# 04 - MBM ... | Kami mengambil BC dengan klakson
# 05 - ICBM ... | Anime
# 06 - IBMP ... |

Saluran Hiburan Meteorisme Kakek di Telegram:teleg.run/bornded

Ada obrolan di sebelah saluran. Di dalamnya, Anda dapat mencoba mengajukan pertanyaan untuk demoscene, assembler, pixel art, musik pelacak dan aspek lain dari proses. Anda dapat dijawab atau dikirim ke obrolan lain yang lebih bertema.

Jadi mereka menang - jadi kami menang!

All Articles