Переменная в строке 0_o

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 21 окт 2024.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Код (ASM):
    1.       mov ecx,48h
    2. @@:
    3.         invoke ShellExecute,NULL,NULL,'sendmidi.exe',a,NULL,SW_HIDE
    4. ; ???...
    5.         jnz @b
    6.  
    7.  
    8. section '.data' readable
    9.  
    10.     a db 'dev MODX hex syx 43 10 7f 1c 07 50 00 06 2f 75'
    Попробую объяснить) надо, например, 4-й байт справа в строке 'a' увеличивать от 0x0 до 0x48 и использовать в ShellExecute

    Боюсь забор нагородить и велосипед изобретать
     
  2. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    94
    Код (ASM):
    1. ; fasm1
    2. @@: mov al, 0x48
    3. sub al, cl
    4. mov byte ptr a+4, al
    А вместо ecx лучше ebx или добавить push/pop до и после invoke
    Вариант 2
    Код (ASM):
    1. ; fasm1
    2. @@: mov al, 0x48
    3. sub al, cl
    4. mov byte ptr a_var, al
    5. ...
    6. a db 'dev '
    7. a_var db 'M'
    8.   db 'ODX hex syx 43 10 7f 1c 07 50 00 06 2f 75'
    Вариант 3
    Код (ASM):
    1. ; fasm1
    2. @@: mov al, 0x48
    3. sub al, cl
    4. mov byte ptr a_var, al
    5. label a_var byte at a + 4
    Ах да. Справа
    Код (ASM):
    1. ; fasm1
    2. @@: mov al, cl
    3. add al, -0x48
    4. mov [a_var], al
    5. ...
    6. a db 'dev MODX hex syx 43 10 7f 1c 07 50 00 06 2f 75'
    7. label a_var at $ - 4
     
    Semiono нравится это.
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Мне запомнилось как в invoke вставлялись какие-то аргументы типа 'OVERLAPPED or BLABLA' или 'OVRLPD and BLA', 'AAA+BBB'
    А нельзя как-нибудь в поля макроса строку вставлять с переносом или со сложением?
    Как бы так 'стро' + 'ка' или 'стро',\'ка'

    Как-то склеивать строку надо. Хотя можно wsprintf внедрить как лишний invoke.
    Но не изящно)
     
  4. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    94
    Код (ASM):
    1. ; fasm1
    2. format PE
    3. include 'win32ax.inc'
    4. section '.idata' import data readable writeable
    5. library kernel32, 'kernel32.dll', user32, 'user32.dll'
    6. include 'API\kernel32.inc'
    7. include 'API\user32.inc'
    8. section '.text' code readable executable
    9. entry $
    10.     invoke MessageBox, HWND_DESKTOP, <"Привет, Semiono", 13, 10, "Это многострочное сообщение", 13, 10, "Тут строки объединяются в одну">, "Сообщение", MB_OK
    11.     invoke ExitProcess, eax
    12.  
     
    Semiono нравится это.
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Ах, вот оно как, уголки скобки! :)
     
  6. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    94
    Еще надо использовать расширенный вариант макросов. С include 'win(32|64)(a|w).inc' это работать не будет. Только с include 'win(32|64)(a|w)x.inc'
     
  7. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Код (ASM):
    1. @@:
    2.         cmp [msg],WM_INITDIALOG
    3.         je InitDialog
    4.  
    5.         mov eax,CBN_SELCHANGE
    6.         shl eax,16
    7.         add eax,ID_COMBOBOX
    8.         cmp [wparam],rax
    9.         jne exitproc
    10.  
    11.         invoke SendDlgItemMessage,[hwnddlg],ID_COMBOBOX,CB_GETCURSEL,NULL,NULL
    12.         invoke SendDlgItemMessage,[hwnddlg],ID_COMBOBOX,CB_GETITEMDATA,eax,NULL
    13.  
    14.         invoke ShellExecute,NULL,NULL,'sendmidi.exe',rax,NULL,SW_HIDE
    15.  
    16. exitproc:
    17.  
    18. ; ...
    19.  
    20. InitDialog:
    21.  
    22.         invoke SetLayeredWindowAttributes,[hwnddlg],NULL,237,LWA_ALPHA
    23.  
    24.         invoke ShellExecute,NULL,NULL,'sendmidi.exe',a,NULL,SW_HIDE
    25.  
    26.         invoke SendDlgItemMessage,[hwnddlg],ID_COMBOBOX,CB_ADDSTRING,NULL,'Bd Dry1'
    27.         invoke SendDlgItemMessage,[hwnddlg],ID_COMBOBOX,CB_SETITEMDATA,eax,'dev MODX hex syx 43 10 7f 1c 07 50 06 06 2d 3b'
    28.  
    29. ; ...
    30.  
    31. section '.data' readable
    32.  
    33.         a db \
    34.         'dev MODX ch 1 cc 0 63......... много байт!
    Что-то я выход не могу найти. Мне надо чтобы данные 'a' выполнялись каждый раз перед rax данными.
    Лучше склеить их в одну строку. Не пойму почему так не пошло.. может буфер слишком длинный
    Код (ASM):
    1.         invoke wsprintf,z,'%s %s',[a],rax
    2.         invoke ShellExecute,NULL,NULL,'sendmidi.exe',z,NULL,SW_HIDE
    :)
    Смысл в том, чтоб в каждый айтем не писать много лишнего, а данные '.data' как бы сбрасывают всё и в айтем вызываются только нужные изменения.
    Ато я сейчас в каждый item вызываю всё что в другом сбрасываю по-умолчанию типа)
     
  8. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    94
    Так не выйдет. Тут вы манипулируете данными полностью самостоятельно. То что можно задать сложную константу как один параметр и она будет собрана как единое целое не подразумевает любые манипуляции по соединению данных. <> - треугольные скобки просто экранируют запятые и макрос принимает все внутри них как один параметр. Далее этот параметр просто размещается в секции кода как
    Код (ASM):
    1. ; fasm1
    2. local label, skip
    3. jmp skip
    4. label TCHAR argument, NULL
    5. skip:
    6. lea rax, [label]
    7. mov rcx|rdx|r8|r9|qword[rsp+nArg], rax
    Как-то так.

    В вашем случае надо формировать константу для записи в контрол самостоятельно.

    Если таких констант в параметрах несколько то jmp будет только один, а все константы соберутся в блок
    Код (ASM):
    1. ; fasm1
    2. local label1, label2, skip
    3. jmp skip
    4. label1 TCHAR argument1, NULL
    5. label2 TCHAR argument2, NULL
    6. skip:
    7. lea rax, [label1]
    8. mov rcx|rdx|r8|r9|qword[rsp+n+0Arg], rax
    9. lea rax, [label2]
    10. mov rdx|r8|r9|qword[rsp+n+1Arg], rax
    11.  
     
    Semiono нравится это.
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Мне всё это пригодится, сразу так много узнал!
    Насчёт кода, на словах, там всё везде одинаково, однотипные блоки "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
    Или это не проблема)
     
    Последнее редактирование: 26 окт 2024
  10. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    94
    Просто уберите 0 и посмотрите. В крайнем случае можно от ноль-терминатора перейти к длинам
    Код (ASM):
    1. ; fasm1
    2. section '.data' data ...
    3. a db 'abracadabra'
    4. a.len = $ - a
    5. b db ' chungachanga'
    6. b.len = $ - a
    Но такие строки придется так и так форматировать дополнительно перед использованием в WinAPI т.к. там всегда ноль-терминатор (C-style).
     
    Semiono нравится это.