с этим носом:
%define O_RDONLY 0
%define PROT_READ 0x1
%define MAP_PRIVATE 0x2
section .data
fname: db 'test.txt', 0
section .text
global _start
print:
; ---- THIS PART ADDED
mov r15, [rdi]
add r15, 1 ; have tried `inc byte[rdi]` - did not work either
mov [rdi], r15
; ---- END OF ADDED PART
; else is according to book (so correct)
push rdi
call str_len
pop rsi
mov rdx, rax
mov rax, 1
mov rdi, 1
syscall
ret
str_len:
xor rax, rax
.loop:
cmp byte [rdi+rax], 0
je .end
inc rax
jmp .loop
.end:
ret
_start:
;call open
mov rax, 2
mov rdi, fname
mov rsi, O_RDONLY
mov rdx, 0
syscall
;mmap
mov r8, rax
mov rax, 9
mov rdi, 0
mov rsi, 4094
mov rdx, PROT_READ
mov r10, MAP_PRIVATE
mov r9, 0
syscall
mov rdi, rax ;returned address
call print
mov rax, 60
xor rdi, rdi
syscall
Файл test.txt
содержит только один символ в начале - 5
.
Я получил адрес из области, заданной mmap
в rax
, который я потом mov
е rdi
. И я просто хочу увеличить значение (по тому адресу, который сейчас находится в rdi
):
mov r15, [rdi]
add r15, 1 ; have tried `inc byte[rdi]` - did not work either
mov [rdi], r15
push rdi
Так что я временно mov
e значение r15
, его приращение (* 1018) * it 1) и попробуйте mov
e вернуть его по адресу этого региона (адрес еще в rdi
). Но тогда segfault
.
Почему это так? Почему я не могу использовать значение по адресу (в полученный регион из mmap), которое содержит 5
- один байт (на который указывает rdi
), и использовать его в арифметическом c?
Если это будет адрес, объявленный в data segment
, то проблем не будет (я пробовал). Но адрес от mmap
, так чем он отличается и как это исправить?