pavelyakov wrote:В 32 битной будет работать если создать ярлык этого эмулятора и поставить в свойствах ярлыка запускать в отдельной области памяти
Насколько понимаю, это
позволяет выполнить 16-разрядные приложения в отдельных виртуальных DOS-машинах
Это для трюка с
NTVDM что ли? Жаль, что микрософт считает выделение в 0 уязвимостью, а значит всё равно это будет закрыто рано или поздно. Нужен легальный способ. Хм.. а как виртуальные машины работают(не эмуляторы процессора)? Через драйвер может?
pavelyakov wrote:Можно достичь быстродействия, если поменять условие case для проверки сис.ф-ции на массив сис. ф-ций. Потому что сразу будет исполняться та ф-ция номер которой соответствует ключу, чем все перебирать.
Компиляторы для того и нужны, чтобы программист об этом вообще не беспокоился.
Компилятор сам создаст таблицу переходов, если это будет необходимо, например, такой код
Code: Select all
Var X, Y: LongWord;
Begin
Case X Of
1: Y := 0;
20: Y := 1;
3: Y := 2;
42: Y := 3;
5: Y := 4;
60: Y := 5;
7: Y := 6;
80: Y := 7;
9000: Y := 8;
100500: Y := 9;
End;
End.
может быть оттранслирован примерно в это
Code: Select all
00407CE0: A1 98 97 40 00 mov eax,[00409798]
00407CE5: 83 F8 2A cmp eax,2Ah
00407CE8: 7F 6A jg 00407D54 ; здесь прыжок на обработку без таблицы переходов
00407CEA: 0F 84 9F 00 00 00 je 00407D8F ; здесь прыжок на обработку без таблицы переходов
00407CF0: 83 F8 14 cmp eax,14h
00407CF3: 0F 87 E8 00 00 00 ja 00407DE1 ; значение не попало в наш диапазон -> выход
00407CF9: FF 24 85 00 7D 40 00 jmp dword ptr [eax*4+00407D00h] ; прыжок на адрес из таблицы переходов
00407D00:
таблица переходов
00407DE1:
выход
В зависимости от значений результат тоже будет разный, иногда использование таблицы переходов не оправданно, компилятор об этом знает и в этом случае не генерирует такую таблицу.
Compiler generated branch tables
pavelyakov wrote:Если программа не может загрузить по 0 адресу, то 2 раз пытается загрузить по 0x10000 адресу. Тем самым можно запускать и в Windows XP, и в Windows 7 и выше, без параметра -base
Только надо помнить, что сама программа доолжна быть собрана с соответствующим
ImageBase.
lev wrote:Если стартовый адрес в заголовке проги > 0x10000, то автоматом грузить с 0x10000
Но ведь он не пишется в заголовке.
pavelyakov wrote:Пытаюсь добавить поддержку сис.ф-ций потоки.
Для этого некоторые(но не все) глобальные переменные должны быть
thread-local. То есть, вместо
будет
Также есть проблема со стеком, если использовать тот стек, который приложение
KolibriOS указало в
ThreadCreate:
- Для Windows-функций, вероятно, требуется больший размер стека.
В некоторых KolibriOS-программах стек не выравнен(это плохо, но это есть) — с этим тоже может быть проблема.
Можно захотеть передать параметры в запускаемый поток, положив ему что-то на стек: выделили память под стек, положили туда значения, затем указали выделенную область в ThreadCreate. Тут можно попытаться копировать некоторое количество байт из KolibriOS в Windows стек.
А ещё можно запустить поток без стека, а он уже сам его себе выделит: выделить память под стек, mov esp, ...
В идеале, наверное, лучше иметь главный поток, а остальные ему только сигнализируют(как клиент-сервер), при этом сами вызовов
Windows не выполняют.
Но это будет сложнее реализовать, текущий вариант в подавляющем большинстве случаев должен и так работать.