Hola hola :D
Estoy programando en ASM y me he encontrado con un pequeño problema que no he sabido como arreglar.
Supongamos que declaro un buffer:
Nombre rb 100
y al usar una API, ese buffer se llena pero no del todo. ¿Hay algún modo de "pasar" esa parte llenada a una variable directamente?
----
Supongamos que declaro un buffer:
Código
Nombre rb 100
y al usar una API, ese buffer se llena pero no del todo. ¿Hay algún modo de "pasar" esa parte llenada a una variable directamente?
-----------
Haber si te explicas un poco mejor , tienes el buffer lleno y quieres "baciarlo" y copiarlo a otra variable?? Es eso
Es fácil , primero debes de saber que no se puede copiar de memoria a memoria (hasta donde se!) , primero debes de copiar un byte a cualquier registro del CPU con la capacidad de un byte , ejemplo AH o AL que pertenecen a EAX , después copias lo que tienes en estos registros hacia el espacio en memoria de la variable que esta "vacia" , al mismo tiempo tenes que comprobar si has llegado al fin del buffer , ej comprobando que los bytes que estas copiando son 00 hexa , en el caso que estés trabajando con strings que por ley terminan en 00 , si no estas trabajando con strings tienes que copiar lo que se encuentre dentro de un rango determinado , ej el tamaño de el Buffer e ir restando con cada operación de copia que hagas hasta llegar a 0 que es el fin del buffer.
SAludos
No me has entendido :-[
Yo declaro un buffer de 100 bytes para poder usarlo en una API, y al usar esa API el buffer se llena solo 30 bytes (dejando 70 bytes libres). ¿Como puedo copiar esos 30 bytes en una variable? Supongo que mediante RtlMoveMemory se puede, pero yo me refiero a hacerlo directamente... mediante registros o movs.
Nose bien lo que quieres hacer pero mas o menos por lo que entendi te hice un codigo :P
include 'win32ax.inc'
.data
lBuffer rb 100
.code
start:
invoke GetLogicalDriveStrings,100,lBuffer
invoke lstrlenW,lBuffer
mov ebx,2
mul ebx
mov ebx,eax
inc ebx
invoke GlobalAlloc ,GPTR, ebx ;Creamos otro buffer
mov edi,eax ; Guardamos el buffer en edi
stdcall cRtlMoveMemory,eax,lBuffer,ebx ;Copiamos lo que se encuentra en lBuffer a el buffer generado por GlobalAlloc
stdcall Zerar,lBuffer,ebx;Vaciamos el lBuffer
invoke MessageBox,0,edi,0,0
invoke MessageBox,0,lBuffer,0,0
invoke ExitProcess,0
;Descripcion: Esta función funciona igual que la winapi RtlMoveMemory
; by YST
proc cRtlMoveMemory,cBuffer,Cpuntero,cCantidad
push esi edi
xchg edi,[cBuffer]
xchg esi,[Cpuntero]
.bucleb:
dec [cCantidad]
movsb
cmp [cCantidad],0
jge .bucleb
pop edi esi
ret
endp
proc Zerar,Puntero,Cantidad
push ecx
push ebx
mov ecx,[Cantidad]
mov ebx,[Puntero]
.bucle:
mov byte[ebx+ecx],0
loop .bucle
mov byte[ebx],0
pop ebx
pop ecx
ret
endp
.end start
quieres copiar de un buffer a otro? si es asi puedes mover la direccion del origen en esi y la del destino en edi y utilizar movsb (para bytes), movsw (para words), movsd( dwords) y si tienes un procesador de 64 , movsq(para qwords). junto con el prefijo rep
El problema ya lo solucioné. Gracias a todos :P
Ahora me he topado con otro problema. ¿Alguien podria ponerme un ejemplo de como darle un valor de salida a un parametro en una función?
Ejemplo:
proc DirectorioDeWindows, Ruta
mov [Ruta], 'C:\Windows'
ret
endp
Se que el code está mal, es para que os hagais una idea.
guarda en el parametro la direccion de una variable, y dentro de la funcion usas el parametro como puntero
x0ʎu he hecho lo que dices pero sigue habiendo un pequeño problema. Dentro de la función si le doy un valor al parametro funciona todo correctamente, pero al hacer lo siguiente fuera de la función
stdcall Funcion, Parametro
mov eax, Parametro
el Parametro está vacio. No se si me entiendes :-\
Dentro de la función todo bien pero al utilizarla desde fuera no funciona.
ponme el trozo de codigo que te da problemas, para que entienda mejor ;)
Por cierto en que estas ensamblando en masm o fasm ?
Por que si es fasm seria
mov eax,[Parametro] y en masm no me acuerdo :xD
haber, pongamos algo de orden. Normalmente los parametros se pasan a la funcion a traves de la pila y se devuelve un valor de retorno en el registro EAX.
Esto es cosa de las convenciones de llamada.
Saludos.
PD: Estas cosas deberian de salir en un buen tuto de asm
es el problema de usar macros, te ocultan como funcionan en verdad las funciones :rolleyes:
Cita de: x0ʎu en 13 Julio 2009, 02:26 AM
es el problema de usar macros, te ocultan como funcionan en verdad las funciones :rolleyes:
Ya, pero si usas asm, se deberia aprender primero como funcionan las cosas basicas. y luego usar algun que otro macro para tareas repetitivas.
Y al que no le gustelo de no usar casi macros, le recomiendo que use c/c++ porque en este lenguaje la verdadera ventaja esta en poder hacer las cosas desde realmente zero.
Saludos