Hola 0xDani, REPNE repite un bucle y decrementa ECX mientras que la bandera zero no esté activada. SCASB lo que hace es mirar si el byte de AL coincide con el byte que apunta EDI. Básicamente la instrucción SCASB sería similar a esto:
CMP AL,[EDI]
INC EDI
Siguiendo con el problema que planteas el código es fácil de entender, el ciclo de REPNE termina cuando SCASB encuentra el final de la cadena. Lo más complicado de entender viene después. Que se le hace un NOT a ECX y lo disminuye en 1.
Esto tiene una explicación y es que para pasar un número de positivo a negativo, se realiza el complemento a dos. Que consiste en:
-Aplicar el NOT
-Sumar 1 al resultado obtenido.
Ejemplo(negativo a positivo):
-1 en binario es 1111
NOT 1111 = 0000
0000 + 1 = 0001
Ejemplo(positivo a negativo):
1 en binario es 0001
NOT 0001 = 1110
1110 + 1 = 1111
Una vez dicho esto, para pasar de un numero positivo a negativo sería exactamente igual. Pero en el caso de esta rutina, REPNE disminuye ECX también cuando encuentra el final de cadena, y además ECX ya tenía un -1 , así que el resultado si le aplicásemos el complemento a dos directamente estaría 2 por encima del correcto. Para corregir esto , una vez aplicado el NOT , en vez de sumarle un 1 , se le resta , provocando así que de el resultado correcto.