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!
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
include 'win32ax.inc'
.code
start:
mov esi,Hola ;Le pasamos el puntero de "Hola" a esi
mov edi,Buffer ;Le pasamos el puntero de el buffer a edi
movsd ;Copiamos los 4 bytes
invoke MessageBox,0,Buffer,0,0 ;Los imprimimos
invoke ExitProcess,0 ;Salimos
.data
Buffer db 20 dup (0)
Hola db 'Hola',0
.end start
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!
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
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
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):
.386
.model flat, stdcall
.data
w dd 14
x dd 15
y dd 16
z dd 17
w1 dd 0
x1 dd 0
y1 dd 0
z1 dd 0
.code
main:
mov esi, offset w
mov edi, offset w1
mov ecx, 4
rep movsd
ret
end main
Lo mismo pero decrementando:
std
mov esi, offset z
mov edi, offset z1
mov ecx, 4
rep movsd
cld ;siempre hay que restaurar este flag, por defecto es 0
Muchas gracias a los dos, ya lo entiendo perfectamente ;D
Saludos!
De nadas ::)