SoloCodigo

Programación General => ASM (Ensamblador) => Mensaje iniciado por: 123celes en Lunes 20 de Octubre de 2008, 15:32

Título: Rutina de copiado.
Publicado por: 123celes en Lunes 20 de Octubre de 2008, 15:32
Hola ¿Que tal?,  yo soy 123celes y soy nuevo en el foro. Hace no mucho empecé a internarme en la programación, sobre todo la de los video juegos. Empecé a estudiar el lenguaje ensamblador y cada vez aprendo un poquito más.

Donde mostraban distintas rutinas en ensamblador para optimizar la programación gráfica, concretamente la que no comprendo es la de Copy64K. La  parte que no comprendo es esta: las líneas que dicen

xor  di,di
xor  si,si
mov  cx,16000
db   66h;rep movsw

¿Que trabajo hacen estas líneas, para que sirven?

PROCEDURE Copy64K  (SegOrg,SegDes:Word);assembler;
Asm
    push ds
    mov  ax,SegOrg
    mov  ds,ax
    mov  ax,SegDes
    mov  es,ax
    xor  di,di
    xor  si,si
    mov  cx,16000
    db   66h;rep movsw
    pop  ds
End;


PD: desde ya muchas gracias por su atención
Título: Re: Rutina de copiado.
Publicado por: Eternal Idol en Lunes 20 de Octubre de 2008, 15:55
Si te interesa programar videojuegos este codigo es inutil, es codigo de 16 bits absolutamente obsoleto.

http://pdos.csail.mit.edu/6.828/2004/re ... 86/REP.htm (http://pdos.csail.mit.edu/6.828/2004/readings/i386/REP.htm" onclick="window.open(this.href);return false;)
http://pdos.csail.mit.edu/6.828/2006/re ... 6/MOVS.htm (http://pdos.csail.mit.edu/6.828/2006/readings/i386/MOVS.htm" onclick="window.open(this.href);return false;)

En tu caso copia de ds:[si] (segOrg) a es:[di] (segDes) 16000 words.
Título: Re: Rutina de copiado.
Publicado por: m0skit0 en Lunes 20 de Octubre de 2008, 16:01
Primero aconsejarte una página de referencia:

http://ref.x86asm.net/coder32.html (http://ref.x86asm.net/coder32.html" onclick="window.open(this.href);return false;)

Acto seguido, vamos a ver ese tremendo ensamblador (¿se nota que me gusta  :P ?)

Código: ASM
  1.  
  2. ; Pone a 0 DI y SI
  3. xor di,di
  4. xor si,si
  5. ; Número de repeticiones que va a realizar el prefijo REP más abajo
  6. mov cx,16000
  7. ; Precision-size override prefix (sólo disponible en procesadore con SSE2) // no he encontrado documentación sobre su uso
  8. db 66h
  9. ; Mueve una palabra (2 bytes) de DS:SI a ES:DI y suma 2 a SI y DI
  10. ; Usando REP se repite tantas veces como indique CX, en este caso 16.000 (16.000 x 4 = 64.000 bytes = 64K = 1 segmento)
  11. rep movsw
  12.  
  13.  

Espero que te haya quedado claro. Un saludo y a disfrutar con el ensamblador.  :good:  :hitcomp:
Título: Re: Rutina de copiado.
Publicado por: m0skit0 en Lunes 20 de Octubre de 2008, 16:22
Sí, es un prefijo de tamaño, aunque no sabía qué hacía realmente. ¡Gracias!

Cita de: "NASM"
"instructions which use 32-bit data are prefixed with an 0x66 byte"
"las instrucciones que usan datos de 32 bits tienen como prefijo el byte 0x66"

En realidad SI y DI se incrementan o decrementan automáticamente dependiendo del bit DF del registro de banderas (EFLAGS).
Título: Re: Rutina de copiado.
Publicado por: 123celes en Martes 21 de Octubre de 2008, 14:35
Muchas gracias por sus respuestas. Si no les importa, les podría preguntar ¿Para que es necesario que SI y DI tengan valor cero?
Título: Re: Rutina de copiado.
Publicado por: Eternal Idol en Martes 21 de Octubre de 2008, 14:46
Para copiar desde el primer byte de cada segmento, por eso despues se incrementan (en este caso) y cx se decrementa en cada bucle. Mira los enlaces que deje sobre mov* y rep.
Título: Re: Rutina de copiado.
Publicado por: 123celes en Martes 21 de Octubre de 2008, 15:29
Ahhh. ahora ya lo entiendo, muchas gracias por su respuesta. Para mostrar mi gratitud les dejo esta excelente página con fuentes de assembler

asmsource.8k.com

PD:suerte.