Ensamblaje: bucle sobre cuerdas usando rep

Leí un libro sobre ensamblaje y tiene el siguiente código:

.DATA
    string1 db ’abcdfghi’,0
    strLen EQU $ - string1
    string2 db ’abcdefgh’,0
.CODE

.STARTUP
    mov AX,DS ; set up ES
    mov ES,AX ; to the data segment
    mov ECX,strLen
    mov ESI,string1
    mov EDI,string2
    cld ; forward direction
    repe cmpsb
leaves ESI pointing to g in string1 and EDI to f in string2. Therefore, adding
    dec ESI
    dec EDI
leaves ESI and EDI pointing to the last character that differs. Then we can use,  
ja str1Above

Está escrito que necesitamos:

 dec ESI
 dec EDI

porque leaves ESI pointing to g in string1 and EDI to f in string2.

¿Pero por qué? Cuando llegamos a 'f' en ESI, y 'e' en EDI, la repe la condición no se cumple, y para eso saldríamos del ciclo, donde 'f' está en ESI, y 'e' está en EDI. ¿Por qué dice que continuamos escaneando las cuerdas una vez más?

preguntado el 10 de marzo de 12 a las 10:03

2 Respuestas

Así es como funciona el repe:

  1. ecx = 0 o Zeroflag = 0 --> fuera
  2. dec ecx
  3. haz el comando
  4. aumentar (o disminuir) esi y edi.
  5. volver a 1.

Entonces esi y edi apuntan a la dirección + 1 (o - 1 en caso de dirección hacia atrás).

respondido 10 mar '12, 19:03

repe también comprueba si esi=edi, ¿no? En nuestro caso, sale del bucle porque esi<>edi, y no porque ecx=0. - Adán Sh

Claro, me lo perdí, gracias. El punto era que la condición de salida está al principio. Es por eso que necesita ajustar el puntero. - palmadita

Si la bandera de dirección DF es claro en el EFLAGS registro, ESI y EDI se incrementan después de la comparación salidas. Entonces el dec las instrucciones están compensando esto. Creo. El rep las instrucciones de cadena son un poco una resaca de los días 8086 'CISC'.

respondido 10 mar '12, 11:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.