aboutsummaryrefslogtreecommitdiffstats
path: root/linux64/foo.asm
diff options
context:
space:
mode:
authorClemens Fries <git-generic@xenoworld.de>2018-12-05 18:19:52 +0100
committerClemens Fries <git-generic@xenoworld.de>2018-12-05 18:27:53 +0100
commit0b8e618c7e32bd22158ee74bc3cf095b1b262032 (patch)
treefe220e7bcc31d934cb5ae29e93622f0ed445136a /linux64/foo.asm
parentbed5515c8dee2a19c1ba9dbc005e078c613e3cf3 (diff)
Add some 64 bit assembly program from around 2010HEADmaster
Diffstat (limited to 'linux64/foo.asm')
-rw-r--r--linux64/foo.asm55
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