linux_read_system_call = 0 linux_write_system_call = 1 linux_open_system_call = 2 linux_close_system_call = 3 linux_exit_system_call = 60 standard_input = 0 standard_output = 1 format ELF64 executable 3 segment readable executable macro begin { push rdi enter 0, 0 xor rax, rax } macro end { leave pop rdi ret } main: nop nop nop mov rdi, text_data ; text); call echo ; echo ( loop_1: cmp [main_x], 16 je loop_1e xor rdx, rdx mov eax, [main_x] mov ebx, 15 idiv rbx cmp edx, 0 jne n3 mov rdi, fb call echo jmp n0 n3: xor rdx, rdx mov eax, [main_x] mov ebx, 3 idiv rbx cmp edx, 0 jne n1 mov rdi, f call echo jmp n0 n1: xor rdx, rdx mov eax, [main_x] mov ebx, 5 idiv rbx cmp edx, 0 jne n2 mov rdi, b call echo jmp n0 n2: mov rdi, n call echo n0: inc [main_x] jmp loop_1 loop_1e: ; mov rax, linux_exit_system_call ;
return;; xor rdi, rdi syscall ;~string_length (character * text): ;~natural length = 0; ;~loop (* (text + length++)); ;~return (length);; ;~48 C7 C7 BD 11 40 00 E8 CA 00 00 00 83 3D F3 10 00 00 10 0F 83 83 00 00 00 48 31 D2 8B 05 E4 10 00 00 BB 0F 00 00 00 48 F7 FB 83 FA 00 75 0E 48 C7 C7 ;~CA 11 40 00 E8 9B 00 00 00 EB 54 48 31 D2 8B 05 C0 10 00 00 BB 03 00 00 00 48 F7 FB 83 FA 00 75 0E 48 C7 C7 D4 11 40 00 E8 77 00 00 00 EB 30 48 31 D2 ;~8B 05 9C 10 00 00 BB 05 00 00 00 48 F7 FB 83 FA 00 75 0E 48 C7 C7 DA 11 40 00 E8 53 00 00 00 EB 0C 48 C7 C7 E0 11 40 00 E8 45 00 00 00 FF 05 6F 10 00 ;~00 E9 70 FF FF FF 48 C7 C0 3C 00 00 00 48 31 FF 0F 05 ;~57 C8 00 00 00 C7 05 48 10 00 00 00 00 00 00 48 31 C0 80 3F 00 74 0B FF 05 3A 10 00 00 48 FF C7 EB F0 C9 8B 05 2E 10 00 00 5F C3 ;~57 C8 00 00 00 E8 C5 FF FF FF 48 89 C2 48 89 FE 48 C7 C7 01 00 00 00 48 C7 C0 01 00 00 00 0F 05 48 31 C0 C9 5F C3 ;~00 00 00 00 01 00 00 00 48 65 79 6F 20 77 6F 72 6C 64 21 0A 00 66 69 7A 7A 62 75 7A 7A 0A 00 66 69 7A 7A 0A 00 62 75 7A 7A 0A 00 6E 75 6D 62 65 72 0A 00 ;~string_length (character * string) > natural: ;~length: natural = 0; ;~loop (string [length]) length++; ;~return (length);; string_length: ; string_length begin mov [string_length_length], 0 loop_0: ; loop_0 cmp byte [rdi], 0 ; (* (text + length)) != '\0' je loop_0e inc [string_length_length] ; text + length inc rdi ; length++ jmp loop_0 ; if not go loop_0 loop_0e: mov eax, [string_length_length] end ;~echo (character * text): ;~system (linux_write_system_call, standard_output, text, string_length (text)); ;~return;; echo: begin call string_length ; | mov rdx, rax ; | string_length (text) mov rsi, rdi ; text mov rdi, standard_output ; standard_output mov rax, linux_write_system_call ; linux_write_system_call syscall ; system ( xor rax, rax ; return;; end segment readable writable ; variable string_length_length dd 0 ; natural length = 0; main_x dd 1 ; integer x = 0; ; data text_data db 'Heyo world!', 10, 0 fb db 'fizzbuzz', 10, 0 f db 'fizz', 10, 0 b db 'buzz', 10, 0 n db 'number', 10, 0