Код (ASM): mov ecx,48h @@: invoke ShellExecute,NULL,NULL,'sendmidi.exe',a,NULL,SW_HIDE ; ???... jnz @b section '.data' readable a db 'dev MODX hex syx 43 10 7f 1c 07 50 00 06 2f 75' Попробую объяснить) надо, например, 4-й байт справа в строке 'a' увеличивать от 0x0 до 0x48 и использовать в ShellExecute Боюсь забор нагородить и велосипед изобретать
Код (ASM): ; fasm1 @@: mov al, 0x48 sub al, cl mov byte ptr a+4, al А вместо ecx лучше ebx или добавить push/pop до и после invoke Вариант 2 Код (ASM): ; fasm1 @@: mov al, 0x48 sub al, cl mov byte ptr a_var, al ... a db 'dev ' a_var db 'M' db 'ODX hex syx 43 10 7f 1c 07 50 00 06 2f 75' Вариант 3 Код (ASM): ; fasm1 @@: mov al, 0x48 sub al, cl mov byte ptr a_var, al label a_var byte at a + 4 Ах да. Справа Код (ASM): ; fasm1 @@: mov al, cl add al, -0x48 mov [a_var], al ... a db 'dev MODX hex syx 43 10 7f 1c 07 50 00 06 2f 75' label a_var at $ - 4
Мне запомнилось как в invoke вставлялись какие-то аргументы типа 'OVERLAPPED or BLABLA' или 'OVRLPD and BLA', 'AAA+BBB' А нельзя как-нибудь в поля макроса строку вставлять с переносом или со сложением? Как бы так 'стро' + 'ка' или 'стро',\'ка' Как-то склеивать строку надо. Хотя можно wsprintf внедрить как лишний invoke. Но не изящно)
Код (ASM): ; fasm1 format PE include 'win32ax.inc' section '.idata' import data readable writeable library kernel32, 'kernel32.dll', user32, 'user32.dll' include 'API\kernel32.inc' include 'API\user32.inc' section '.text' code readable executable entry $ invoke MessageBox, HWND_DESKTOP, <"Привет, Semiono", 13, 10, "Это многострочное сообщение", 13, 10, "Тут строки объединяются в одну">, "Сообщение", MB_OK invoke ExitProcess, eax
Еще надо использовать расширенный вариант макросов. С include 'win(32|64)(a|w).inc' это работать не будет. Только с include 'win(32|64)(a|w)x.inc'
Код (ASM): @@: cmp [msg],WM_INITDIALOG je InitDialog mov eax,CBN_SELCHANGE shl eax,16 add eax,ID_COMBOBOX cmp [wparam],rax jne exitproc invoke SendDlgItemMessage,[hwnddlg],ID_COMBOBOX,CB_GETCURSEL,NULL,NULL invoke SendDlgItemMessage,[hwnddlg],ID_COMBOBOX,CB_GETITEMDATA,eax,NULL invoke ShellExecute,NULL,NULL,'sendmidi.exe',rax,NULL,SW_HIDE exitproc: ; ... InitDialog: invoke SetLayeredWindowAttributes,[hwnddlg],NULL,237,LWA_ALPHA invoke ShellExecute,NULL,NULL,'sendmidi.exe',a,NULL,SW_HIDE invoke SendDlgItemMessage,[hwnddlg],ID_COMBOBOX,CB_ADDSTRING,NULL,'Bd Dry1' invoke SendDlgItemMessage,[hwnddlg],ID_COMBOBOX,CB_SETITEMDATA,eax,'dev MODX hex syx 43 10 7f 1c 07 50 06 06 2d 3b' ; ... section '.data' readable a db \ 'dev MODX ch 1 cc 0 63......... много байт! Что-то я выход не могу найти. Мне надо чтобы данные 'a' выполнялись каждый раз перед rax данными. Лучше склеить их в одну строку. Не пойму почему так не пошло.. может буфер слишком длинный Код (ASM): invoke wsprintf,z,'%s %s',[a],rax invoke ShellExecute,NULL,NULL,'sendmidi.exe',z,NULL,SW_HIDE Смысл в том, чтоб в каждый айтем не писать много лишнего, а данные '.data' как бы сбрасывают всё и в айтем вызываются только нужные изменения. Ато я сейчас в каждый item вызываю всё что в другом сбрасываю по-умолчанию типа)
Так не выйдет. Тут вы манипулируете данными полностью самостоятельно. То что можно задать сложную константу как один параметр и она будет собрана как единое целое не подразумевает любые манипуляции по соединению данных. <> - треугольные скобки просто экранируют запятые и макрос принимает все внутри них как один параметр. Далее этот параметр просто размещается в секции кода как Код (ASM): ; fasm1 local label, skip jmp skip label TCHAR argument, NULL skip: lea rax, [label] mov rcx|rdx|r8|r9|qword[rsp+nArg], rax Как-то так. В вашем случае надо формировать константу для записи в контрол самостоятельно. Если таких констант в параметрах несколько то jmp будет только один, а все константы соберутся в блок Код (ASM): ; fasm1 local label1, label2, skip jmp skip label1 TCHAR argument1, NULL label2 TCHAR argument2, NULL skip: lea rax, [label1] mov rcx|rdx|r8|r9|qword[rsp+n+0Arg], rax lea rax, [label2] mov rdx|r8|r9|qword[rsp+n+1Arg], rax
Мне всё это пригодится, сразу так много узнал! Насчёт кода, на словах, там всё везде одинаково, однотипные блоки "dev MODX hex syx 43 10 7f 1c 07 50 06 06 2d 3b" идут друг за другом. Сначала я вызываю главный дамп этих команд, а потом в диалоге всякие изменения из наборов+таких+команд. Просто было бы удобно каждый раз весь главный дамп загрузить чтобы произошёл полный сброс. Ато я уже в диалоге много лишнего стал набирать чтобы пункты диалога возвращались к основному набору между собой) Проще снова всё сбросить. Хотя большой блок огромный, но зато меньше путаницы) Вобщем теперь подумаю, спасибо за фасм! Ещё проще скажу, мне надо было invoke ShellExecute,NULL,NULL,'sendmidi.exe',a,NULL,SW_HIDE куда-то воткнуть! Только и всего. Чтобы каждый раз он вызывался. (перед изменениями) Но ума не хватило как это в диалоговых вызовах прикрутить. --- Сообщение объединено, 26 окт 2024 --- Если так писать столбиком! <> то можно весь код во все айтемы запихнуть, очень удобно))) --- Сообщение объединено, 26 окт 2024 --- Вот рабочий вариант! Хотя я кажется говорю каждый раз одно и то же только разными словами)) Есть строка байтов (огромная) и надо сделать ещё одну как минимум. Делаем (определяем) новую строку как «первую + 'новые байты'» Только не знаю как бы это записать.. section '.data' a db '...' b db a+'ещё байты' И наверное проблема что первая строка закрывается нулём? NULL Или это не проблема)
Просто уберите 0 и посмотрите. В крайнем случае можно от ноль-терминатора перейти к длинам Код (ASM): ; fasm1 section '.data' data ... a db 'abracadabra' a.len = $ - a b db ' chungachanga' b.len = $ - a Но такие строки придется так и так форматировать дополнительно перед использованием в WinAPI т.к. там всегда ноль-терминатор (C-style).