122 lines
2.8 KiB
NASM
122 lines
2.8 KiB
NASM
; 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
|