global _start section .text %define SRC 0xB8000 %define DST 0xB9000 %define ARR_SIZE 10 %define PROT_READ 0x1 %define PROT_WRITE 0x2 %define MAP_PRIVATE 0x02 %define MAP_ANONYMOUS 0x20 _start: ; Из-за особенностей ядра линукса нужно сначала промапать произвольную память mov rax, 0x9 ; mmap mov rdi, SRC ; где mov rsi, ARR_SIZE ; сколько mov rdx, PROT_READ ; флаги чтения or rdx, PROT_WRITE ; флаги записи mov r10, MAP_PRIVATE ; приватная память or r10, MAP_ANONYMOUS ; не связана с файлом mov r9, 0 ; офсет должен быть 0 syscall mov rsi, rax ; ставлю так, так как ядро линукса выделяет ближайшую область памяти, а не точно заказанную - проклятое выравнивание ; заполню чем-нибудь массив mov rcx, ARR_SIZE mov rbx, 0 .fill_src_loop: mov [rsi + rbx], bl inc rbx loop .fill_src_loop push rsi mov rax, 0x9 ; mmap mov rdi, DST ; где mov rsi, ARR_SIZE ; сколько mov rdx, PROT_WRITE ; флаги чтения ; or rdx, PROT_WRITE ; флаги записи mov r10, MAP_PRIVATE ; приватная память or r10, MAP_ANONYMOUS ; не связана с файлом mov r9, 0 ; офсет должен быть 0 syscall mov rdi, rax ; заполню чем-нибудь массив mov rcx, ARR_SIZE ; сколько байт копируем pop rsi rep movsb mov rax, 60 mov rdi, 0 syscall