Lab 2: Базовые команды и кодирование для процессора #2
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