Трудовая дисциплина Крис Касперски aka мыщъх Хакер, номер #088, стр. 088-114-2 Программа, предназначенная для одного типа ассемблеров, не может быть откомпилирована на другом, без радикальной переделки или автоматической конвертации! Но даже среди ассемблеров своего типа наблюдается разброд, разнобой и множество различий: в ключевых словах, в правилах оформления листинга, в поставляемых библиотеках и заголовочных файлах и т. д. Если только совместимость не заявлена явно, транслировать программу нужно тем и только тем ассемблером, для которого она предназначена. В противном случае готовься к переделкам, то есть адаптации. Отличия зачастую проявляются в самых неожиданных местах. Некоторые ассемблеры понимают, что «mov eax, x» - это то же самое, что и «mov eax,[x]», некоторые – нет. Они спотыкаются и выдают ошибку. Но это еще ничего! Гораздо хуже, когда транслятор молчаливо трактует эту конструкцию, как «mov eax, offset x», что совсем не одно и то же! Так что при переносе программы приходится быть очень и очень осторожным. Совместимость операционных систем - вообще отдельная песня. Программы, ориентированные на MS-DOS, без мата не только не транспортабельны, но и непереносимы. Для них характерно прямое взаимодействие с оборудованием, доступное в NT только с ядерного уровня, не говоря уже о том, что 16-разрядный код вызывается из 32-разрядных приложений только через DPMI, да и то не без ухищрений. Прежде чем транслировать ассемблерную программу, необходимо отождествить, для какого транслятора и операционной системы она предназначена. Таким образом, прежде чем транслировать ассемблерную программу, необходимо отождествить, для какого транслятора и операционной системы она предназначена! С ассемблерными фрагментами, выхваченными из «родного» контекста, приходится еще хуже. Допустим, в некоторой статье описывается интересный антиотладочный прием и приводится ассемблерный код, но, как встроить его в свою программу, не говорится. Знакомая ситуация, не правда ли? Непосредственная трансляция невозможна, так как транслятор дико матерится, но ничего не говорит. Вот обо всем этом мы и будем говорить, а пока пойдем на балкон и покурим (курение вредит вашему здоровью, проверено на себе. – Прим. Горлума)! [определение целевой платформы] Проще всего определить разрядность. Если в листинге преобладают 16-разрядные регистры типа AX/BX/CX, то, скорее всего, она предназначается для MS-DOS. Если встречаются прямые вызовы прерываний INT 21h, INT 13h, INT 16h, INT 10h - это точно MS-DOS, и от попыток трансляции программы под NT лучше сразу воздержаться. То же самое относится и к портам ввода/вывода (инструкциям IN/OUT). Хотя NT и позволяет открывать к ним доступ с прикладного уровня - это не выход, и такую программу проще взять, да и переписать. |