Programación General > ASM (Ensamblador)

 Rutina de copiado.

(1/2) > >>

123celes:
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

Eternal Idol:
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/2006/re ... 6/MOVS.htm

En tu caso copia de ds:[si] (segOrg) a es:[di] (segDes) 16000 words.

m0skit0:
Primero aconsejarte una página de referencia:

http://ref.x86asm.net/coder32.html

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


--- Código: ASM --- ; Pone a 0 DI y SIxor di,dixor si,si; Número de repeticiones que va a realizar el prefijo REP más abajomov cx,16000; Precision-size override prefix (sólo disponible en procesadore con SSE2) // no he encontrado documentación sobre su usodb 66h; Mueve una palabra (2 bytes) de DS:SI a ES:DI y suma 2 a SI y DI; Usando REP se repite tantas veces como indique CX, en este caso 16.000 (16.000 x 4 = 64.000 bytes = 64K = 1 segmento)rep movsw  
Espero que te haya quedado claro. Un saludo y a disfrutar con el ensamblador.  :good:  :hitcomp:

m0skit0:
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"
--- Fin de la cita ---
"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).

123celes:
Muchas gracias por sus respuestas. Si no les importa, les podría preguntar ¿Para que es necesario que SI y DI tengan valor cero?

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa