Hi!
Your code looks great, I didn't tried to compile.
Some suggestions:
If you want to clear, zero-out or init register you could use xor instruction.
So, "mov eax, 0" could be replaced by "xor eax,eax".
I think XOR is faster or in the same time it occupies less memory, than "mov eax,0".
Loop instruction, It works this way: You have to set ecx register to a number of how many times the loop should loop,
during the loop you should not modify ecx OR you can modify it but make sure to save and restore.
; This will loop ten times or nine - It will loop while ecx is not zero, each "loop" instruction decrements ecx.
mov ecx,10
.cycle:
; Save ecx
push ecx
; Do other things with ecx, ... other registers
; Restore ecx
pop ecx
loop .cycle