Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Здесь я немного расскажу о библиотеках strnum.inc и myMSVlib.dll, которые я сам сделал. Они могут кому-то пригодится. Я уверен что написал не без ошибок. Все ниже перечисленные функции сохраняют состояние регистров, кроме регистра eFLAGS. Исходный код прилагается. Все функции возвращают значение через EAX.
Строки должны иметь в конце завершающий нуль.
strnum.inc - библиотека для работы со строками, добавлять, сравнивать, копировать, переводить число в строку и обратно.
myMSVlib.dll - библиотека которая имеет strnum.inc и 2 дополнительные функции: printf, scanf.
strnum.inc
lenStr(adr) - узнать длину строки по адресу.
lenInt(num) - узнать длину числа.
FindStrInStr(str1, str2) - ищет строку 2 в строке 1, и возвращает индекс где он нашел str2, в худшем случае возвращает 0.
StrCmpStr(str1, str2) - сравнивает строки и если они равны то возвращает 1, иначе 0
StrAddStr(str1, str2) - добавляет строку 2 к строке 1, возвращает адрес на готовую строку, использует LocalAlloc.
StrInt(adr, len, index) - переводин строку в число, len может быть 0 тогда он идет до первого символа который он не смог перевести в число, index может быть 0.
StrFloat(adr, len, index, zn) - переводит строку в дробное число, len может быть 0, index может быть 0, zn: 1 - он если видит знак "-" в начале то изменяет знак числа, 0 - останавливается функция.
IntStr(num) - переводит число в строку, использует LocalAlloc.
FloatStr(num, toc) - переводит дробное число в строку, num - DWORD дробное число, toc - точность (например: num = 0.567; toc = 2, на выходе: 0.56)
CopyStr(str1, outStr) - копирует строку str1 в outStr, если outStr = 0 то возвращает адрес на строку, использует LocalAlloc.
IsStrByInt(adr) - возвращает длину строки в которой он нашел число, например "123", вернет 3
IsStrByFloat(adr) - возвращает длину строки в которой он нашел дробное число, не учитывает знак "-", например: "-1.6", вернет 0; "1.6", вернет 3
myMSVlib.dll
Эта библиотека имеет все предыдущие функции, и добавляет 2 своих.
printf(string, [arg]) - вывод в консоль. "%d" - целое число, "%.4f" - дробное число с учетом новой точности (DWORD), стандартная точность 2, "%c" - символ (ASCII), "%x" - вывод hex числа, большими буквами, "%%" - вывод одного "%", "%s" - вывод строки.
scanf(string, num) - чтение с консоли. Функция создает буфер 512 байт через LocalAlloc. "%d" - целое число, "%f" - дробное число, "%c" - символ, "%s" - строка.
Примеры использования
lenStr(adr)
str1 db 'Hello world!',0
invoke lenStr, str1
EAX = 12
lenInt(num)
invoke lenInt, 567
EAX = 3
FindStrInStr(str1, str2)
str1 db 'He HHelloHiHH',0
str2 db 'Hello',0
invoke FindStrInStr, str1, str2
EAX = 4
StrCmpStr(str1, str2)
str1 db 'Hello world!',0
str2 db 'Hello world!',0
invoke StrCmpStr, str1, str2
EAX = 1
StrAddStr(str1, str2)
str1 db 'Hello ',0
str2 db 'world!',0
invoke StrAddStr, str1, str2
EAX = "Hello world!",0
StrInt(adr, len, index)
str1 db '123',0
invoke StrInt, str1, 0, 0
EAX = 123
str1 db '123A456',0
ind dd 0
invoke StrInt, str1, 0, ind
EAX = 123
ind = 3
StrFloat(adr, len, index, zn)
str1 db '0.5',0
invoke StrFloat, str1, 0, 0, 0
EAX = 0.5
str1 db '-0.5',0
invoke StrFloat, str1, 0, 0, 0
EAX = 0
str1 db '-0.5',0
invoke StrFloat, str1, 0, 0, 1
EAX = -0.5
str1 db '-0.567ABC',0
ind dd 0
invoke StrFloat, str1, 0, ind, 1
EAX = -0.567
ind = 5
IntStr(num)
invoke IntStr, 56
EAX = "56",0
invoke IntStr, -56
EAX = "-56",0
FloatStr(num, toc)
invoke FloatStr, 0.5678, 0
EAX = "0.56",0
invoke FloatStr, 0.5678, 4
EAX = "0.5678",0
CopyStr(str1, outStr)
str1 db 'Hello',0
invoke CopyStr, str1, 0
EAX = "Hello",0
str1 db 'Hello',0
str2 db 6 dup(0)
invoke CopyStr, str1, str2
EAX = str2
IsStrByInt(adr)
str1 db '12',0
invoke IsStrByInt, str1
EAX = 2
str1 db '-12',0
invoke IsStrByInt, str1
EAX = 0
IsStrByFloat(adr)
str1 db '12',0
invoke IsStrByFloat, str1
EAX = 2
str1 db '12.5',0
invoke IsStrByFloat, str1
EAX = 4
str1 db '-12.5',0
invoke IsStrByFloat, str1
EAX = 0
printf(string, [arg])
str1 db 'Hello %s! %d %.4f %c %x',0
str2 db 'world',0
invoke printf, str1, str2, 56, 0.567, 'A', 0ABCDEFh
Hello world! 56 0.5670 A ABCEDF
scanf(string, num)
d db '%d',0
f db '%f',0
c db '%c',0
s db '%s',0
num dd 0
invoke scanf, d, num
invoke scanf, f, num
invoke scanf, c, num
invoke scanf, s, num