View Single Post
  #2   (View Single Post)  
Old 26th July 2017
ibara ibara is offline
OpenBSD language porter
 
Join Date: Jan 2014
Posts: 783
Default

Even when whitespace isn't semantically important, it's still important. That's not how you write assembly.

Now, on to what you care about. Your ld(1) incantation is wrong. It's easier to use cc(1) to do the linking for you.

I fixed your main.asm:
Code:
        section .note.openbsd.ident
        align   2
        dd      8,4,1
        db      'OpenBSD',0
        dd      0
        align   2

        extern  SDL_Init

        section .text
        global  main
main:
        mov     edi,0x20        ; SDL_Init takes a uint32_t, not a uint64_t
        call    SDL_Init wrt ..plt      ; -fPIC
        mov     eax,1           ; Originally an xor eax,eax | inc al combo
        xor     edi,edi         ; You need a sane return code (otherwise it's 0x20)
        syscall
Then run:
Code:
$ nasm -f elf64 main.asm -o main.o
$ cc -L/usr/local/lib -L/usr/X11R6/lib -R/usr/X11R6/lib -o main main.o -lSDL2
Note that every line except for labels begins with a tab, labels are on their own lines, there is always a tab between the operator and the operands, there is no space before or after commas in the operand list, and comments are preceded by at least one tab. The sole exception to this is SDL_Init wrt ..plt but that is a limitation of the syntax (the equivalent AT&T syntax is SDL_Init@PLT, which doesn't exhibit this problem).

As an aside, I find Intel assembly syntax to be horrific. Unless there's a reason for you to be using nasm (and there are plenty, unfortunately) you might be better served learning AT&T assembly syntax and using as(1) as your assembler.
Reply With Quote