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 +