I think ax, bx, cx and dx are the general purpose ones (eax, ebx, ecx and edx in 32 bits) so thats 4 registers... Usually the compiler will make some variables register vars automagically when it's set to optimizing (ie VC6++), and sometimes setting register vars explicity will choke the optimizer...

Then again, it can make loops very fast when used properly.. The compiler will make as many of the register vars you specify true register vars, and when it runs out of free registers it will just ignore the other requests, I think. Sometimes the compiler might require a spare register, say, for optimizing math, etc.. so you might not always have 4 or even 3.