%define BUFF_LIM 32768 %define red_lim 12 %define green_lim 13 %define blue_lim 14 %define limits ((red_lim << 16) | (green_lim << 8) | blue_lim) ; call # val val2 ; int $0x80 eax eax edx - ; ; arg1 arg2 arg3 arg4 arg5 arg6 arg7 ; ebx ecx edx esi edi ebp - global _start [bits 32] [section .text] _start: push 0 ; eof mov eax, 5 ; open mov ebx, filename xor ecx, ecx ; read only int 0x80 mov ebx, eax mov eax, 3 ; read mov ecx, read_buff mov edx, BUFF_LIM int 0x80 test eax,eax js exit add eax, read_buff mov [file_lim], eax mov esi, read_buff ; just try until number lol .get_id: call dec_parse test eax, eax jz .get_id push eax ; id ; get another number lol xor ebx, ebx ; counts for the game ??RRGGBB .get_num: call dec_parse test eax, eax jz .get_num mov ecx, eax ; r g b lodsb cmp al, 'r' je .r_chk cmp al, 'g' je .g_chk .b_chk: or ebx, ecx ; no shift jmp .next .g_chk: shl ecx, 8 or ebx, ecx jmp .next .r_chk: shl ecx, 16 or ebx, ecx .next: xor edx, edx ; game over flag ; find one of , ; \n lodsb cmp al, ',' je .get_num ; next number cmp al, ';' je .check_poss cmp al, 10 ; \n je .new_game cmp esi, dword [file_lim] ; end of file jge .new_game jmp .next ; other char .new_game: mov edx, 1 ; game over flag .check_poss: mov eax, limits .check_start: cmp bl, al jle .next_check mov dword [esp], 0 ; fail check, game is null jmp .round_done ; no need to check the other limits .next_check: shr ebx, 8 shr eax, 8 test ebx, ebx jnz .check_start .round_done: ; check for game end test edx, edx jnz .game_done ; reset counts xor ebx, ebx jmp .get_num ; new round .game_done: ; add id to final value (impossible game is 0) pop eax add dword [final_value], eax ; checked earlier but... meh cmp esi, dword [file_lim] ; end of file jl .get_id ; new game ; we can print final value now mov eax, [final_value] call print_dec jmp exit exit: mov eax, 1 int 0x80 ; exit ; string in esi ; modifies EAX ESI dec_parse: push ebx push ecx push edx push edi xor eax, eax xor ecx, ecx xor edi, edi mov ebx, 10 .loop: lodsb sub al, '0' js .dec_done cmp al, 9 jg .dec_done xchg edi,eax mul ebx add edi,eax jmp .loop .dec_done: mov eax,edi pop edi pop edx pop ecx pop ebx ret ; i hate this print_dec: sub esp, 12 lea ecx, [esp+11] test eax, eax jz .zero mov esi, 0 mov ebx, 10 .div_shit: xor edx, edx div ebx dec ecx inc esi add dl, '0' mov byte [ecx], dl test eax, eax jnz .div_shit mov edx, esi jmp .write .zero: mov byte [esp+10], 0 lea ecx, [esp+10] mov edx, 1 ; count .write: mov eax, 4 ; write mov ebx, 1 ; stdout int 0x80 add esp, 12 ret [section .data] file_lim: dd 0 final_value: dd 0 filename: db "input",0 [section .bss] read_buff: resb BUFF_LIM