Все налево и направо кричат о крутости FASM'a. Вот и решил я потихоньку слезать с MASM и перейти на FASM. Подскажите пожалуйста те, у кого была такая-же проблемка. Как бы перейти так, что бы потом не было мучительно больно. И ещё, в Flat Assembler'e обязательно импорт вручную прописывать, или это как-то уже решено, а то блин как-то неудобно... или просто мне так кажеться?
KindEcstasy А зачем целиком переходить?! Я вот лично пользую как MASM, так и FASM - в зависимости от поставленных задач. Насчет импорта - напиши макрос, который все автоматом сделает за тебя
Не совсем понятно: чего ты хочешь... Берешь доку и... Если у тебя есть (или появятся) конкретные вопросы - задавай - поможем FASM более низкоуровневый,чем MASM, но я согласен с RamMerLabs - если неудобно и нет надобности, то зачем переходить? Из-за "крутости"? Юзай MASM, пока он выполняет то, что ты хочешь...
Всем спасибо. Для себя всё решил: останусь на MASM и потихоньку буду привыкать к FASM. Тему можно закрывать.
А я вручную всегда импорт прописываю... собственно из-за этого и перешёл на fasm сразу после iczelion'а и Зубкова (осознание offset и макро пришло позже)
чтоб познать истинное дао нужно и файл создавать вручную ) Код (Text): IMAGE_DOS_SIGNATURE = 5A4Dh ; MZ IMAGE_NT_SIGNATURE = 00004550h ; PE00 IMAGE_FILE_MACHINE_I386 = 014ch ; Intel 386 IMAGE_FILE_RELOCS_STRIPPED = 0001h ; Relocation info stripped from file IMAGE_FILE_EXECUTABLE_IMAGE = 0002h ; File is executable (i.e. no unresolved externel references) IMAGE_FILE_LINE_NUMS_STRIPPED = 0004h ; Line nunbers stripped from file IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0008h ; Local symbols stripped from file IMAGE_FILE_32BIT_MACHINE = 0100h ; 32 bit word machine ; Section characteristics IMAGE_SCN_CNT_CODE = 00000020h ; Section contains code IMAGE_SCN_CNT_INITIALIZED_DATA = 00000040h ; Section contains initialized data IMAGE_SCN_CNT_UNINITIALIZED_DATA = 00000080h ; Section contains uninitialized data IMAGE_SCN_MEM_EXECUTE = 20000000h ; Section is executable IMAGE_SCN_MEM_READ = 40000000h ; Section is readable IMAGE_SCN_MEM_WRITE = 80000000h ; Section is writeable IMAGE_SUBSYSTEM_WINDOWS_GUI = 2 ; Image runs in the Windows GUI subsystem IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16 IMAGE_BASE = 00400000h NUMBER_OF_SECTIONS = 2 FILE_ALIGNMENT = 00000200h SECTION_ALIGNMENT = 00001000h IMAGE_DOS_HEADER: ; DOS .EXE header e_magic dw IMAGE_DOS_SIGNATURE ; Magic number /* 0h */ e_cblp dw 0 ; Bytes on last page of file /* 2h */ e_cp dw 0 ; Pages in file /* 4h */ e_crlc dw 0 ; Relocations /* 6h */ e_cparhdr dw 0 ; Size of header in paragraphs /* 8h */ e_minalloc dw 0 ; Minimum extra paragraphs needed /* 0Ah */ e_maxalloc dw 0 ; Maximum extra paragraphs needed /* 0Ch */ e_ss dw 0 ; Initial (relative) SS value /* 0Eh */ e_sp dw 0 ; Initial SP value /* 10h */ e_csum dw 0 ; Checksum /* 12h */ e_ip dw 0 ; Initial IP value /* 14h */ e_cs dw 0 ; Initial (relative) CS value /* 16h */ e_lfarlc dw 0 ; File address of relocation table /* 18h */ e_ovno dw 0 ; Overlay number /* 1Ah */ e_res rw 4 ; Reserved words /* 1Ch */ e_oemid dw 0 ; OEM identifier (for e_oeminfo) /* 24h */ e_oeminfo dw 0 ; OEM information; e_oemid specific /* 26h */ e_res2 rw 10 ; Reserved words /* 28h */ e_lfanew dd IMAGE_NT_HEADERS ; File address of new exe header /* 3Ch */ ; IMAGE_DOS_HEADER align 4 IMAGE_NT_HEADERS: Signature dd IMAGE_NT_SIGNATURE IMAGE_FILE_HEADER: Machine dw IMAGE_FILE_MACHINE_I386 NumberOfSections dw NUMBER_OF_SECTIONS TimeDateStamp dd %t PointerToSymbolTable dd 0 NumberOfSymbols dd 0 SizeOfOptionalHeader dw IMAGE_OPTIONAL_HEADER_SIZE Characteristics dw IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_EXECUTABLE_IMAGE or \ IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED or \ IMAGE_FILE_32BIT_MACHINE ; IMAGE_FILE_HEADER IMAGE_OPTIONAL_HEADER: ; Standard fields Magic dw 010Bh MajorLinkerVersion db 0 MinorLinkerVersion db 0 SizeOfCode dd 0 SizeOfInitializedData dd 0 SizeOfUninitializedData dd 0 AddressOfEntryPoint dd CODE_RVA + (START - _CODE) BaseOfCode dd 0 BaseOfData dd 0 ; NT additional fields ImageBase dd IMAGE_BASE SectionAlignment dd SECTION_ALIGNMENT FileAlignment dd FILE_ALIGNMENT MajorOperatingSystemVersion dw 4 MinorOperatingSystemVersion dw 0 MajorImageVersion dw 0 MinorImageVersion dw 0 MajorSubsystemVersion dw 4 MinorSubsystemVersion dw 0 Win32VersionValue dd 0 SizeOfImage dd (IMPORT_RVA+IMPORT_SIZE)+((SECTION_ALIGNMENT-1)-((IMPORT_RVA+IMPORT_SIZE)+SECTION_ALIGNMENT-1) mod SECTION_ALIGNMENT) SizeOfHeaders dd _CODE CheckSum dd 0 Subsystem dw IMAGE_SUBSYSTEM_WINDOWS_GUI DllCharacteristics dw 0 SizeOfStackReserve dd 100000h SizeOfStackCommit dd 1000h SizeOfHeapReserve dd 100000h SizeOfHeapCommit dd 1000h LoaderFlags dd 0 NumberOfRvaAndSizes dd IMAGE_NUMBEROF_DIRECTORY_ENTRIES ; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] Data_Directories: IMAGE_DIRECTORY_ENTRY_EXPORT dd 0,0 ; 0 // Export Directory IMAGE_DIRECTORY_ENTRY_IMPORT dd IMPORT_RVA,IMPORT_SIZE ; 1 // Import Directory IMAGE_DIRECTORY_ENTRY_RESOURCE dd 0,0 ; 2 // Resource Directory IMAGE_DIRECTORY_ENTRY_EXCEPTION dd 0,0 ; 3 // Exception Directory IMAGE_DIRECTORY_ENTRY_SECURITY dd 0,0 ; 4 // Security Directory IMAGE_DIRECTORY_ENTRY_BASERELOC dd 0,0 ; 5 // Base Relocation Table IMAGE_DIRECTORY_ENTRY_DEBUG dd 0,0 ; 6 // Debug Directory ; IMAGE_DIRECTORY_ENTRY_COPYRIGHT dd 0,0 ; 7 // (X86 usage) IMAGE_DIRECTORY_ENTRY_ARCHITECTURE dd 0,0 ; 7 // Architecture Specific Data IMAGE_DIRECTORY_ENTRY_GLOBALPTR dd 0,0 ; 8 // RVA of GP IMAGE_DIRECTORY_ENTRY_TLS dd 0,0 ; 9 // TLS Directory IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG dd 0,0 ; 10 // Load Configuration Directory IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT dd 0,0 ; 11 // Bound Import Directory in headers IMAGE_DIRECTORY_ENTRY_IAT dd 0,0 ; 12 // Import Address Table IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT dd 0,0 ; 13 // Delay Load Import Descriptors IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR dd 0,0 ; 14 // COM Runtime descriptor dd 0,0 ; 15 ; Data_Directories ; IMAGE_OPTIONAL_HEADER IMAGE_OPTIONAL_HEADER_END: IMAGE_OPTIONAL_HEADER_SIZE = IMAGE_OPTIONAL_HEADER_END - IMAGE_OPTIONAL_HEADER ; IMAGE_NT_HEADERS IMAGE_SECTION_HEADER1: Name1 db ".text",0,0,0 ; union { ; DWORD PhysicalAddress VirtualSize1 dd CODE_SIZE ; } Misc; VirtualAddress1 dd CODE_RVA SizeOfRawData1 dd _IMPORT - _CODE PointerToRawData1 dd _CODE PointerToRelocations1 dd 0 PointerToLinenumbers1 dd 0 NumberOfRelocations1 dw 0 NumberOfLinenumbers1 dw 0 Characteristics1 dd IMAGE_SCN_CNT_CODE or IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ ; IMAGE_SECTION_HEADER1 IMAGE_SECTION_HEADER2: Name2 db ".idata",0,0 ; union { ; DWORD PhysicalAddress VirtualSize2 dd IMPORT_SIZE ; } Misc; VirtualAddress2 dd IMPORT_RVA SizeOfRawData2 dd IMPORT_SECTION_END - _IMPORT PointerToRawData2 dd _IMPORT PointerToRelocations2 dd 0 PointerToLinenumbers2 dd 0 NumberOfRelocations2 dw 0 NumberOfLinenumbers2 dw 0 Characteristics2 dd IMAGE_SCN_CNT_INITIALIZED_DATA or IMAGE_SCN_MEM_READ ; IMAGE_SECTION_HEADER2 IMAGE_SECTION_HEADER2_END: times ((FILE_ALIGNMENT-1)-(IMAGE_SECTION_HEADER2_END+FILE_ALIGNMENT-1) mod FILE_ALIGNMENT) db 0 _CODE: CODE_RVA = _CODE + ((SECTION_ALIGNMENT-1)-(_CODE+SECTION_ALIGNMENT-1) mod SECTION_ALIGNMENT) szTest db "Test",0 align 4 START: push 0 push 0 db 068h dd (szTest-_CODE)+CODE_RVA+IMAGE_BASE push 0 db 0FFh,015h dd (MessageBox-_IMPORT)+IMPORT_RVA+IMAGE_BASE push 0 db 0FFh,015h dd (ExitProcess-_IMPORT)+IMPORT_RVA+IMAGE_BASE _CODE_END: CODE_SIZE = _CODE_END - _CODE times ((FILE_ALIGNMENT-1)-(_CODE_END+FILE_ALIGNMENT-1) mod FILE_ALIGNMENT) db 0 _IMPORT: IMPORT_RVA = (CODE_RVA+CODE_SIZE) + ((SECTION_ALIGNMENT-1)-((CODE_RVA+CODE_SIZE)+SECTION_ALIGNMENT-1) mod SECTION_ALIGNMENT) dd 0,0,0,IMPORT_RVA+(kernel_name - _IMPORT),IMPORT_RVA+(kernel_table - _IMPORT) dd 0,0,0,IMPORT_RVA+(user_name - _IMPORT),IMPORT_RVA+(user_table - _IMPORT) dd 0,0,0,0,0 kernel_table: ExitProcess dd IMPORT_RVA+(_ExitProcess - _IMPORT) dd 0 user_table: MessageBox dd IMPORT_RVA+(_MessageBoxA - _IMPORT) dd 0 kernel_name db 'KERNEL32.DLL',0 user_name db 'USER32.DLL',0 _ExitProcess dw 0 db 'ExitProcess',0 _MessageBoxA dw 0 db 'MessageBoxA',0 _IMPORT_END: IMPORT_SIZE = _IMPORT_END - _IMPORT IMPORT_SECTION_END = _IMPORT_END + ((FILE_ALIGNMENT-1)-(_IMPORT_END+FILE_ALIGNMENT-1) mod FILE_ALIGNMENT) times ((FILE_ALIGNMENT-1)-(_IMPORT_END+FILE_ALIGNMENT-1) mod FILE_ALIGNMENT) db 0
Это смотря для каких целей, так, например, так для самостоятельного исследования PE формата очень даже полезно(нестандартное выравнивание секций, изменение любых полей в заголовке и т.д.)
Asvald ну это да. а когда пишешь программку сложную какуюнить, совсем не хочется думать про флаги заголовков и все остальное =)
Кстати сам перешел с masm на fasm. Вначале было непривычно, сейчас жить без него не могу. Кстати, еще один плюс фасма - его можно таскать с собой, собирая прогу из исходников на любом компе (он весит ~120Кб с инклудами, вместо 20Мб
Кстати, да Лично я вижу преимущество FASMa над MASMом как раз в том, что его можно таскать с собой А вообще для себя на первых порах никакой разницы не ощущаю ИМХО даже на fasmе проще