; calc_str_len.asm ; Prints calculates the length of the string "Hello, world!" and prints to stdout ; Compile with "nasm -f elf64 calc_str_len.asm && ld calc_str_len.o -o calc_str_len" .text: global _start _start: mov rax, msg ; move msg to rax register call strlen ; call strlen subroutine mov rax, 1 ; system call for write mov rdi, 1 ; file handle for stdout syscall ; call kernel mov rax, 60 ; system call for exit mov rdi, 0 ; exit code syscall ; call kernel strlen: push rax ; push rax to stack mov rbx, rax ; move rax value (msg variable) to rbx register calc_str_len: cmp byte [rax], 0 ; check if the pointer of rax equals 0 (string delimeter) jz exit_loop ; jump to "exit_loop" if zero flag has been set inc rax ; increment rax (position along string) jmp calc_str_len ; jump to start of loop exit_loop: sub rax, rbx ; subtract rbx from rax to equal to length of bytes between them mov rdx, rax ; rax will now equal the length of the string pop rsi ; pop top value on stack to rsi for printing ret .data: ; initialize doubleword msg variable msg db 'Hello, world!',0xa,0x0