# 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).