TL;DR
How can I modify the stack while using
retor achieving similar effect while using something else?
Hello world,
I am trying to make a compiler for my language, currently everything is inlined and it makes the compilation slow for some steps so today I decided to try to optimise it using functions, though it keeps segfaulting, then I realised
This seems to not work:
;; main.s
BITS 64
segment .text
global _start
exit:
    mov rax, 60  ;; Linux syscall number for exit
    pop rdi      ;; Exit code
    syscall
    ret
write:
    mov rax, 1  ;; Linux syscall number for write
    mov rdi, 1  ;; File descriptor (1 = stdout)
    pop rsi     ;; Pointer to string
    pop rdx     ;; String length
    syscall
    ret
_start:
    mov rax, msg_len
    push rax
    mov rax, msg
    push rax
    call write
    mov rax, 0
    push rax
    call exit
segment .data
msg: db "Hello, world!", 10
msg_len: equ $-msg
My output for this is.... questionable:
$ nasm -felf64 main.s
$ ld -o main main.s
$ ./main
PHello, world!
@       @ @$@ @+ @2 @main.sexitwritemsgmsg_len__bss_start_edata_end.symtab.strtab.shstrtab.text.data9! @  !77!'Segmentation fault
$?(exit code) is139(segfault)
While all inlined all works:
;; main1.s
BITS 64
segment .text
global _start
_start:
    mov rax, msg_len
    push rax
    mov rax, msg
    push rax
    mov rax, 1  ;; Linux syscall number for write
    mov rdi, 1  ;; File descriptor (1 = stdout)
    pop rsi     ;; Pointer to string
    pop rdx     ;; String length
    syscall
    mov rax, 0
    push rax
    mov rax, 60  ;; Linux syscall number for exit
    pop rdi      ;; Exit code
    syscall
segment .data
msg: db "Hello, world!", 10
msg_len: equ $-msg
My output is completely normal:
$ nasm -felf64 main1.s
$ ld -o main1 main1.o
$ ./main1
Hello, world!
$?(exit code) is0(as specified in assembly, meaning success)
So now I'm here confused as I am a newbie at assembly what to do, even though I found related solutions like
I am still confused how to take that in... Is there a way I can do it or am I stuck with inlining? Should I maybe switch assemblers all together from nasm to something else?
Thanks in advance