diff options
Diffstat (limited to 'linux64/foo.asm')
-rw-r--r-- | linux64/foo.asm | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/linux64/foo.asm b/linux64/foo.asm new file mode 100644 index 0000000..38dcca0 --- /dev/null +++ b/linux64/foo.asm @@ -0,0 +1,55 @@ +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 |