Subversion Repositories Kolibri OS

Rev

Rev 7577 | 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
  93.  
  94. ;input:
  95. ; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
  96. ;output:
  97. ; eax - число
  98. align 4
  99. proc conv_str_to_int, buf:dword
  100.         xor eax,eax
  101.         push ebx ecx esi
  102.         xor ebx,ebx
  103.         mov esi,[buf]
  104.         ;определение отрицательных чисел
  105.         xor ecx,ecx
  106.         inc ecx
  107.         cmp byte[esi],'-'
  108.         jne @f
  109.                 dec ecx
  110.                 inc esi
  111.         @@:
  112.  
  113.         cmp word[esi],'0x'
  114.         je .load_digit_16
  115.  
  116.         .load_digit_10: ;считывание 10-тичных цифр
  117.                 mov bl,byte[esi]
  118.                 cmp bl,'0'
  119.                 jl @f
  120.                 cmp bl,'9'
  121.                 jg @f
  122.                         sub bl,'0'
  123.                         imul eax,10
  124.                         add eax,ebx
  125.                         inc esi
  126.                         jmp .load_digit_10
  127.         jmp @f
  128.  
  129.         .load_digit_16: ;считывание 16-ричных цифр
  130.                 add esi,2
  131.         .cycle_16:
  132.                 mov bl,byte[esi]
  133.                 cmp bl,'0'
  134.                 jl @f
  135.                 cmp bl,'f'
  136.                 jg @f
  137.                 cmp bl,'9'
  138.                 jle .us1
  139.                         cmp bl,'A'
  140.                         jl @f ;отсеиваем символы >'9' и <'A'
  141.                 .us1: ;составное условие
  142.                 cmp bl,'F'
  143.                 jle .us2
  144.                         cmp bl,'a'
  145.                         jl @f ;отсеиваем символы >'F' и <'a'
  146.                         sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
  147.                 .us2: ;составное условие
  148.                         sub bl,'0'
  149.                         cmp bl,9
  150.                         jle .cor1
  151.                                 sub bl,7 ;convert 'A' to '10'
  152.                         .cor1:
  153.                         shl eax,4
  154.                         add eax,ebx
  155.                         inc esi
  156.                         jmp .cycle_16
  157.         @@:
  158.         cmp ecx,0 ;если число отрицательное
  159.         jne @f
  160.                 sub ecx,eax
  161.                 mov eax,ecx
  162.         @@:
  163.         pop esi ecx ebx
  164.         ret
  165. endp