Адресные пространства (препроцессор:FASM)

Тема в разделе "FASM", создана пользователем NANO_VIRUS, 27 мар 2019.

Метки:
  1. NANO_VIRUS

    NANO_VIRUS New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2017
    Сообщения:
    15
    Приветствую.

    Есть ли возможность писать код по адресу в заданном участке кода?

    Допустим я хочу через макрос 'code' по метке 'front' в конце кода написать {db 'text',0}. С условием что макрос может быть вызван до указанной метки.
    Код (ASM):
    1. macro code
    2. {
    3.  ;...
    4. }
    5. ; Вызываем тут...
    6. code
    7.  
    8. nop
    9. nop
    10. nop
    11.  
    12. front:
    13. ; Появляется тут...
    14. ; db 'text', 0
    В документации нашел вот такой пример:
    Код (ASM):
    1. virtual at 0
    2.  xor ebx, ebx
    3.  xor eax, eax
    4.  load code dword from 0
    5. end virtual
    6.  
    7. ; В этом месте будут объявлены инструкции
    8.  
    9. dd code
    Он дал возможность объявлять инструкций и значений данных. По сути уже половина моего решения. Но я так и не разобрался в размере этого кода. Как его можно задавать под определенный размер? Что если код например будет в размере 3 байт? И как его потом объявлять?
    Код (ASM):
    1. virtual at 0
    2.  db 0, 0, 0
    3.  load code ??? from 0 ; Вот не знаю теперь как тут выставлять размер...
    4. end virtual code
    Еще конечно еще константа equ или define, но она не удобна когда допустим нужно ее использовать до её объявления. В отличии от константы через оператор '=', но в ней можно объявить только числовое значение.
    Код (ASM):
    1. x equ mov eax, dword[ecx+edx*5]
    2. define x mov eax, dword[ecx+edx*5]
    3. ; Нельзя так, но хотелось бы аналог
    4. ; x = mov eax, dword[ecx+edx*5]
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Ты не тем способом это пытаешься сделать.
    Код (ASM):
    1. datalist equ
    2. macro datalist_add l,d {
    3.         match any,datalist \{ datalist equ datalist,l,d \}
    4.         match ,datalist \{ datalist equ l,d \}
    5. }
    6. macro datalist_store [l,d] {
    7.         forward
    8.                 l db d,0
    9. }
    10. datalist_add anytext1,'anytext1'
    11. datalist_add anytext2,'anytext2'
    12. ;...
    13. match datalist,datalist { datalist_store datalist }
    Тебе надо просто таскать пару лейбл-значение до нужного места, а не сами байты. При желании можно и нуль-терминатор таскать, если усложнить немного.

    ЗЫ: а можешь тупо добавить новый макрос в список, а со списка в конце эти макросы вываливать.
     
    NANO_VIRUS и q2e74 нравится это.
  3. NANO_VIRUS

    NANO_VIRUS New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2017
    Сообщения:
    15
    Спасибо