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