Cześć
OS: Linux debian 4.19.0-9-amd64 #1 SMP Debian x86_64 GNU/Linux
Compiler: NASM version 2.14
nasm: nasm -f elf64 zabawa.asm -o zabawa.o
ld: ld zabawa.o -o zabawa
Dawno nic tu nie pisałem :).
Wydawało mi się, że dobrze zacząłem rozumieć temat wywołań i instrukcji warunkowych, ale czegoś mi brakuje :/.
Czy ktoś może mi po ludzku wyjaśnić dlaczego mam segment fault ?
section .data
msg: db 'Hello world',10
end: db 'Ending program', 10
section .text
global _start
hello_world:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx , 14
syscall
ret
exit:
mov rax, 1
mov rdi, 1
mov rsi, end
mov rdx, 20
syscall
ret
_start:
mov rax, 10
mov rdx, 10
cmp rax, rdx
je hello_world
jne exit
call hello_world
mov rax, 60
xor rdi,rdi
syscall
call exit
output:
./zabawa
Hello world
EnSegmentation fault
Googloawem, nawet zapytałem na SO, ale tam nie wytłumaczą mi prosto ..
Problem w tym, że funkcja po dotarciu do instrukcji ret wraca pod zły adres, ale gdy próbowałem dodać to :
push rbp < - prolog
mov rbp, rsp <- prolog
mov rsp,0x21 <- prolog
leave <- na koniec
ret <- na koniec
ale efekt ciągle taki sam, chce wykonać najprostszy na świecie skok warunkowy, ale nie mam już pomysłu. Używałem ltrace/ptrace i nic.. jedyne na czym operuje to gdb z gef'em