2012-05-11 26 views
5

He estado mirando este código y estoy confundido acerca de la línea rep cmpsb.Confundido con la instrucción CMPSB

.LOOP: 
     push cx 
     mov  cx, 0x000B       ; eleven character name 
     mov  si, ImageName       ; image name to find 
     push di 
rep cmpsb           ; test for entry match 
     pop  di 
     je  LOAD_FAT 
     pop  cx 
     add  di, 0x0020       ; queue next directory entry 
     loop .LOOP 
     jmp  FAILURE 

Entiendo que se repite cmpsb cx veces, pero ¿cómo se comparan las dos cadenas? Digamos, por ejemplo, que fue comparar "Hey \ 0" y "hey \ 0" y este ciclo comparó 4 cadenas de caracteres. Los primeros caracteres son diferentes y el registro EFlags se establecerá en consecuencia. Sin embargo, se repite la instrucción cmpsb y los siguientes caracteres serían los mismos. Puede que esté entendiendo mal cómo funciona cmpsb, pero parece que este bucle no compara correctamente dos cadenas. ¿Funciona este bucle de hecho?

+1

Um, ¿por qué no ves cómo funciona CMPSB en un manual de CPU? –

+0

Um @Alex lo hice. La confusión se debió a la instrucción ** REP **. –

+0

REP no es una instrucción propia. Es un prefijo de instrucción, un modificador de instrucción IOW. La documentación también lo explica. –

Respuesta

10

El motivo por el que REP funciona es porque rep tiene la misma codificación que REPE (F3h). En principio, REPE es lo correcto para usar aquí, pero dependiendo de su ensamblador, podría tomar REP como correcto.

Así que, en realidad, usted tiene un cmpsb REPE allí, es solo que su (des) ensamblador realmente no lo sabe.

1

Creo que tiene que usar el prefijo REPE o REPNE con cmpsb (Ha pasado un tiempo).

+0

Eso es correcto, o bien usa 'repe' (repite mientras es igual) o' repne' (repite mientras que no es igual). –

1

Tiene razón, este código no funcionará. Debe utilizar repe cmpsb (repita mientras se compara la cadena por bytes).

0

Desde mi entender, ya que estoy pasando por el mismo tutorial en brokenthorn, se comparará el primer byte de Imagename con el primer byte de la entrada de grasa si son los mismos.

Continuará hasta los 11 caracteres (nombre de archivo y extensión) en la primera diferencia. Establecerá la bandera de ZF si son iguales, y la bandera de ZF permanecerá despejada.

Así que después de comparar el nombre completo del archivo, saltará para cargar esa entrada de grasa si son iguales. Si no, cargará la siguiente entrada y comparará ese nombre de archivo.