forked from KolibriOS/kolibrios
121 lines
3.5 KiB
FASM
121 lines
3.5 KiB
FASM
; by ManHunter / PCL
|
|
; http://www.manhunter.ru
|
|
;-----------------------------------------------------
|
|
; Функция получения длины строки (Fast)
|
|
;-----------------------------------------------------
|
|
; lpStr - указатель на строку ASCIIZ
|
|
; На выходе: EAX - длина строки без учета завершающего
|
|
; нулевого байта
|
|
;-----------------------------------------------------
|
|
;proc _lstrlen lpStr:DWORD
|
|
; mov eax, [lpStr]
|
|
; sub eax, 4
|
|
;@@:
|
|
; add eax, 4
|
|
; cmp byte [eax], 0
|
|
; je .szlen_lb1
|
|
; cmp byte [eax+1], 0
|
|
; je .szlen_lb2
|
|
; cmp byte [eax+2], 0
|
|
; je .szlen_lb3
|
|
; cmp byte [eax+3], 0
|
|
; jne @b
|
|
; sub eax, [lpStr]
|
|
; add eax, 3
|
|
; ret
|
|
;.szlen_lb3:
|
|
; sub eax, [lpStr]
|
|
; add eax, 2
|
|
; ret
|
|
;.szlen_lb2:
|
|
; sub eax, [lpStr]
|
|
; add eax, 1
|
|
; ret
|
|
;.szlen_lb1:
|
|
; sub eax, [lpStr]
|
|
; ret
|
|
;endp
|
|
|
|
;-----------------------------------------------------
|
|
; Функция получения длины строки
|
|
;-----------------------------------------------------
|
|
; lpStr - указатель на строку ASCIIZ
|
|
; На выходе: EAX - длина строки без учета завершающего
|
|
; нулевого байта
|
|
;-----------------------------------------------------
|
|
proc _lstrlen lpStr:DWORD
|
|
mov eax, [lpStr]
|
|
@@: inc eax
|
|
cmp byte [eax], 0
|
|
jne @b
|
|
sub eax, [lpStr]
|
|
ret
|
|
endp
|
|
;-----------------------------------------------------
|
|
; Функция быстрого слияния двух строк
|
|
; используются функции _lstrlen, _lstrcpy
|
|
;-----------------------------------------------------
|
|
; lpDst - указатель на исходную строку ASCIIZ
|
|
; lpSrc - указатель на добавляемую строку ASCIIZ
|
|
;-----------------------------------------------------
|
|
proc _lstrcat lpDst:DWORD, lpSrc:DWORD
|
|
pusha
|
|
|
|
stdcall _lstrlen,[lpDst]
|
|
add eax,[lpDst]
|
|
|
|
stdcall _lstrcpy,eax,[lpSrc]
|
|
|
|
popa
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------
|
|
; Функция быстрого копирования строки
|
|
; используются функции _lstrlen, _memcopy
|
|
;-----------------------------------------------------
|
|
; lpDst - указатель на приемник
|
|
; lpSrc - указатель на строку ASCIIZ
|
|
;-----------------------------------------------------
|
|
proc _lstrcpy lpDst:DWORD, lpSrc:DWORD
|
|
pusha
|
|
|
|
stdcall _lstrlen,[lpSrc]
|
|
inc eax
|
|
stdcall _memcopy,[lpDst],[lpSrc],eax
|
|
|
|
popa
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------
|
|
; Функция быстрого копирования участка памяти
|
|
;-----------------------------------------------------
|
|
; lpDst - указатель на приемник
|
|
; lpSrc - указатель на источник
|
|
; dSize - размер копируемого блока
|
|
;-----------------------------------------------------
|
|
proc _memcopy lpDst:DWORD, lpSrc:DWORD, dSize:DWORD
|
|
pusha
|
|
|
|
; Установить указатели на источник и приемник
|
|
cld
|
|
mov edi,[lpDst]
|
|
mov esi,[lpSrc]
|
|
|
|
mov ecx,[dSize]
|
|
push ecx
|
|
; Разделить на 4 и получить длину в DWORD
|
|
shr ecx,2
|
|
; Скопировать основную часть строки DWORD'ами
|
|
rep movsd
|
|
pop ecx
|
|
; Получить остаток от деления на 4
|
|
and ecx,3
|
|
; Скопировать остаток строки байтами
|
|
rep movsb
|
|
|
|
popa
|
|
ret
|
|
endp
|