Perakitan untuk x86 Linux, 106 byte
BITS 32
org 0x2E620000
db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident
dd 0, 0
dw 2 ; e_type
dw 3 ; e_machine
dd 1 ; e_version
dd _start ; e_entry
dd phdr - $$ ; e_phoff
dd 0 ; e_shoff
dd 0 ; e_flags
dw 0x34 ; e_ehsize
dw 0x20 ; e_phentsize
phdr: dd 1 ; e_phnum ; p_type
; e_shentsize
dd 0 ; e_shnum ; p_offset
; e_shstrndx
dd $$ ; p_vaddr
fname equ $ - 2
db 'out', 0 ; p_paddr
dd filesize ; p_filesz
dd filesize ; p_memsz
dd 5 ; p_flags
dd 0x1000 ; p_align
_start: mov al, 5 ; 5 = open syscall
mov ebx, fname
mov cl, 65 ; 65 = O_WRONLY | O_CREAT
mov dx, 666q
int 0x80
lea edx, [byte ecx + filesize - 65]
xchg eax, ebx
xchg eax, ecx
mov cl, 0
mov al, 4 ; 4 = write syscall
int 0x80
mov al, 1 ; 1 = exit syscall
int 0x80
filesize equ $ - $$
Ini untuk assembler nasm. Bangun biner dengan baris perintah:nasm -f bin -o a.out selfrep.asm && chmod +x a.out
Berikut file yang sama dengan hex dump: 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 62 2E 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 62 2E 6F 75 74 00 6A 00 00 00 6A 00 00 00 05 00 00 00 00 10 00 00 B0 05 BB 36 00 62 2E B1 41 66 BA B6 01 CD 80 8D 51 29 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
Seperti yang diminta, program menyalin dirinya ke file terpisah. (Program bisa saja jauh lebih singkat jika diizinkan untuk hanya menulis ke stdout dan membiarkan pengguna mengarahkan ulang ke file.)
Saya menghindari menggunakan trik batas untuk mengurangi ukuran. Ini harus sepenuhnya biner ELF 32-bit.
Diedit untuk menambahkan : Dalam versi di atas file yang dibuat hanyalah file biasa, tetapi terpikir oleh saya bahwa untuk beberapa byte (dan sedikit tikungan aturan), Anda dapat membuat sesuatu yang sedikit lebih menarik. Versi ini hanya dua byte lebih panjang, pada 108 byte:
BITS 32
org 0x00010000
db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident
dd 0, 0
dw 2 ; e_type
dw 3 ; e_machine
dd 1 ; e_version
dd _start ; e_entry
dd phdr - $$ ; e_phoff
dd 0 ; e_shoff
dd 0 ; e_flags
dw 0x34 ; e_ehsize
dw 0x20 ; e_phentsize
phdr: dd 1 ; e_phnum ; p_type
; e_shentsize
dd 0 ; e_shnum ; p_offset
; e_shstrndx
dd $$ ; p_vaddr
fname: db 'asr', 0 ; p_paddr
dd filesize ; p_filesz
dd filesize ; p_memsz
dd 7 ; p_flags
dd 0x1000 ; p_align
_start: mov al, 5 ; 5 = open syscall
mov ebx, fname
inc byte [ebx]
mov cl, 65 ; 65 = O_WRONLY | O_CREAT
mov dx, 777q
int 0x80
lea edx, [byte ecx + filesize - 65]
xchg eax, ebx
xchg eax, ecx
mov cl, 0
mov al, 4 ; 4 = write syscall
int 0x80
mov al, 1 ; 1 = exit syscall
int 0x80
filesize equ $ - $$
Beri nama versi ini asr
, untuk "replikator diri":nasm -f bin -o asr asr.asm && chmod +x asr
Versi hex dump untuk orang yang mengalami gangguan nafas:
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 01 00 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 01 00 61 73 72 00 6C 00 00 00 6C 00 00 00 07 00 00 00 00 10 00 00 B0 05 BB 38 00 01 00 FE 03 B1 41 66 BA FF 01 CD 80 8D 51 2B 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
Ketika Anda menjalankannya, itu menciptakan file yang hampir identik bernama bsr
, tetapi itu sendiri dapat dieksekusi. Menjalankannya akan membuat file biner lain bernama csr
. Dan seterusnya.
(Perhatikan bahwa hal-hal menjengkelkan mulai terjadi setelah itu zsr
. Saya mempertimbangkan untuk membuat versi yang akan mengubah nama perubahan atr
dan sebagainya, tapi saya pikir kebanyakan orang akan bosan dengan baik sebelum itu, jadi mungkin tidak semua byte ekstra bernilai. )