---
search:
  exclude: true
---
# Assembly x86_64 - Math operations 

## Assembly Code 

We're going to use vim to write our code
    
    
    [ 192.168.0.18/24 ] [ /dev/pts/88 ] [~/binexp/asm]
    → vim 5.asm
    
    
    
    
    section .data
            digit db 0, 10
    
    section .text
            global _start
    
    
    _start:
            mov rbx, 48             ;48 in the ASCII chart is the "0" character
            call _printRAX          ;print "0" + 1
            call _printRAX          ;print "1" + 1
            call _printRAX          ;print "2" + 1
            call _printRAX          ;print "3" + 1
            call _printRAX          ;print "4" + 1
    
            mov rax, 60
            mov rdi, 0
            syscall
    
    
    
    _printRAX:
            add rbx, 1              ; we increment rbx by 1 (48, 49, 50, 51, ...)
            mov [digit], rbx        ; we move the current value of rbx into the 'digit' memory address
    
            mov rax, 1              ; we use the syscall ID 1
            mov rdi, 1              ; we set the first arg to 1
            mov rsi, digit          ; the second arg is set to be our 'digit' memory address
            mov rdx, 2              ; the third arg is the length of 2 bytes (let's not forget the newline char which is the '10' above)
            syscall
            ret
    
    
    
    

Now let's check what's new in the code:
    
    
       mov [digit], rbx    
    
    

Here we are moving the rbx register into the memory address that's referenced by the 'digit' label.
    
    
    	mov rbx, 48  
            add rbx, 1          
            mov [digit], rbx   
    
    

Now first we set the value of rbx to be 48, which is the "0" character in ascii. Then we want to add the value 1 to the value stored in rbx. and then we just move the rbx value into the memory address referenced by the 'digit' label

Basically our code should print the character 1, 2, 3, 4 and 5 

## 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 5.asm -o 5.o
    
    [ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
    → ld 5.o -o 5
    
    [ 192.168.0.18/24 ] [ /dev/pts/89 ] [~/binexp/asm]
    → ./5
    12345%                                                               
    
    

And that's it ! next tutorial we'll look into loops, you can click [here](6.md).

