Hola Javier,
Lo que decís es correcto. Normalmente se compila el módulo 2^N haciendo el AND con (2^N-1).
Ese código está mal por varias razones, entre ellas que chequea el bit 2 encendido para saber si es módulo 4 lo que está mal porque por ejemplo 0,8, 16, 24, y muchos otros números son 0 módulo 4 y no tiene el bit 2 encendido y además porque al ejecutar el AND pierde el valor de CX por lo que habría que utilizar un registro auxiliar.
Se podría compilar ese código de la siguiente manera:
xor CX, CX
condWhile:
cmp CX, 1000
jnl finWhile mov DX, CX and DX, 3 jnz finIf add AX, CX finIf: inc CX finIf: inc CX jmp condWhile finWhile: add BX,AX
Saludos,
Gustavo