Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: blackray en 6 Septiembre 2009, 16:54 pm



Título: [Ayuda]MOVSD y MOVSW
Publicado por: blackray en 6 Septiembre 2009, 16:54 pm
Hola =P la cuestion es que yo entiendo que copia de SI a DI, lo que no entiendo es la instruccion del flag de direccion como CLD, lei y dice... movimiento para adelante WTF?
 :-\ No entiendo muy bien eso, me podeis echar una mano porfavor?  ;D
Saludos!


Título: Re: [Ayuda]MOVSD y MOVSW
Publicado por: YST en 6 Septiembre 2009, 19:20 pm
MOVSD lo que hace es mover un dword(4 bytes ) desde la posición quue apunta esi hacia la posión que apunta edi , movsw hace lo mismo solamente que en vez de un dword mueve un word  ;) Para que lo entienddas mejor te dejo un codigo :P
Código
  1. include 'win32ax.inc'
  2. .code
  3. start:
  4. mov esi,Hola ;Le pasamos el puntero de "Hola" a esi
  5. mov edi,Buffer ;Le pasamos el puntero de el buffer a edi
  6. movsd  ;Copiamos los 4 bytes
  7. invoke MessageBox,0,Buffer,0,0 ;Los imprimimos
  8. invoke ExitProcess,0 ;Salimos
  9. .data
  10. Buffer db 20 dup (0)
  11. Hola db 'Hola',0
  12. .end start          
  13.  


Título: Re: [Ayuda]MOVSD y MOVSW
Publicado por: blackray en 6 Septiembre 2009, 19:39 pm
Muchas gracias  :P
mmm y el CLD? tengo entendido que pone a 1 el flag de direccion y que esta relacionado con el movsX ._. en los codes comentados que veo solo dice... hacia adelante ._. mire sobre la instruccion pero solo dice para que sirve, no como se usa  :xD
Saludos!


Título: Re: [Ayuda]MOVSD y MOVSW
Publicado por: YST en 6 Septiembre 2009, 19:54 pm
CLD

Borra la bandera de dirección ,asignándole un 0 . Las instrucciones de primitivas de cadena incrementan (e)si y (e)di de manera automatica

Formato de instrucción:
CLD


Título: Re: [Ayuda]MOVSD y MOVSW
Publicado por: blackray en 6 Septiembre 2009, 20:28 pm
Emm entiendo lo que hace pero no le veo uso ._. si es para hacer un bucle no seria mas facil el tipico loop o con condicionales? =/
Saludos :P


Título: Re: [Ayuda]MOVSD y MOVSW
Publicado por: Eternal Idol en 7 Septiembre 2009, 10:24 am
CLD pone el flag a 0, tambien existen STD que si pone el flag a 1 y entonces se decrementan las direcciones. Un uso muy util es por ejemplo cuando queres copiar memoria, va aumentando o decrementando ambas direcciones (fuente y destino) y usando un repXXX podes lograr la copia completa.

Un ejemplo tonto en MASM, depuralo y vas a ver como funciona (las copias tendran el valor de los originales):
Código
  1. .386
  2. .model flat, stdcall
  3.  
  4. .data
  5. w dd 14
  6. x dd 15
  7. y dd 16
  8. z dd 17
  9.  
  10. w1 dd 0
  11. x1 dd 0
  12. y1 dd 0
  13. z1 dd 0
  14.  
  15. .code
  16. main:
  17.  
  18. mov esi, offset w
  19. mov edi, offset w1
  20. mov ecx, 4
  21. rep movsd
  22.  
  23. ret
  24. end main

Lo mismo pero decrementando:
Código
  1. std
  2. mov esi, offset z
  3. mov edi, offset z1
  4. mov ecx, 4
  5. rep movsd
  6. cld ;siempre hay que restaurar este flag, por defecto es 0


Título: Re: [Ayuda]MOVSD y MOVSW
Publicado por: blackray en 7 Septiembre 2009, 16:01 pm
Muchas gracias a los dos, ya lo entiendo perfectamente  ;D

Saludos!


Título: Re: [Ayuda]MOVSD y MOVSW
Publicado por: Eternal Idol en 7 Septiembre 2009, 16:25 pm
De nadas  ::)