Что то у меня не совсем получается: 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-е работаю.
За тебя уже придумали классные фичи, как UNICODE_STRING и ANSI_STRING. И соответственно функции RtlInitUnicodeString, RtlUnicodeStringToAnsiString, RtlFreeAnsiString и т.п.
Причем тут придуманное, я хочу на примере разобраться со структурами и макросами и как это дело использовать.
В общем структура была написанна правильно и работает, только не пойму почему вчера не работала, а сегодня работает.
Для удобства можно ещё переделать макрос strtbl из fasm.pdf Код (Text): ;===================================================================== macro strtbl n,[arg] {align 4 local @1, @2 i = 0 forward i = i+1 common n dd i forward dd @1,@2-@1 forward @1: db arg @2: db 0} ;===================================================================== Объявлять можно так: Код (Text): ;===================================================================== strtbl animals,'dog','cat','dolphin','monkey','donkey','pig' strtbl cars, 'bmw','opel','zhiguli','toyota','kamaz','zaz' ;===================================================================== В результате будут сформированы 2 выровненные таблицы Код (Text): ;===================================================================== align 4 animals dd общее кол-во строк (элементов) в таблице animals dd указатель на 1-ю строку dd длина 1-й строки (без завершающего нуля) dd указатель на 2-ю строку dd длина 2-й строки (без завершающего нуля) dd указатель на 3-ю строку dd длина 3-й строки (без завершающего нуля) ... db '1-я строка',0 db '2-я строка',0 db '3-я строка',0 ... align 4 cars dd общее кол-во строк (элементов) в таблице cars dd указатель на 1-ю строку dd длина 1-й строки (без завершающего нуля) dd указатель на 2-ю строку dd длина 2-й строки (без завершающего нуля) dd указатель на 3-ю строку dd длина 3-й строки (без завершающего нуля) ... db '1-я строка',0 db '2-я строка',0 db '3-я строка',0 ... ;===================================================================== Примерно так можно отобрать первую строку из базы cars, длина которой более 5 символов Код (Text): ;===================================================================== mov edx,cars mov ecx,[edx] @1: add edx,8 cmp dword[edx],5 jc @2 mov eax,[edx-4] ; в eax указатель на строку ; длиной более 5 байт @2: dec ecx jnz @1 ;===================================================================== На unicode переделать элементарно, может ещё как-то можно улучшить ...