feat: приложены решения некоторых заданий на nasm
Обязательно понимание того, что я не проверял эти решения)
This commit is contained in:
64
02-cpu-commnads/task5.asm
Normal file
64
02-cpu-commnads/task5.asm
Normal file
@ -0,0 +1,64 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user