Вопрос по использованию fasm_dll из http://wasm.ru/forum/viewtopic.php?id=25969&p=12 Как его юзать? Что я делаю не правильно? В папке "C:\_temp\fdll\" файлы Код (Text): -fdll.asm -hello.asm -fasm.dll Содержание "hello.asm": Код (Text): format PE GUI 4.0 entry start include 'c:\fasmw\include\win32a.inc' section '.main' code readable writeable executable str_ db "Hi! I'm the example program!","Win32 Assembly",13,10,0 start: invoke MessageBox,0,str_,0,0 invoke ExitProcess,0 section '.idata' import data readable writeable library kernel32, 'KERNEL32.DLL',\ user32, 'USER32.dll' include 'c:\fasmw\include\APIA\kernel32.inc' include 'c:\fasmw\include\APIA\user32.inc' Содержание fdll.asm : Код (Text): .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data LibName db "fasm.dll",0 FileName db "C:\_temp\fdll\hello.asm",0 FunctionName db "fasm_Assemble",0 DllNotFound db "Cannot load library",0 FunctionNotFound db "fasm_Assemble function not found",0 .data? hLib dd ? fasm_AssembleAddr dd ? AllocMem dd ? .code ;---------------------------------------------------------------- start: invoke LoadLibrary,addr LibName .if eax==NULL invoke StdOut,addr DllNotFound .else mov hLib,eax invoke GetProcAddress,hLib,addr FunctionName .if eax==NULL invoke StdOut,addr FunctionNotFound .else mov fasm_AssembleAddr,eax push 4096 push 0 call GlobalAlloc mov AllocMem,eax ;======================================================================== push 0 ;hDisplayPipe: должен быть 0 push 100h ;nPassesLimit: 100 по умолчанию push 4096 ;cbMemorySize: sizeof(output buffer) lea eax,AllocMem push eax ;lpMemory: указатель на output buffer push offset FileName ;lpSource: строка с asm (fasm синтаксис) заканчивается "0" call [fasm_AssembleAddr] ;======================================================================== ;lea esi,AllocMem ;int 3 invoke GlobalFree,AllocMem .endif invoke FreeLibrary,hLib .endif invoke ExitProcess,NULL end start В буфере AllocMem ожидаю хексы MZ начала откомпилированного hello.exe? Или я не прав? Подскажите как Вы его (fasm.dll) используете? Где у ошибка? Спасибо.
Еще эта строка Противоречие. lpSource - подразумевается сам исходник в память загруженый, а не имя файла. Возможно он как раз имя файла и пытается ассемблировать.
Именно. Содержимое самому подгружать. И я думаю стоило бы сначала посмотреть на пример, который идет в комплекте.
Вот к примеру все вроде как надо: Код (Text): .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data LibName db "C:\_temp\fdll\fasm.dll",0 FileName db "C:\_temp\fdll\hello.asm",0 FunctionName db "fasm_Assemble",0 DllNotFound db "Cannot load library",0 FunctionNotFound db "fasm_Assemble function not found",0 .data? hLib dd ? fasm_AssembleAddr dd ? AllocMem dd ? AllocMem_for_asm_file dd ? hFile dd ? dwFsize dd ? VarBuff db 0 .code start: ;======================================================================================= invoke CreateFile,addr FileName,\ GENERIC_WRITE or GENERIC_READ ,\; FILE_SHARE_READ or FILE_SHARE_WRITE,\; NULL,\ OPEN_EXISTING,\ FILE_ATTRIBUTE_NORMAL,\ NULL .if EAX == INVALID_HANDLE_VALUE jmp error .endif mov hFile, eax xor eax,eax invoke GetFileSize, hFile, NULL mov word ptr [dwFsize], ax push dwFsize push GMEM_FIXED OR GMEM_ZEROINIT call GlobalAlloc mov AllocMem_for_asm_file, EAX lea eax, offset VarBuff push NULL push eax push dwFsize push AllocMem_for_asm_file push hFile call ReadFile .IF eax==0 jmp error .ENDIF ;mov edi,AllocMem_for_asm_file ;int 3 invoke LoadLibrary,addr LibName .if eax==NULL invoke StdOut,addr DllNotFound .else mov hLib,eax invoke GetProcAddress,hLib,addr FunctionName .if eax==NULL invoke StdOut,addr FunctionNotFound .else mov fasm_AssembleAddr,eax push 4096 push 0 call GlobalAlloc mov AllocMem,eax ;======================================================================== push 0 ;hDisplayPipe: can be zero push 100 ;nPassesLimit: thats 100 by default push 4096 ;cbMemorySize: sizeof(output buffer) push AllocMem ;lpMemory: output buffer push AllocMem_for_asm_file call [fasm_AssembleAddr] ;======================================================================== lea edi,AllocMem int 3 error: invoke GlobalFree,AllocMem invoke CloseHandle,hFile invoke GlobalFree,AllocMem_for_asm_file .endif invoke FreeLibrary,hLib .endif invoke ExitProcess,NULL end start lea edi,AllocMem int 3 ----------> указывает на Код (Text): 00403088 B8 40 14 00 78 2F 14 00 E8 07 00 00 38 07 00 00 ё@.x/.и..8.. 00403098 38 07 8 Так это че оно и есть ? Или я опять напутал?
В AllocMem будет сначала находиться FASM_STATE. И раз уж тебе надо из файла все грузить, то есть fasm_AssembleFile для этого.
SmanxX1 Если не жалко брось пример применения. Или мой подскажи что не так. В инете не нашел примеров. Спасибо.