The MASM Forum Archive 2004 to 2012

General Forums => The Campus => Topic started by: Kyle on December 01, 2009, 09:48:57 AM

Title: Help with converting C++ to ASM
Post by: Kyle on December 01, 2009, 09:48:57 AM
Yeah I'm definitely a noob but thats ok, I'm learning  :bg.

Alright, so I'm converting a C++ app I've wrote to assembly, but theres one part that has me a bit stumped. Its using "new" and "delete". Here's the code I'm wondering about:

DWORD FileSize;
char* FileData = { 0 };

FileData = new char [ FileSize ];

delete [] FileData;


I figure FileData would be BYTE and FileSize would remain a DWORD, but how would I handle the code I've shown in assembly?

For the new data would I do something like:

push eax
mov DWORD PTR FileSize [ ebp ], eax
call new
pop ecx


And is new and delete even necessary in assembly?
Title: Re: Help with converting C++ to ASM
Post by: jj2007 on December 01, 2009, 09:57:42 AM
include \masm32\include\masm32rt.inc

.data? ; non-initialised variables
FileSize dd ?
FileData dd ?

.code

start:
mov FileSize, 1234h  ; for testing
mov FileData, alloc(FileSize)
MsgBox 0, "FileData is ready for use", "Hi", MB_OK
free FileData
exit ; short form of invoke ExitProcess, 0

end start


alloc and free are defined in \masm32\macros\macros.asm:

     alloc MACRO bytecount
        invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,bytecount
        EXITM <eax>
      ENDM

     free MACRO hmemory
        invoke GlobalFree,hmemory
      ENDM
Title: Re: Help with converting C++ to ASM
Post by: Kyle on December 01, 2009, 10:46:30 AM
Ah wow fast response. Thank you very much!
Title: Re: Help with converting C++ to ASM
Post by: drizz on December 01, 2009, 04:52:02 PM
There is no reason you can't have new and delete in assembly. Under the hood they are just functions.
.code

??2@YAPAXI@Z proto syscall; operator new - mangled name
??3@YAXPAX@Z proto syscall; operator delete - mangled name

$new macro bytes:req
push bytes
call ??2@YAPAXI@Z
pop ecx
exitm <eax>
endm

$delete macro pointer:req
push pointer
call ??3@YAXPAX@Z
pop ecx
exitm <>
endm

main proc C uses esi edi ebx argc:dword,argv:ptr dword
int 3
mov ebx,$new(100h)
$delete(ebx)
return 0
main endp

end


just link with msvcrt.dll

Title: Re: Help with converting C++ to ASM
Post by: drizz on December 01, 2009, 08:51:34 PM
or something more elegant, like:

.code

??2@YAPAXI@Z proto syscall :DWORD; operator new
??3@YAXPAX@Z proto syscall :PTR BYTE; operator delete
new equ ??2@YAPAXI@Z
delete equ ??3@YAXPAX@Z

$new macro elementsize:req,numelements:req
mov eax,elementsize
mov edx,numelements
mul edx
invoke new,eax
exitm <eax>
endm

$delete macro pointer:req
invoke delete,pointer
exitm <>
endm

main proc C uses esi edi ebx argc:dword,argv:ptr dword
local FileSize:DWORD, FileData:PBYTE
;// FileData = new char [ FileSize ];
mov FileData,$new(BYTE,FileSize)
;// delete [] FileData;
$delete(FileData)
ret;urn 0
main endp

end


macro power!  :boohoo:
Title: Re: Help with converting C++ to ASM
Post by: Kyle on December 01, 2009, 08:55:58 PM
Haha thank you. I've never used macros before. Time to look into them  :eek.