EFFECT_NORMAL = '0' EFFECT_BOLD = '1' EFFECT_ITALIC = '3' EFFECT_UNDERLINE = '4' EFFECT_BLINK = '5' EFFECT_REVERSE = '7' COLOUR_GREY = '0' COLOUR_RED = '1' COLOUR_GREEN = '2' COLOUR_YELLOW = '3' COLOUR_BLUE = '4' COLOUR_PINK = '5' COLOUR_CYAN = '6' COLOUR_WHITE = '7' macro output_number number, base, offset, character, colour, effect { call output_bar mov rbx, colour mov rbp, effect call output_colour mov rbx, number mov rbp, base call offset_base mov rbx, offset sub rbx, [output_length] mov rbp, character call output_align call output_base call output_cancel } macro output_string index, array, offset, colour, effect { call output_bar mov rbx, colour mov rbp, effect call output_colour mov rax, index mov rbx, offset mul rbx mov rbx, array add rbx, rax mov rbp, offset call output_text call output_cancel } format ELF64 executable 3 segment readable executable entry $ main_loop: output_number [character_index], 2, 8, align_zero, COLOUR_WHITE, EFFECT_NORMAL output_number [character_index], 8, 4, align_zero, COLOUR_CYAN, EFFECT_NORMAL output_number [character_index], 10, 4, align_space, COLOUR_CYAN, EFFECT_ITALIC output_number [character_index], 16, 3, align_space, COLOUR_CYAN, EFFECT_BOLD output_string [character_index], code_list, 3, COLOUR_BLUE, EFFECT_BOLD output_string [character_index], name_list, 24, COLOUR_PINK, EFFECT_NORMAL mov rax, [character_index] and rax, 1 cmp rax, 0 je skip_line mov rbx, align_line mov rbp, 1 call output_text skip_line: inc [character_index] cmp [character_index], 128 jne main_loop mov rdi, 0 mov rax, 60 syscall output_text: mov rax, 1 mov rdi, 1 mov rsi, rbx mov rdx, rbp syscall ret output_colour: mov [output_colour_format + 5], bl mov [output_colour_format + 2], bpl mov rbx, output_colour_format mov rbp, 7 call output_text ret output_cancel: mov rbx, output_colour_cancel mov rbp, 4 call output_text ret output_align: mov r15, rbx mov r14, rbp loop_statement: mov rbx, r14 mov rbp, 1 call output_text dec r15 cmp r15, 0 jne loop_statement ret output_bar: mov rbx, COLOUR_GREY mov rbp, EFFECT_BOLD call output_colour mov rbx, align_bar mov rbp, 3 call output_text call output_cancel ret offset_base: mov ax, bx number_loop_statement: div bpl mov [output_quotient], al mov [output_remainder], ah mov r14, output_format add r14, [output_length] mov r15, output_cypher add r15b, [output_remainder] mov r13b, BYTE [r15] mov BYTE [r14], r13b xor rax, rax mov al, [output_quotient] inc [output_length] cmp rax, 0 jne number_loop_statement ret output_base: output_loop_statement: mov rbx, output_format add rbx, [output_length] dec rbx mov rbp, 1 call output_text dec [output_length] cmp [output_length], 0 jne output_loop_statement ret segment readable writable character_index dq 0 align_zero db '0' align_line db 10 align_space db ' ' align_bar db ' | ' output_cypher db '0123456789ABCDEF' output_format db ' ' output_length dq 0 output_quotient db 0 output_remainder db 0 output_colour_format db 27, '[ ;3 m' output_colour_cancel db 27, '[0m' code_list db 'NUL', 'SOH', 'STX', 'ETX', 'EOT', 'ENQ', 'ACK', 'BEL', 'BS ', 'HT ', 'LF ', 'VT ', 'FF ', 'CR ', 'SO ', 'SI ', \ 'DLE', 'DC1', 'DC2', 'DC3', 'DC4', 'NAK', 'SYN', 'ETB', 'CAN', 'EM ', 'SUB', 'ESC', 'FS ', 'GS ', 'RS ', 'US ', \ ' ', '! ', '" ', '# ', '$ ', '% ', '& ',39,' ','( ', ') ', '* ', '+ ', ', ', '- ', '. ', '/ ', \ '0 ', '1 ', '2 ', '3 ', '4 ', '5 ', '6 ', '7 ', '8 ', '9 ', ': ', '; ', '< ', '= ', '> ', '? ', \ '@ ', 'A ', 'B ', 'C ', 'D ', 'E ', 'F ', 'G ', 'H ', 'I ', 'J ', 'K ', 'L ', 'M ', 'N ', 'O ', \ 'P ', 'Q ', 'R ', 'S ', 'T ', 'U ', 'V ', 'W ', 'X ', 'Y ', 'Z ', '[ ', '\ ', '] ', '^ ', '_ ', \ '` ', 'a ', 'b ', 'c ', 'd ', 'e ', 'f ', 'g ', 'h ', 'i ', 'j ', 'k ', 'l ', 'm ', 'n ', 'o ', \ 'p ', 'q ', 'r ', 's ', 't ', 'u ', 'v ', 'w ', 'x ', 'y ', 'z ', '{ ', '| ', '} ', '~ ', 'DEL' name_list db 'Null ', 'Start of heading ', 'Start of text ', 'End of text ', \ 'End of transmission ', 'Enquiry ', 'Acknowledge ', 'Bell ', \ 'Backspace ', 'Horizontal tab ', 'Line feed ', 'Vertical tab ', \ 'Form feed ', 'Carriage return ', 'Shift out ', 'Shift in ', \ 'Data link escape ', 'Device control 1 ', 'Device control 2 ', 'Device control 3 ', \ 'Device control 4 ', 'Negative acknowledge ', 'Synchronous idle ', 'End transmission block ', \ 'Cancel ', 'End of medium ', 'Substitute ', 'Escape ', \ 'File separator ', 'Group separator ', 'Record separator ', 'Unit separator ', \ 'Space ', 'Exclamation mark ', 'Speech mark ', 'Number sign ', \ 'Dollar sign ', 'Percent ', 'Ampersand ', 'Quote ', \ 'Open parenthesis ', 'Close parenthesis ', 'Asterisk ', 'Plus ', \ 'Comma ', 'Minus ', 'Period ', 'Slash ', \ 'Zero ', 'One ', 'Two ', 'Three ', \ 'Four ', 'Five ', 'Six ', 'Seven ', \ 'Eight ', 'Nine ', 'Colon ', 'Semicolon ', \ 'Open angled bracket ', 'Equal ', 'Close angled bracket ', 'Question mark ', \ 'At sign ', 'Uppercase A ', 'Uppercase B ', 'Uppercase C ', \ 'Uppercase D ', 'Uppercase E ', 'Uppercase F ', 'Uppercase G ', \ 'Uppercase H ', 'Uppercase I ', 'Uppercase J ', 'Uppercase K ', \ 'Uppercase L ', 'Uppercase M ', 'Uppercase N ', 'Uppercase O ', \ 'Uppercase P ', 'Uppercase Q ', 'Uppercase R ', 'Uppercase S ', \ 'Uppercase T ', 'Uppercase U ', 'Uppercase V ', 'Uppercase W ', \ 'Uppercase X ', 'Uppercase Y ', 'Uppercase Z ', 'Opening bracket ', \ 'Backslash ', 'Closing bracket ', 'Caret ', 'Underscore ', \ 'Grave ', 'Lowercase a ', 'Lowercase b ', 'Lowercase c ', \ 'Lowercase d ', 'Lowercase e ', 'Lowercase f ', 'Lowercase g ', \ 'Lowercase h ', 'Lowercase i ', 'Lowercase j ', 'Lowercase k ', \ 'Lowercase l ', 'Lowercase m ', 'Lowercase n ', 'Lowercase o ', \ 'Lowercase p ', 'Lowercase q ', 'Lowercase r ', 'Lowercase s ', \ 'Lowercase t ', 'Lowercase u ', 'Lowercase v ', 'Lowercase w ', \ 'Lowercase x ', 'Lowercase y ', 'Lowercase z ', 'Opening brace ', \ 'Vertical bar ', 'Closing brace ', 'Tilde ', 'Delete '