String для удобства

Тема в разделе "WASM.WIN32", создана пользователем Pretorian, 20 янв 2006.

  1. Pretorian

    Pretorian New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    33
    Адрес:
    Russia
    Что то у меня не совсем получается:



    struc string [str]

    {

    local label

    local label1

    .len dd label1-label

    label:

    .string db str

    label1:

    }



    macro ConsoleHandleOut i1

    ; Handle консоли на запись

    ; Вход: i1(dword)-адрес для хранения handle

    {

    invoke GetStdHandle,STD_OUTPUT_HANDLE

    mov [i1],eax

    }



    macro ConsolePrint i1,i2

    ; Вывести текст на консоль

    ; Вход: i1(dword)-адрес хранения handle, i2(str)-адрес строки

    {

    invoke WriteConsole,[i1],i2+4,[i2],i2,0

    }



    ---------------

    hconout dd 0;Handle консоли

    text1 string 'Пример.'

    ...

    ConsoleHandleOut hconout

    ConsolePrint hconout,text1

    ...



    Как выше код то нет проблем, но хочется обращаться к атрибутам string по этому меняю макрос вот так:



    macro ConsolePrint i1,i2

    ; Вывести текст на консоль

    ; Вход: i1(dword)-адрес хранения handle, i2(str)-адрес строки

    {

    invoke WriteConsole,[i1],i2.string,[i2.len],i2.len,0

    }



    Но тут происходит ошибка. В чем дело? Второй день на fasm-е работаю.
     
  2. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    За тебя уже придумали классные фичи, как UNICODE_STRING и ANSI_STRING.

    И соответственно функции RtlInitUnicodeString, RtlUnicodeStringToAnsiString, RtlFreeAnsiString и т.п.
     
  3. Pretorian

    Pretorian New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    33
    Адрес:
    Russia
    Причем тут придуманное, я хочу на примере разобраться со структурами и макросами и как это дело использовать.
     
  4. Pretorian

    Pretorian New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    33
    Адрес:
    Russia
    В общем структура была написанна правильно и работает, только не пойму почему вчера не работала, а сегодня работает.
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Для удобства можно ещё переделать макрос strtbl из fasm.pdf
    Код (Text):
    1. ;=====================================================================
    2. macro       strtbl n,[arg] {align 4
    3. local       @1,    @2
    4. i           =      0
    5. forward i   =      i+1
    6. common  n   dd     i
    7. forward     dd     @1,@2-@1
    8. forward @1: db     arg
    9.         @2: db     0}
    10. ;=====================================================================
    Объявлять можно так:
    Код (Text):
    1. ;=====================================================================
    2. strtbl      animals,'dog','cat','dolphin','monkey','donkey','pig'
    3. strtbl      cars,   'bmw','opel','zhiguli','toyota','kamaz','zaz'
    4. ;=====================================================================
    В результате будут сформированы 2 выровненные таблицы
    Код (Text):
    1. ;=====================================================================
    2. align 4
    3. animals     dd     общее кол-во строк (элементов) в таблице animals
    4.         dd     указатель на 1-ю строку
    5.         dd     длина 1-й строки (без завершающего нуля)
    6.         dd     указатель на 2-ю строку
    7.         dd     длина 2-й строки (без завершающего нуля)
    8.         dd     указатель на 3-ю строку
    9.         dd     длина 3-й строки (без завершающего нуля)
    10.         ...
    11.         db     '1-я строка',0
    12.         db     '2-я строка',0
    13.         db     '3-я строка',0
    14.         ...
    15. align 4
    16. cars        dd     общее кол-во строк (элементов) в таблице cars
    17.         dd     указатель на 1-ю строку
    18.         dd     длина 1-й строки (без завершающего нуля)
    19.         dd     указатель на 2-ю строку
    20.         dd     длина 2-й строки (без завершающего нуля)
    21.         dd     указатель на 3-ю строку
    22.         dd     длина 3-й строки (без завершающего нуля)
    23.         ...
    24.         db     '1-я строка',0
    25.         db     '2-я строка',0
    26.         db     '3-я строка',0
    27.         ...
    28. ;=====================================================================
    Примерно так можно отобрать первую строку из базы cars, длина которой более 5 символов
    Код (Text):
    1. ;=====================================================================
    2.         mov     edx,cars
    3.         mov     ecx,[edx]
    4. @1:     add     edx,8
    5.         cmp     dword[edx],5
    6.         jc      @2
    7.         mov     eax,[edx-4]        ; в eax указатель на строку
    8.                        ;       длиной более 5 байт
    9. @2:     dec     ecx
    10.         jnz     @1
    11. ;=====================================================================
    На unicode переделать элементарно, может ещё как-то можно улучшить ...