Короче я посмотрел. Там дело не тока в call. Там вообще каша.. структура разъехалась на 8 байт больше чем положена. А call делается на 7 байтов позже чем нужно Код (Text): seg000:000021C1 db 0 ; seg000:000021C2 db 0 ; seg000:000021C3 db 0 ; seg000:000021C4 db 0 ; seg000:000021C5 db 0 ; seg000:000021C6 db 0 ; seg000:000021C7 db 0 ; seg000:000021C8 db 0 ; seg000:000021C9 db 0 ; seg000:000021CA db 0 ; seg000:000021CB db 0 ; seg000:000021CC db 0 ; seg000:000021CD db 0 ; seg000:000021CE db 0 ; seg000:000021CF db 0 ; seg000:000021D0 db 0 ; seg000:000021D1 db 0 ; seg000:000021D2 db 0 ; seg000:000021D3 db 0 ; seg000:000021D4 db 0 ; seg000:000021D5 db 0 ; seg000:000021D6 db 0 ; seg000:000021D7 db 0 ; seg000:000021D8 seg000:000021D8 loc_21D8: ;CODE XREF: seg000:00001F45 seg000:000021D8 add [eax+52h], dl seg000:000021DB push ecx seg000:000021DC push ebp seg000:000021DD push esi seg000:000021DE push edi seg000:000021DF mov eax, ebx Тот же кусок из сорцов: Код (Text): SomeObject TObject f1: push eax edx ecx ebp esi edi mov eax,ebx .... И напомню саму структуру: Код (Text): struc TObject { dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 } Только стоит мне кинуть SomeObject TObject в конец файла и получаю это: Код (Text): seg000:000021C1 sub_21C1 proc near ; CODE XREF: seg000:00001F45 seg000:000021C1 push eax seg000:000021C2 push edx seg000:000021C3 push ecx seg000:000021C4 push ebp seg000:000021C5 push esi seg000:000021C6 push edi seg000:000021C7 mov eax, ebx Ну что, я тогда отправлю Томашу?
CodeWorld Всё равно не верю Лучше приведи куски дампов, скорее всего это неправильный дизасм: add [eax+52h], dl, это когда метка на 1 байт выше. Пересчитал по твоему листингу - 24 байта А судя по листингу, на 1 байт раньше. Но опять таки, подозреваю дизасм.
IceStudent, точняк. я считал, что структура весит 16 байт, вот и решил что она мутировала на 8 байт Посмотрел дамп, теперь можно выносить диагноз =) Call делается на 1 байт раньше: Код (Text): seg000:000021C0 C3 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 seg000:000021D0 00 00 00 00 00 00 00 00-00 50 52 51 55 56 57 89 seg000:000021E0 D8 B9 00 04 00 00 31 D2-F7 F1 83 FA 00 74 01 40 А вот не битый фрагмент: Код (Text): seg000:000021C0 C3 50 52 51 55 56 57 89-D8 B9 00 04 00 00 31 D2 seg000:000021D0 F7 F1 83 FA 00 74 01 40-53 89 C3 E8 1E 01 00 00
этот фасм весь сыпится. Чуть что пошевелишь тут же все крушится. Я продолжил писать файл с SomeObject. Добавил туда несколько констант и кода. Все работает. Стоит убрать следующий инклуд в файле X, за инклудом файла с СамОбжект и опять пэйдж фол на нулях. Теперь глюк в функции f2 которая рядом с f1. Однако все несоколько наоборот. call кривой в самой функции f2, которая call-ится на ф которая в одном файле со структурой (!не ее экземляром). Но это не так важно. Похоже про структуру можно забыть, фасм запутался в самих смещениях. Может я достиг какого то предела? call опять рано ровно на 1 байт, и опять попадает на данные/нули (перед кодом у мя двойное слово объявлено). Все хватит. Даже сам Томаш не спешит устранять ошибку. Пора перебераться на насм 8)
CodeWorld Слушай, вышли сорцы. Думаю, всё прозаичней. За копирайты не боись, интересы у меня другие. Но хочу взглянуть, правда ли дело в фасме.