From e5c09afc6dfaf1d52eba15010b83d2545a65fdf3 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 21 Sep 2024 23:13:33 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D1=85=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=BD=D0=B0=20nas?= =?UTF-8?q?m?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обязательно понимание того, что я не проверял эти решения) --- 02-cpu-commnads/task2.asm | 29 ++++++++++++++++++ 02-cpu-commnads/task3.asm | 25 +++++++++++++++ 02-cpu-commnads/task5.asm | 64 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 02-cpu-commnads/task2.asm create mode 100644 02-cpu-commnads/task3.asm create mode 100644 02-cpu-commnads/task5.asm diff --git a/02-cpu-commnads/task2.asm b/02-cpu-commnads/task2.asm new file mode 100644 index 0000000..1270702 --- /dev/null +++ b/02-cpu-commnads/task2.asm @@ -0,0 +1,29 @@ +global _start + +section .data + + source: db 1, 2, 3, 4, 5, 6, 7, 8 + s_size equ $-source + +section .bss + + dest: resb 8 + +section .text + +_start: + + lea rsi, [source] + lea rdi, [dest] + mov rcx, s_size + + .loop: + + mov al, [rsi + rcx] + mov [rdi + rcx], al + + loop .loop + + mov rax, 60 + mov rdi, 0 + syscall diff --git a/02-cpu-commnads/task3.asm b/02-cpu-commnads/task3.asm new file mode 100644 index 0000000..b8ec57e --- /dev/null +++ b/02-cpu-commnads/task3.asm @@ -0,0 +1,25 @@ +global _start + +section .data + source: db 1, 2, 3, 4, 5, 6, 7, 8 + s_size equ $-source + +section .bss + + dest: resb 8 + +section .text + +_start: + + mov rsi, source + mov rdi, dest + mov rcx, s_size + + .loop: + rep movsb + loop .loop + + mov rax, 60 + mov rdi, 0 + syscall diff --git a/02-cpu-commnads/task5.asm b/02-cpu-commnads/task5.asm new file mode 100644 index 0000000..c2050ba --- /dev/null +++ b/02-cpu-commnads/task5.asm @@ -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 +