Понимаю, что, возможно, я уже поздновато, но кому не лень - помогите с задачкой.
Имеем следующий код самопальной функции (сильно не пинать):
Code:
6399FD 55; PUSH EBP
6399FE 8BEC; MOV EBP,ESP
639A00 83F930; CMP ECX,30
639A03 7328; JNB SHORT mop.00639A2D
639A05 8B1DFCCC6900; MOV EBX,DWORD PTR DS:[69CCFC]
639A0B A1F4CC6900; MOV EAX,DWORD PTR DS:[69CCF4]
639A10 69C068010000; IMUL EAX,EAX,168
639A16 2BD8; SUB EBX,EAX
639A18 81C3440B0000; ADD EBX,0B44
639A1E 8B03; MOV EAX,DWORD PTR DS:[EBX]
639A20 69C968010000; IMUL ECX,ECX,168
639A26 83C13C; ADD ECX,3C
639A29 03C8; ADD ECX,EAX
639A2B EB0E; JMP SHORT mop.00639A3B
639A2D 8B0D4C956900; MOV ECX,DWORD PTR DS:[69954C]
639A33 83C138; ADD ECX,38
639A36 8B09; MOV ECX,DWORD PTR DS:[ECX]
639A38 83C13C; ADD ECX,3C
639A3B 85D2; TEST EDX,EDX
639A3D 7410; JE SHORT mop.00639A4F
639A3F 8B4508; MOV EAX,DWORD PTR SS:[EBP+8]
639A42 8901; MOV DWORD PTR DS:[ECX],EAX
639A44 8B450C; MOV EAX,DWORD PTR SS:[EBP+C]
639A47 66894104; MOV WORD PTR DS:[ECX+4],AX
639A4B 8BE5; MOV ESP,EBP
639A4D 5D; POP EBP
639A4E C3; RETN
639A4F 8B01; MOV EAX,DWORD PTR DS:[ECX]
639A51 894508; MOV DWORD PTR SS:[EBP+8],EAX
639A54 0FBF4104; MOVSX EAX,WORD PTR DS:[ECX+4]
639A58 89450C; MOV DWORD PTR SS:[EBP+C],EAX
639A5B 8BE5; MOV ESP,EBP
639A5D 5D; POP EBP
639A5E C3; RETN
Функция предсталяет собой не что иное, как контроль Портала Вызова, некогда написанный Михаником в ERM-е.
Конвертирование - fastcall. Вызов: !!SN:E6527485/3/x1/x2/x3/x4;
Где:
x1 - номер города. Если больше или равно 48, то текущий
x2 - 0 - прочитать, 1 - записать
x3 и x4 - числа/переменные для записи/чтения типа и кол-ва существа.
Так вот: запись работает, а чтение - нет. Ибо я не пойму, как и куда ЭРА возвращает результаты. В v1, ясное дело, результат возвращается (кол-во существ), но судя по справке, можно возвращать и несколько результатов.
Можно, конечно, записывать результат напрямую в адрес переменной, но это лишает универсальности, да и охота разобраться...