Есть программа, где количество экспортируемых функций изменяется. (Управляется это константами типа CONF_HBOOT_INCLUDE). Все хорошо, но как можно в фасме описать экспорт подобных функций? Код (Text): export 'NTRAD.DLL',\ ... Initialize,'Initialize',\ if CONF_HBOOT_INCLUDE HBoot,'HBoot',\ end if Install,'Install',\ ... Вот так не рабоает ((( Похоже, здесь получается, что if находится внутри макроса export. Можно сделать так, чтобы if обрабатывался проепроцессором раньше export?
А можно как-нить сделать проверку на существование метки (что нибудь типа "if used label"), чтобы немного подправить существующий макрос export?
Подправить не сложно. Код (Text): format PE GUI entry __start macro export dllname,[label,string] { common local module,addresses,names,ordinal,count count = 0 forward if used label count = count+1 end if common dd 0,0,0,RVA module,1 dd count,count,RVA addresses,RVA names,RVA ordinal addresses: forward if used label dd RVA label end if common names: forward if used label local name dd RVA name end if common ordinal: count = 0 forward if used label dw count count = count+1 end if common module db dllname,0 forward if used label name db string,0 end if common local x,y,z,str1,str2,v1,v2 x = count shr 1 while x > 0 y = x while y < count z = y while z-x >= 0 load v1 dword from names+z*4 str1=($-RVA $)+v1 load v2 dword from names+(z-x)*4 str2=($-RVA $)+v2 while v1 > 0 load v1 from str1+%-1 load v2 from str2+%-1 if v1 <> v2 break end if end while if v1<v2 load v1 dword from names+z*4 load v2 dword from names+(z-x)*4 store dword v1 at names+(z-x)*4 store dword v2 at names+z*4 load v1 word from ordinal+z*2 load v2 word from ordinal+(z-x)*2 store word v1 at ordinal+(z-x)*2 store word v2 at ordinal+z*2 else break end if z = z-x end while y = y+1 end while x = x shr 1 end while } data export export 'dll.dll', __start, 'start', val1, 'val1', val2, 'val2' end data val1 dd 1 val2 dd 2 __start: mov eax,val1 ; mov ecx,val2 ret