Здравствуйте, все! Решил перейти от компиляции. линковки и редактирования asm-файлов в Far на Notepad++. Установил NppExec. Создал скрипт Код (Text): cls set masm64=d:\masm39 cd "$(CURRENT_DIRECTORY)" $(masm64)\bin\ml64 /Cp /c /I"$(masm64)\Include" $(FILE_NAME) if $(EXITCODE) !=0 goto exit $(masm64)\bin\link /SUBSYSTEM:windows /LIBPATH:"$(masm64)\Lib" /entry:WinMain $(NAME_PART).obj /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:$(masm64)\bin\stubby.exe if $(EXITCODE) !=0 goto exit cmd /c $(NAME_PART).exe :exit Создание и запуск ехе-файла проходит на ура, но дальше начинаются вопросы. Как перед компиляцией удалять старый exe и ненужный obj? В bat-файле это решалось так Код (Text): if exist %filename%.exe del %filename%.exe if exist %filename%.obj del %filename%.obj В NppExec exist и del/delete не понимают При компиляции и линковке неизбежны ошибки и информацию о них я получал в файл errors.txt Код (Text): %masm64_path%bin\ml64 /Cp /c /I"%masm64_path%Include" %filename%.asm >> errors.txt NppExec ни >>, ни > не понимает. Чтобы не плодить кучу разных bat-файлов для создания GUI, CONSOLE, DLL, SYS я первой строкой в asm-файле писал Код (ASM): ; GUI # а в bat-файле шел разбор Код (Text): for /f "eol=# tokens=2-3" %%A in (%filename%.asm) do ( set kind_of_file=%%A if %%B == # exit /b ) goto %kind_of_file% где происходит переход на метку в bat-файле :CONSOLE, :GUI, : DLL и далее происходит сборка exe-/dll-/sys-файла по своим правилам. Как подобное организовать в Notepad++?
Часть проблем решил, скрипт для NppExec Код (Text): cls // очищаем консоль NppExec set masm64=d:\masm39 cd "$(CURRENT_DIRECTORY)" cmd /c if exist errors.txt del errors.txt // удалил программный мусор от предыдущего cmd /c if exist $(NAME_PART).obj del $(NAME_PART).obj // удачного или неудачного cmd /c if exist $(NAME_PART).exe del $(NAME_PART).exe // проекта cmd /c $(masm64)\bin\ml64 /Cp /c /I"$(masm64)\Include" $(FILE_NAME) >> errors.txt if $(EXITCODE) !=0 goto exit // если есть ошибки -- выведу их в консоль NppExec cmd /c $(masm64)\bin\link /SUBSYSTEM:windows /LIBPATH:"$(masm64)\Lib" /entry:WinMain $(NAME_PART).obj /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:$(masm64)\bin\stubby.exe >> errors.txt if $(EXITCODE) !=0 goto exit // если есть ошибки -- выведу их в консоль NppExec cmd /c $(NAME_PART).exe // запускаю получившийся экзешник del errors.txt // в случае запуска удаляю ненужные файлы del $(NAME_PART).obj exit // если ошибок нет -- выходим :exit // если ошибки есть, тогда выводим ошибки в консоль NppExec con_loadfrom errors.txt Как предусмотреть в одном скрипте создание exe(GUI/CONSOLE), dll, sys? Как в скрипте делать вывод длинных строк? В bat-файле я экранировал переход на другую строку символом "^" Как в notepad++ подсветить, допустим красным, строки с ошибками компиляции?
Я бы посоветовал перейти на nmake или make и написание .mak скриптов. Все прочие примочки по сравнению с nmake - пустая трата времени.
Допустим, при компиляции обнаружены ошибки. Список ошибок в файле errors.txt. Как в notepad++ подсветить, допустим красным, строки с ошибками в файле tut_03a.asm? Assembling: tut_03a.asm tut_03a.asm(9) : error A2006:undefined symbol : ebt tut_03a.asm(16) : error A2008:syntax error : in instruction tut_03a.asm(19) : error A2006:undefined symbol : rsx Пропуск первой строки, во второй и остальных строках в скобках номера строк с ошибками. Только увы, я синтаксиса NppExec не знаю (но пытаюсь разобраться). Может быть появится HESH, будет у кого спросить
Mikl___, у меня такой для 64 бит гуи ехе: Код (Text): SET PATH=D:\Masm32\bin cd $(CURRENT_DIRECTORY) $(PATH)\ML64 /c "$(FULL_CURRENT_PATH)" $(PATH)\LINK "$(CURRENT_DIRECTORY)\$(NAME_PART).obj" /SUBSYSTEM:WINDOWS /ENTRY:main cmd /c del "$(CURRENT_DIRECTORY)\$(NAME_PART).obj" А такой для 32 бит Код (Text): SET PATH=D:\Masm32\bin cd $(CURRENT_DIRECTORY) $(PATH)\ML /nologo -c -coff "$(FULL_CURRENT_PATH)" $(PATH)\LINK /nologo "$(CURRENT_DIRECTORY)\$(NAME_PART).obj" /SUBSYSTEM:WINDOWS cmd /c del "$(CURRENT_DIRECTORY)\$(NAME_PART).obj" --- Сообщение объединено, 5 мар 2023 --- да вроде никак, оно пишется вниз в консоль (в плане , окошко вывода) и все. тут все грустно весьма в нотепаде с масмом, но иного варианта нет. Radasm/Winasm, если они еще живы. В студии то еще хуже.
здеся что-то подобное 15 лет тому назад делали https://sourceforge.net/p/npp-plugins/discussion/672146/thread/db04bd47/
первая строка в моих asm-файлах Код (ASM): ; GUI # мне нужно получить слово GUI/CONSOLE/SYS/DLL и перейти на метку :GUI/ :CONSOLE/ :SYS/ : DLL и компилировать/линковать. В скрипте NotePadExec пишу Код (Text): cls set masm64=путь_к_ml64.exe_и_link.exe cd "$(CURRENT_DIRECTORY)" cmd /c for /f "eol=# tokens=2" %A in ($(FILE_NAME)) do exit /b && goto %A :CONSOLE //пока "пустышка" exit :GUI //компиляция и линковка с /SUBSYSTEM:WINDOWS если вместо goto подставить @echo, тогда на экран выводится "GUI" но на goto не реагирует, происходит выход по EXIT Вариант Код (Text): cmd /c for /f "eol=# tokens=2" %A in ($(FILE_NAME)) do set kind_of_file = %A && exit /b goto $(kind_of_file) также не работает Как подсветить в asm-файле строки с ошибками, если в результате компиляции сформировался файл errors.txt вида Код (Text): Assembling: tut_03a.asm tut_03a.asm(14) : error A2008:syntax error : in instruction tut_03a.asm(9) : error A2006:undefined symbol : Как сворачивать процедуры/структуры?
По поводу 2 пункта: Если errors.txt имеет вид: Код (Text): Assembling: tut_03a.asm tut_03a.asm(14) : error A2008:syntax error : in instruction tut_03a.asm(9) : error A2006:undefined symbol : То, можно вывести номер строк в файле tut_03a.asm следующим разбором: Код (Text): cd "$(CURRENT_DIRECTORY)" cmd /c for /f "tokens=1,2 delims=() skip=1" %i in (errors.txt) do if %i equ $(FILE_NAME) echo %j он выведет на консоль числа 14 и 9, потом их нужно как-то передать в скрипт NppExec, потому что написав в цикле выше команду SET, NppExec не будет знать о этой переменной, так как она выполнялась в cmd. Можно попробовать вывести номер строк в файле, а уже оттуда прочитать их в NppExec: Код (Text): cd "$(CURRENT_DIRECTORY)" cmd /c for /f "tokens=1,2 delims=() skip=1" %i in (errors.txt) do if %i equ $(FILE_NAME) echo %j >> temp.txt ... потом читаем в NppExec из temp.txt ... После этого, зная номера строк, подсветить их можно с помощью Код (Text): sci_sendmsg SCI_MARKERDELETE n n1 , где n - номер строки, а n1 - номер маркера (подробнее тут)
Для передачи из консоли в NppExec скрипт достаточно: Включить перенос консольного вывода в переменную $(OUTPUT) командой Код (Text): NPE_CONSOLE local v+ Теперь ее можно вывести или назначить другой переменной: Код (Text): echo $(OUTPUT) set n = $(OUTPUT)
Привет, всем! Может кто-нибудь подсказать как запустить hiew32 + asm-файл из-под Notepad++? Через "Запуск (F5)" понятно как А как тоже самое можно сделать через NppExec?
наверное cmd /c ".. тут то что надо запускать + параметры ..." пример https://sourceforge.net/p/npp-plugins/discussion/672146/thread/4e2bc155/
Разобрался Запуск hiew32 + exe-файл Код (Text): cls cd "$(CURRENT_DIRECTORY)" set masm64=c:\первая_папка_на_диске\вторая_папка_на_диске\... npp_run $(MASM64)\bin\hiew32.exe $(NAME_PART).exe Запуск x64dbg + exe-файл Код (Text): cls set masm64=c:\первая_папка_на_диске\вторая_папка_на_диске\... npp_run $(masm64)\x64\x64dbg "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" Запуск ResourceHacker + exe-файл Код (Text): cls set masm64=c:\первая_папка_на_диске\вторая_папка_на_диске\... cd "$(CURRENT_DIRECTORY)" npp_run $(masm64)\ResourceHacker\ResHacker $(NAME_PART).exe Компиляция, линковка, запускОгромное спасибо mantissa Код (Text): cls set masm64=c:\первая_папка_на_диске\вторая_папка_на_диске\... cd "$(CURRENT_DIRECTORY)" NPE_CONSOLE local v+ // Включаем вывод из командой строки в $(OUTPUT) cmd /c if exist errors.txt del errors.txt cmd /c if exist $(NAME_PART).obj del $(NAME_PART).obj cmd /c if exist $(NAME_PART).exe del $(NAME_PART).exe cmd /c for /f "eol=# tokens=2" %A in ($(FILE_NAME)) do @echo %A & exit goto $(OUTPUT) :DLL // компиляция DLL-ки exit :CONSOLE // компиляция консольного приложения exit :GUI // компиляция GUI-приложения cmd /c $(masm64)\bin\ml64 /Cp /c /I"$(masm64)\Include" $(FILE_NAME) >> errors.txt if $(EXITCODE) !=0 goto exit $(masm64)\bin\link /SUBSYSTEM:windows /LIBPATH:"$(masm64)\Lib" /entry:WinMain $(NAME_PART).obj /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:$(masm64)\bin\stubby.exe if $(EXITCODE) !=0 goto exit cmd /c $(NAME_PART).exe cmd /c del errors.txt cmd /c del $(NAME_PART).obj exit :exit con_loadfrom errors.txt Подсветка строк с ошибками в NppExec-консолиNotepad++ меню → «Плагины» → NppExec → «Console Output Filters» → вкладка «HighLight», включить 1-ый пункт и вписать: HighLight mask: "%FILE%(%LINE%) : error *" Red: "FF" Green: "00" BLue: "00" теперь, если щелкнуть по строке с ошибками в NppExec-консоли, тогда перенесет на строку с ошибкой в asm-файле
Здравствуйте, все! Вопрос о подсветке синтаксиса в Notepad++. Стандартная поставка → Меню пункт «Синтаксисы» → «A» → «Assembly». Вроде расцветка устраивает, но как добавить свертку по процедуре (proc-endp), структуре/объединению (struct/union-ends), блоку комментариев (comment символ-символ), целиком по секции (.data, .data?, .code). Пока нашел непонятный functionList→asm.xml, окраска ключевых слов в stylers.model.xml, сами ключевые слова в langs.model.xml
Mikl___, спасибо. Интересная идея. Тоже хочу попробовать (куда крестьяне - туда и Марфа Крива ) P.S. А коротенькая сказочка про дяденьку Римуса о том, как он дурным примером спровоцировал браца Кролика поставить себе Notepad++ и плагин NppExec - будет?
Прокачал скрипт для открытия нужного инструмента после компиляции не автоматом, а по запросу. После компиляции и отчистки не нужного прыгаем на метку DEBUG Код (Text): cmd /c del $(NAME_PART)_err.txt cmd /c del $(NAME_PART).obj cls goto DEBUG А там запрашиваем пользователя ввести в инпут 1 2 или 3, и в зависимости что введено открывается нужная программа, а если что-то другое или вообще ничего или окно ввода просто закрыть то завершаемся. Код (Text): :DEBUG echo "Для открытия x64dbg введите 1" echo "Для открытия hview введите 2" echo "Для открытия ResourceHacker введите 3" inputbox Enter... echo $(INPUT) if $(INPUT) == 1 then goto X64DBG else if $(INPUT) == 2 then goto HVIEW else if $(INPUT) == 3 then goto RSCHACK else cls endif exit :X64DBG cls echo open dbg... exit :RSCHACK cls echo rschacker exit :HVIEW cls echo hview exit Итого: После компиляции: Например хотим ResourceHacker - вводим 3 и получаем: Только вместо простого echo уже подставим