pl-sem/sem4/hello_mmap.asm
2023-08-18 01:08:53 +03:00

122 lines
2.8 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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