global enlight section .data red dq 0 ; some comment green dq 0 blue dq 0 data dq 0 N dd 0 M dd 0 change dd 0 delta db 0 section .text enlight: call assign_arguments call set_data call make_deltas ret assign_arguments: mov qword[red], rdi mov qword[green], rsi mov qword[blue], rdx mov dword[N], ecx mov dword[M], r8d mov dword[change], r9d mov al, byte[rsp + 16] mov byte[delta], al ret set_data: mov eax, dword[change] cmp eax, 1 jne not_1 mov rax, qword[red] mov qword[data], rax ret not_1: cmp eax, 2 jne not_2 mov rax, qword[green] mov qword[data], rax ret not_2: mov rax, qword[blue] mov qword[data], rax ret make_deltas: mov ecx, dword[N] mov eax, dword[M] imul ecx, eax loop_start: call make_delta loop loop_start ret make_delta: mov rax, qword[data] add rax, rcx dec rax mov dl, byte[delta] cmp dl, 0 jl substracting adding: add dl, byte[rax] jc adding_overflow mov byte[rax], dl ret adding_overflow: mov byte[rax], 255 ret substracting: mov r9b, dl mov dl, 0 sub dl, r9b mov r8b, byte[rax] sub r8b, dl jc substracting_overflow mov byte[rax], r8b ret ; another comment substracting_overflow: mov byte[rax], 0 ret