|
|
- ; 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
|