Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; Файл для работы со строковыми функциями
  3. ;
  4.  
  5. ; str_len (str1)
  6. ;   Длина строки (возвращается в eax)
  7.  
  8. ; str_cat (str1, str2)
  9. ;   Добавление к строке st1 строки str2
  10.  
  11. ; str_n_cat (str1, str2, n_len)
  12. ;   Добавление к строке st1 строки str2. Если строка str2 длиннее чем n_len, то добавляются первые n_len символов.
  13.  
  14. ; conv_str_to_int (buf)
  15. ;   Преобразование строки buf в число (возвращается в eax)
  16.  
  17. ; convert_int_to_str (len)
  18. ;   Преобразование числа (eax) в строку (edi). len - длинна строки edi, которую можно использовать для преобразования.
  19.  
  20.  
  21. ;output:
  22. ; eax = strlen
  23. align 4
  24. proc str_len, str1:dword
  25.         mov eax,[str1]
  26.         @@:
  27.                 cmp byte[eax],0
  28.                 je @f
  29.                 inc eax
  30.                 jmp @b
  31.         @@:
  32.         sub eax,[str1]
  33.         ret
  34. endp
  35.  
  36. align 4
  37. proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
  38.         mov esi,[str2]
  39.         stdcall str_len,esi
  40.         mov ecx,eax
  41.         inc ecx
  42.         mov edi,[str1]
  43.         stdcall str_len,edi
  44.         add edi,eax
  45.         cld
  46.         repne movsb
  47.         ret
  48. endp
  49.  
  50. align 4
  51. proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n_len:dword
  52.         mov esi,[str2]
  53.         mov ecx,[n_len]
  54.         mov edi,[str1]
  55.         stdcall str_len,edi
  56.         add edi,eax
  57.         cld
  58.         repne movsb
  59.         mov byte[edi],0
  60.         ret
  61. endp
  62.  
  63. ;input:
  64. ; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
  65. ;output:
  66. ; eax - число
  67. align 4
  68. proc conv_str_to_int uses ebx ecx esi, buf:dword
  69.         xor eax,eax
  70.         xor ebx,ebx
  71.         mov esi,[buf]
  72.         ;определение отрицательных чисел
  73.         xor ecx,ecx
  74.         inc ecx
  75.         cmp byte[esi],'-'
  76.         jne @f
  77.                 dec ecx
  78.                 inc esi
  79.         @@:
  80.  
  81.         cmp word[esi],'0x'
  82.         je .load_digit_16
  83.  
  84.         .load_digit_10: ;считывание 10-тичных цифр
  85.                 mov bl,byte[esi]
  86.                 cmp bl,'0'
  87.                 jl @f
  88.                 cmp bl,'9'
  89.                 jg @f
  90.                         sub bl,'0'
  91.                         imul eax,10
  92.                         add eax,ebx
  93.                         inc esi
  94.                         jmp .load_digit_10
  95.         jmp @f
  96.  
  97.         .load_digit_16: ;считывание 16-ричных цифр
  98.                 add esi,2
  99.         .cycle_16:
  100.                 mov bl,byte[esi]
  101.                 cmp bl,'0'
  102.                 jl @f
  103.                 cmp bl,'f'
  104.                 jg @f
  105.                 cmp bl,'9'
  106.                 jle .us1
  107.                         cmp bl,'A'
  108.                         jl @f ;отсеиваем символы >'9' и <'A'
  109.                 .us1: ;составное условие
  110.                 cmp bl,'F'
  111.                 jle .us2
  112.                         cmp bl,'a'
  113.                         jl @f ;отсеиваем символы >'F' и <'a'
  114.                         sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
  115.                 .us2: ;составное условие
  116.                         sub bl,'0'
  117.                         cmp bl,9
  118.                         jle .cor1
  119.                                 sub bl,7 ;convert 'A' to '10'
  120.                         .cor1:
  121.                         shl eax,4
  122.                         add eax,ebx
  123.                         inc esi
  124.                         jmp .cycle_16
  125.         @@:
  126.         or ecx,ecx ;если число отрицательное
  127.         jnz @f
  128.                 neg eax
  129.                 inc eax
  130.         @@:
  131.         ret
  132. endp
  133.  
  134. ;input:
  135. ; eax - число
  136. ; edi - буфер для строки
  137. ; len - длинна буфера
  138. ;output:
  139. align 4
  140. proc convert_int_to_str, len:dword
  141. pushad
  142.         mov esi,[len]
  143.         add esi,edi
  144.         dec esi
  145.         bt eax,31
  146.         jae @f
  147.                 ;если число отрицательное
  148.                 neg eax
  149.                 ;inc eax ;???
  150.                 mov byte[edi],'-'
  151.                 inc edi
  152.         @@:
  153.         call .str
  154. popad
  155.         ret
  156. endp
  157.  
  158. align 4
  159. .str:
  160.         mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
  161.         ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
  162.         cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
  163.         jb @f
  164.                 xor edx,edx ;очистить edx
  165.                 div ecx   ;разделить - остаток в edx
  166.                 push edx  ;положить в стек
  167.                 ;dec edi  ;смещение необходимое для записи с конца строки
  168.                 call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
  169.                 pop eax
  170.         @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
  171.         cmp edi,esi
  172.         jge @f
  173.                 or al,0x30 ;данная команда короче  чем две выше
  174.                 stosb      ;записать элемент из регистра al в ячеку памяти es:edi
  175.                 mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор
  176.         @@:
  177.         ret        ;пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
  178.