Subversion Repositories Kolibri OS

Rev

Rev 3244 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; Строковые функции
  3. ;
  4.  
  5. ;output:
  6. ; eax = strlen
  7. align 4
  8. proc str_len, str1:dword
  9.         mov eax,[str1]
  10.         @@:
  11.                 cmp byte[eax],0
  12.                 je @f
  13.                 inc eax
  14.                 jmp @b
  15.         @@:
  16.         sub eax,[str1]
  17.         ret
  18. endp
  19.  
  20. align 4
  21. proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
  22.         mov esi,[str2]
  23.         stdcall str_len,esi
  24.         mov ecx,eax
  25.         inc ecx
  26.         mov edi,[str1]
  27.         stdcall str_len,edi
  28.         add edi,eax
  29.         cld
  30.         repne movsb
  31.         ret
  32. endp
  33.  
  34. ;description:
  35. ; проверяет содержится ли строка str1 в строке str0
  36. ; проверка делается только начиная с первых символов, указанных в str0 и str1
  37. ; пример 1: если str0='aaabbbccc', str1='bbb' совпадения не будет
  38. ; пример 2: если str0='aaabbbccc', str1='aaa' совпадение будет
  39. ;output:
  40. ; al = 0 если строка str1 содержится в str0
  41. ; al != 0 если строка str1 не содержится в str0
  42. align 4
  43. proc str_instr uses edi esi, str0:dword, str1:dword
  44.         ;xor eax,eax
  45.         mov edi,[str0]
  46.         mov esi,[str1]
  47.         cld
  48.         @@:
  49.                 lodsb
  50.                 or al,al
  51.                 jz .e1
  52.                 scasb ;сравниваем символы
  53.         jz @b ;если совпали, то переходим к сравнению следующих
  54.         ;сюда попадаем если строки не совпали
  55.         sub al,[edi-1]
  56.         .e1: ;сюда попадаем если строка str1 (esi) закончилась
  57.         ret
  58. endp
  59.  
  60. ;input:
  61. ; eax - число
  62. ; edi - буфер для строки
  63. ; len - длинна буфера
  64. ;output:
  65. align 4
  66. proc convert_int_to_str uses eax ecx edx edi esi, len:dword
  67.         mov esi,[len]
  68.         add esi,edi
  69.         dec esi
  70.         call .str
  71.         ret
  72. endp
  73.  
  74. align 4
  75. .str:
  76.         mov ecx,10
  77.         cmp eax,ecx
  78.         jb @f
  79.                 xor edx,edx
  80.                 div ecx
  81.                 push edx
  82.                 ;dec edi  ;смещение необходимое для записи с конца строки
  83.                 call .str
  84.                 pop eax
  85.         @@:
  86.         cmp edi,esi
  87.         jge @f
  88.                 or al,0x30
  89.                 stosb
  90.                 mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор
  91.         @@:
  92.         ret