65 lines
1.6 KiB
NASM
65 lines
1.6 KiB
NASM
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
|
||
|