pl-sem/sem4/hello_mmap.asm

123 lines
2.8 KiB
NASM
Raw Permalink Normal View History

2023-08-17 22:08:53 +00:00
; hello_mmap.asm
%define O_RDONLY 0
%define PROT_READ 0x1
%define MAP_PRIVATE 0x2
%define SYS_WRITE 1
%define SYS_OPEN 2
%define SYS_CLOSE 3
%define SYS_FSTAT 5
%define SYS_MMAP 9
%define SYS_MUNMAP 11
%define SYS_EXIT 60
%define FD_STDOUT 1
%define FSTAT_SIZE 144
%define FSTAT_FSIZE_OFFSET 48
global print_file
global print_string
section .data
fstat_buff: db "hello", 0
section .text
; use exit system call to shut down correctly
exit:
mov rax, SYS_EXIT
xor rdi, rdi
syscall
; These functions are used to print a null terminated string
; rdi holds a string pointer
print_string:
push rdi
call string_length
pop rsi
mov rdx, rax
mov rax, SYS_WRITE
mov rdi, FD_STDOUT
syscall
ret
string_length:
xor rax, rax
.loop:
cmp byte [rdi+rax], 0
je .end
inc rax
jmp .loop
.end:
ret
; This function is used to print a substring with given length
; rdi holds a string pointer
; rsi holds a substring length
print_substring:
mov rdx, rsi
mov rsi, rdi
mov rax, SYS_WRITE
mov rdi, FD_STDOUT
syscall
ret
; rdi - file name
print_file:
push r12
push r13
; Вызовите open и откройте fname в режиме read only.
mov rax, SYS_OPEN
mov rsi, O_RDONLY ; Open file read only
xor rdx, rdx ; We are not creating a file
; so this argument has no meaning
syscall
; rax holds the opened file descriptor now
mov r12, rax ; save fd to r12
; get stat of file
mov rdi, r12
mov rsi, fstat_buff
mov rax, SYS_FSTAT
syscall
; get size of file in from its stats
mov r13, fstat_buff
add r13, FSTAT_FSIZE_OFFSET
mov r13, [r13]
; now rsi stores the files size
; Вызовите mmap c правильными аргументами
; Дайте операционной системе самой выбрать, куда отобразить файл
; Размер области возьмите в размер страницы
; Область не должна быть общей для нескольких процессов
; и должна выделяться только для чтения.
xor rdi, rdi
mov r8, r12
xor r9, r9
mov rsi, r13
mov rdx, PROT_READ
mov r10, MAP_PRIVATE
mov rax, SYS_MMAP
syscall
; now rax stores the mapped file address
; с помощью print_substring теперь можно вывести его содержимое
push rax ; save mapped file address
mov rdi, rax
mov rsi, r13
call print_substring
; unmap mapped file
pop rdi ; retrieve mapped file address from stack
mov rsi, r13
mov rax, SYS_MUNMAP
syscall
; close file
mov rdi, r12
mov rax, SYS_CLOSE
syscall
pop r13
pop r12
ret