1section .data
2 newline db 10
3
4section .bss
5 buffer resb 256
6
7section .text
8 global _start
9
10strlen:
11 xor rcx, rcx
12.loop:
13 cmp byte [rdi + rcx], 0
14 je .done
15 inc rcx
16 jmp .loop
17.done:
18 mov rax, rcx
19 ret
20
21write_stdout:
22 push rbp
23 mov rbp, rsp
24 push rdi
25 call strlen
26 pop rdi
27 mov rdx, rax
28 mov rsi, rdi
29 mov rdi, 1
30 mov rax, 1
31 syscall
32 mov rsi, newline
33 mov rdx, 1
34 mov rdi, 1
35 mov rax, 1
36 syscall
37 pop rbp
38 ret
39
40strcopy:
41 xor rcx, rcx
42.copy_loop:
43 mov al, [rsi + rcx]
44 mov [rdi + rcx], al
45 test al, al
46 jz .copy_done
47 inc rcx
48 jmp .copy_loop
49.copy_done:
50 mov rax, rcx
51 ret
52
53to_upper:
54 xor rcx, rcx
55.upper_loop:
56 mov al, [rdi + rcx]
57 test al, al
58 jz .upper_done
59 cmp al, 'a'
60 jb .upper_next
61 cmp al, 'z'
62 ja .upper_next
63 sub al, 32
64 mov [rdi + rcx], al
65.upper_next:
66 inc rcx
67 jmp .upper_loop
68.upper_done:
69 ret
70
71reverse_string:
72 push rbp
73 mov rbp, rsp
74 call strlen
75 dec rax
76 xor rcx, rcx
77.rev_loop:
78 cmp rcx, rax
79 jge .rev_done
80 mov dl, [rdi + rcx]
81 mov bl, [rdi + rax]
82 mov [rdi + rcx], bl
83 mov [rdi + rax], dl
84 inc rcx
85 dec rax
86 jmp .rev_loop
87.rev_done:
88 pop rbp
89 ret
90
91_start:
92 mov rdi, 0
93 mov rax, 60
94 syscall