feat: приложены решения некоторых заданий на nasm
Обязательно понимание того, что я не проверял эти решения)
This commit is contained in:
29
02-cpu-commnads/task2.asm
Normal file
29
02-cpu-commnads/task2.asm
Normal file
@ -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
|
||||
25
02-cpu-commnads/task3.asm
Normal file
25
02-cpu-commnads/task3.asm
Normal file
@ -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
|
||||
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