Возможна ли такая миграция более или менее быстро и безболезненно? А то на главной странице JWASM заявлено (ну как обычно это делается), что мы все такие крутые, замена тому, сему, и еще дополнительные фичи. Пытаюсь компилить исходники, написанные для TASM в режиме совместимости с MASM, и в итоге получаю кучу ошибок, к примеру, не нравится JWASM'у слово global. Ладно, заремил все global'ы, добавил опцию в командной строке -Zf (maske all symbols public), компилю снова - теперь ему не нравится объявление структур... 2 вопроса, кто сталкивался, 1) возможно ли написание кода так, чтобы компилилось и в TASM, и в JWASM (для отладочных целей на первое время)? 2) стоит ли вообще овчинка выделки, или придется перепахивать весь код, чтобы JWASM нормально все захавал (и высрал что надо)?
Ykidia У Пирогова в "Assembler для Windows" видел примеры написания исходников, которые могут одновременно компилироваться и Tasm'ом и masm'ом. Хотя masm и tasm совместимы но там тоже по разному описываются структуры, описание "шапки" процедуры и т.п.
в принципе, вы можете перейти сразу на васм. минуя жвасм. синтаксис у него не сильно от масма отличается. если чтото не понравится сильно, так можно и до/переписать. он опенсорсный. ватком рантайм и куски от других частей написаны на нем, так что асм вполне рабочий. ну итд.
Mikl___ Речь не о "TASM" vs. "MASM", а о "TASM в режиме совместимости с MASM плюс собственные расширения" vs. "JWASM". qqwe Я хотел как раз перейти на JWASM, ибо, как понял, он более продвинутый, нежели WASM, к тому же JWASM местами понимает текст для "TASM в режиме совместимости с MASM". На данный момент, т.к. все global'ы собраны у меня в кучу в одном файле, я сделал следующее: 1. В начале этого файла для JWASM'а вставил строки: Код (Text): ifdef __JWASM__ option renamekeyword:<externdef>,global endif externdef - аналог TASM'овского global, а option renamekeyword просто переименовывает externdef на global. 2. Добавил имена структур перед ends каждой структуры; TASM'у пофиг (что есть, что нет), а JWASM'у нужно, чтобы было. 3. Но пока не придумал (а разработчик еще не ответил), как обойти использование label в объявлениях структур, например: Код (Text): ; PUSHAD Workspace PADWS struc padws_begin = $ PADrEDIbytes label byte PADrEDI label dword PADrDI dw ? dw ? PADrESIbytes label byte PADrESI label dword PADrSI dw ? dw ? PADrEBPbytes label byte PADrEBP label dword PADrBP dw ? dw ? PADrESPbytes label byte PADrESP label dword PADrSP dw ? dw ? PADrEBXbytes label byte PADrEBX label dword PADrBX label word PADrBL db ? PADrBH db ? dw ? PADrEDXbytes label byte PADrEDX label dword PADrDX label word PADrDL db ? PADrDH db ? dw ? PADrECXbytes label byte PADrECX label dword PADrCX label word PADrCL db ? PADrCH db ? dw ? PADrEAXbytes label byte PADrEAX label dword PADrAX label word PADrAL db ? PADrAH db ? dw ? padws_size = $ - PADrEDI PADWS ends JWASM ругается, мол, неверное применение label.
Ykidia Так и я написал не о "TASM" vs. "MASM", а о том, где видел "примеры написания исходников, которые могут одновременно компилироваться" двумя разными ассемблерами, в вашем случае это будут TASM и JWASM, просто нужно желание и терпение
Внезапно, наткнулся на свой антиквариат. Решил немного отвлечься, подправил пару-тройку файлов... под UASM. (Не разобрался еще как переименовать тему). Ладно, этот тупица не понимает множественных push и pop (как было привычно в TASM). Фиг с ним, наплодил везде где надо. Но вот не пойму, какого черта эта... этот компилятор не понимает размерности члена структуры, описанной накануне, где, естественно, размерность этого члена (и всех остальных) явно указана! В коде: Код (Text): GKIDWS struc gkidws_begin = $ GKIDTmpregESI dd ? GKIDTmpregEBX dd ? GKIDSymbolCnr dd ? GKIDKeywordID dd ? GKIDKeywordLen dd ? GKIDSymbolPtr dd ? GKIDTemplatePtr dd ? GKIDTemplates dd 00100h - (GKIDTemplates - gkidws_begin) dup(?) gkidws_tmplts_size = $ - GKIDTemplates gkidws_size = $ - GKIDTmpregESI GKIDWS ends И чуть далее: Код (Text): inc [esp].GKIDSymbolCnr Что же сообщает мне эта параша? Код (Text): Error A2183: Instruction operand must have size Видно, я что-то не так делаю, offset он из структуры берет, а размерность нет. Есть способ заставить его понимать размерность? Может, надо как-то по-другому объявлять? А то очень неприятно "прибивать гвоздями" одни и те же очевидные вещи в разных местах... Спасибо.
Ykidia, я бы воспользовался google-переводчиком и задал вопрос непосредственно разработчикам UASM на сайте masm32.com → UASM Assembler Development
На счёт UASM. Я использую версию 2.46.10.0, есть более новая версия, но он у меня не компилирует мой проект XRayExtensions 2, какая-то ошибка вылазит. Так что приходится использовать более старую версию. Вероятно в процессе рефакторинга кучу ошибок занесли, бывает. И да, UASM не полностью совместим с МАСМом.
Ykidia, разработчики всегда будут правы как реализована inc dword ptr [esp].GKIDSymbolCnr в UASM ? извлекается указатель dword ptr - другого и не может быть в 32 (обобщенный указатель ) а вот потом манипуляции с ним - это дело и право разработчиков UASM по обработке структуры GKIDWS (как они реализуют) см. дизасм. код типа того для данного случая 8B0424 mov eax, [esp] FF4008 inc dword ptr [eax+8] или FF442408 inc dword ptr [esp+8] но для общности и универсальности алгоритма скорее первый вариант