; 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