Самодельные библиотеки ассемблера FASM

от автора

Здесь я немного расскажу о библиотеках 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

ссылка на оригинал статьи https://habr.com/ru/post/566366/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *