Empezando con ASM

Iniciado por W0lFy, 30 Junio 2009, 09:06 AM

0 Miembros y 1 Visitante están viendo este tema.

Yurix

-------
si yo tengo esta variable definida
cuerpo db "Este es el Cuerpo",0

ahora quiero que cuerpo sea:
cuerpo="Este es el 56 cuerpo",0
-------

Que bueno que tocas este tema ya que igual que tu también lo tengo en mente , es cierto que si no reservas espacio en memoria para la string no puedes hacer nada .

Eternal dijo:
En este caso no podrías excepto que no te importara sobrescribir la memoria que le sigue (en este caso titulo) debido a que no reservaste suficiente espacio para la nueva cadena.

--- en estos momentos tengo en mente una forma para hacer ajustes en caso de que no reservemos memoria para nuestras strings , y que no consuma espacio en memoria innecesario , es decir , no reservar espacio de antemano , esperen el código que ya viene en camino , se los prometo .

Saludos







http://kapetres.wordpress.com/ < Mi blog sobre ASM

Parece que alguien no quiere que la info sea liebre >

Alguien lo movio a ese lugar.

Eternal Idol

Para eso esta la memoria dinamica, se puede usar HeapAlloc/HeapFree por ejemplo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

YST

Algo a si quieres ?
Código (asm) [Seleccionar]

include 'win32ax.inc'
.data
cuerpo db    'Este es el Cuerpo',0
.code
start:
invoke lstrlen,cuerpo
add eax,3
invoke GlobalAlloc,GPTR, eax
mov ebx ,eax
mov byte[cuerpo+10],0
invoke lstrcpy,ebx,cuerpo
invoke lstrcat,ebx," 56 Cuerpo"
invoke MessageBox,0,ebx,0,0
invoke GlobalFree,ebx
invoke ExitProcess,0
.end start             


Yo le enseñe a Kayser a usar objetos en ASM

Eternal Idol

Global and Local Functions

The global and local functions are supported for porting from 16-bit code, or for maintaining source code compatibility with 16-bit Windows. Starting with 32-bit Windows, the global and local functions are implemented as wrapper functions that call the corresponding heap functions using a handle to the process's default heap. Therefore, the global and local functions have greater overhead than other memory management functions.

The heap functions provide more features and control than the global and local functions. New applications should use the heap functions unless documentation specifically states that a global or local function should be used. For example, some Windows functions allocate memory that must be freed with LocalFree, and the global functions are still used with Dynamic Data Exchange (DDE), the clipboard functions, and OLE data objects. For a complete list of global and local functions, see the table in Memory Management Functions.

Windows memory management does not provide a separate local heap and global heap, as 16-bit Windows does. As a result, the global and local families of functions are equivalent and choosing between them is a matter of personal preference. Note that the change from a 16-bit segmented memory model to a 32-bit virtual memory model has made some of the related global and local functions and their options unnecessary or meaningless. For example, there are no longer near and far pointers, because both local and global allocations return 32-bit virtual addresses.

Memory objects allocated by GlobalAlloc and LocalAlloc are in private, committed pages with read/write access that cannot be accessed by other processes. Memory allocated by using GlobalAlloc with GMEM_DDESHARE is not actually shared globally as it is in 16-bit Windows. This value has no effect and is available only for compatibility. Applications requiring shared memory for other purposes must use file-mapping objects. Multiple processes can map a view of the same file-mapping object to provide named shared memory. For more information, see File Mapping.

PD. YST: te falto un reservar un byte para el cero terminador de cadena.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

YST

Cita de: Eternal Idol en 30 Junio 2009, 21:14 PM
PD. YST: te falto un reservar un byte para el cero terminador de cadena.

Adonde ? :xD El add eax,3 es 2 byte por el 56 y uno por el caracter nulo :P


Yo le enseñe a Kayser a usar objetos en ASM

Eternal Idol

#15
Al final, por supuesto, si queres usa App Verifier para comprobarlo.

"Este es el Cuerpo" = 17 caracteres
17+3=20, 19 caracteres + 0 terminador.

strcpy "Este es el" 10 caracteres
strcat " 56 Cuerpo" 10 caracteres

No solo agregas 56 sino un espacio justo despues del numero.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

YST

Verdad me comi un byte :xD

Código (asm) [Seleccionar]

include 'win32ax.inc'
.data
cuerpo db    'Este es el Cuerpo',0
.code
start:
invoke lstrlen,cuerpo
add eax,4
invoke GlobalAlloc,GPTR, eax
mov ebx ,eax
mov byte[cuerpo+11],0
invoke lstrcpy,ebx,cuerpo
invoke lstrcat,ebx,"56 Cuerpo"
invoke MessageBox,0,ebx,0,0
invoke GlobalFree,ebx
invoke ExitProcess,0
.end start       


Yo le enseñe a Kayser a usar objetos en ASM