Assembly x86_64 - Hello World!

Assembly Code

We're going to use vim to write our code


[ 192.168.0.18/24 ] [ /dev/pts/88 ] [~/binexp/asm]
→ vim 0.asm


section .data
        text db "Hello, World!",10

section .text
        global _start

_start:
        mov rax, 1
        mov rdi, 1
        mov rsi, text
        mov rdx, 14
        syscall

        mov rax, 60
        mov rdi, 0
        syscall

Compiling

Here we're going to use nasm to compile our assembly code:


[ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
→ nasm -f elf64 0.asm -o 0.o

[ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
→ ls -lash
total 16K
4.0K drwxr-xr-x 2 nothing nothing 4.0K Mar  2 16:17 .
4.0K drwxr-xr-x 5 nothing nothing 4.0K Mar  2 16:01 ..
4.0K -rw-r--r-- 1 nothing nothing  179 Mar  2 16:09 0.asm
4.0K -rw-r--r-- 1 nothing nothing  848 Mar  2 16:17 0.o

Now we have our 0.asm code and the 0.o object file, now we need to link it using the gnu linker (ld) to make an executable file


[ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
→ ld 0.o -o 0

[ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
→ ls -lash
total 28K
4.0K drwxr-xr-x 2 nothing nothing 4.0K Mar  2 16:19 .
4.0K drwxr-xr-x 5 nothing nothing 4.0K Mar  2 16:01 ..
 12K -rwxr-xr-x 1 nothing nothing 8.7K Mar  2 16:19 0
4.0K -rw-r--r-- 1 nothing nothing  179 Mar  2 16:09 0.asm
4.0K -rw-r--r-- 1 nothing nothing  848 Mar  2 16:17 0.o

[ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
→ file 0
0: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped


and now we have our executable file called '0', we make it executable with chmod +x and then execute it:


[ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
→ chmod +x 0

[ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
→ ./0
Hello, World!

And that concludes our first assembly code! in the next part we're going to explain everything about this code here.