Логирование процедур в Fasm

Тема в разделе "WASM.ASSEMBLER", создана пользователем Miller Rabin, 9 июн 2008.

  1. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Знаете что теперь в Fasm можно указывать значения переменных из командной строки?
    Например: Fasm -dDEBUG=TRUE

    В результате чего будут работать конструкции вида
    match =TRUE, DEBUG
    {
    ...
    }

    Так вот на основании этого захотелось мне, чтобы в отладочных версиях программ логировался вход и выход из процедур. Для этого был переопределен макрос proc. Получилось что-то вроде

    Код (Text):
    1. macro proc [args]
    2. {
    3.     common
    4.     match name params, args>
    5.     \{
    6.       PROCNAME equ name                                      ;В результате работы match name будет соответствовать имени
    7.                                                                         ;процедуры
    8.       define@call name,<params
    9.     \}
    10.  
    11.     match =TRUE, DEBUG
    12.     \{
    13.         jmp @f
    14.         DebugString DB PROCNAME         --???????
    15.                        DB ' entered',0
    16.         @@:
    17.    
    18. \}
    19. }
    Вот тут-то и проблема как массив байт DebugString сделать так, так чтобы его содержимое соответствовало PROCNAME?
    Фактически задача сводится к тому, чтобы из PROCNAME получить 'PROCNAME', чтобы конструкция
    DebugString DB PROCNAME заработала. Но я вертел и так и эдак и так и не смог придумать как.
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    В 2.3 манула есть инфа по спец директивам - даже не знаю как этот символ тут напечатать )) подобие '
     
  3. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Это ты имеешь ввиду значок над тильдой типа апостроф :)
    Эта штука конертирует имя переменной в строку в кавычках.

    то есть
    name equ SomeProc
    PROCNAME equ `name - В результате сего действа Переменная PROCNAME будет равна 'name', а не 'SomeProc' как бы хотелось. Меня это смутило поначалу

    Но есть оговорка, что если переменная является параметром макроса, она таки будет развернута в свое значение.
    Используя это можно сделать следующее

    Код (Text):
    1.        
    2.            local DebugString
    3.            match =TRUE, DEBUG
    4.     \{
    5.         match PROCNAME params, `args>
    6.         \\{
    7.             jmp @f
    8.             DebugString DB PROCNAME
    9.                              DB ' entered',0
    10.         @@:
    11.            stdcall WriteToFile, DebugString
    12.                     \\}
    13.     \}
    Так все работает. asmfan спасибо за умную мысль :)

    Если использовать данный метод, то в отладочной версии можно логировать в файл вход и выход из процедур и при этом не загромождать отладочной информацией основной исходник программы. А при установки Debug в FALSE (точнее не в TRUE) весь этот отладочный мусор убирается из кода нафиг. :)