bits 64 section .data usage: db 'usage: ', 0x00 params: db ' [string]', 0x00 newline: db 0x0a, 0x00 section .text global _start _start: pop rax ; argc is on stack cmp rax,1 ; see if is 1 (no parameters) je help pop rsi ; program name pop rsi ; first parameter call print mov rsi, newline call print jmp exit help: mov rsi, usage call print pop rsi call print mov rsi, params call print mov rsi, newline call print jmp exit print: mov rdi, rsi ; copy, scasb uses edi xor al, al ; al = 0 mov rcx, 4096 ; maximum length 4096 ; this is used by REPNE ; and not specific to SCASB cld repne scasb ; scan for '\0' ; edi is now address of '\0' sub rdi, rsi ; rdi is now length of string mov rdx, rdi ; rdx : write(..., strlen) sub rdx, 1 ; skip '\0' mov rax, 1 ; syscall write() mov rdi, 1 ; rdi : write(fd, ...) syscall ret exit: mov rax, 60 ; exit() mov rdi, 0 syscall