Конвертирование текста в число.

Тема в разделе "WASM.BEGINNERS", создана пользователем satan, 23 дек 2006.

  1. satan

    satan New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2006
    Сообщения:
    10
    Господа офицеры, драхуйти !

    С наступающим, ибо не всегда помнишь грань между наступающим Новым годом и уже прошедшим, поэтому поздравлю заранее.

    Имеется код :

    Код (Text):
    1. .draw:
    2.         call    .createstr
    3.         push    eax
    4.         stdcall StrPtr, eax
    5.         invoke  DrawText, [.lParam], eax, -1, [.ptrRect], DT_TOP or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_SINGLELINE
    6.         stdcall StrDel ; From stack
    7.  
    8. .finish:
    9.         pop     eax ebx ecx edx esi edi
    10.         ret
    11.  
    12. .createstr:
    13.         mov     esi, [.ptrPropInfo]
    14.         mov     eax, [esi+TPropInfo.ofsVal]
    15.         add     eax, [.ptrCtrl]
    16.  
    17.         mov     ecx, [esi+TPropInfo.Tag]
    18.         or      ecx, ntsZeroTerminated
    19.  
    20.         movsx   edx, byte [eax]
    21.         cmp     [esi+TPropInfo.type], ptByte
    22.         je      .sign
    23.  
    24.         movsx   edx, word [eax]
    25.         cmp     [esi+TPropInfo.type], ptWord
    26.         je      .sign
    27.  
    28.         mov     edx, [eax]
    29.         jmp     .convert
    30.  
    31. .sign:
    32.         test    ecx, ntsUnsigned
    33.         jz      .convert
    34.  
    35.         and     edx, $ffff
    36.         cmp     [esi+TPropInfo.type], ptWord
    37.         je      .convert
    38.  
    39.         and     edx, $ff
    40.  
    41. .convert:
    42.         stdcall NumToStr, edx, 0, 0, ecx
    43.         mov     ecx, [esi+TPropInfo.Tag]
    44.         and     ecx, $ff00
    45.  
    46.         cmp     ecx, ntsHex
    47.         jne     @f
    48.         stdcall StrInsert, eax, cHexPreffix, 0
    49.         jmp     .doit
    50. @@:
    51.         cmp     ecx, ntsBin
    52.         jne     .doit
    53.         stdcall StrCat, eax, cBinSuffix
    54. .doit:
    55.         ret
    этот код, по идее конвертит строковую переменную в числовую ... но ... ёк. Где то шота неработает. Причем вставка ret для возврата не работает, я на асме не оч давно кодю, но вот качнул IDE Fresh к Fasm - у, поправил инклюды, чтоб он мог работать в 2-х режимах и теперь пытаюсь исправить косяки с отображением в окне пропертисов, так вот этот код отвечает за корректное отображение высоты, широты, долготы, ну вообчем числового свойства компонента. причем когда код модифицируешь в такой вариант

    Код (Text):
    1. .draw:
    2.         ;call    .createstr
    3.         push    eax
    4.         stdcall StrPtr, eax
    5.         invoke  DrawText, [.lParam], eax, -1, [.ptrRect], DT_TOP or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_SINGLELINE
    6.         stdcall StrDel ; From stack
    7.  
    8.         mov     esi, [.ptrPropInfo]
    9.         mov     eax, [esi+TPropInfo.ofsVal]
    10.         add     eax, [.ptrCtrl]
    11.  
    12.         mov     ecx, [esi+TPropInfo.Tag]
    13.         or      ecx, ntsZeroTerminated
    14.  
    15.         movsx   edx, byte [eax]
    16.         cmp     [esi+TPropInfo.type], ptByte
    17.         je      .sign
    то в окошке появляется символ код которого введён и корректно сохраняется, прошу помочь разобраться где косяк ?

    Заранее благодарен .... !
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Сабж проще всего реализовать одним вызовом wsprintf:
    Код (Text):
    1. push eax
    2. push sFmt ; sFmt db "%d",0
    3. push buf  ; buf  rb 12
    4. call DWORD [wsprintf]
    5. add esp,12
    Всё, теперь в buf хранится текстовое представление исходного числа и его можно сразу подавать в DrawText.

    Кстати, почему топик назван "Конвертирование текста в число"?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. proc dwtoa dwValue, lpBuffer
    2.      push ebx
    3.      push esi
    4.      push edi
    5.      mov eax, [dwValue]
    6.      mov edi, [lpBuffer]
    7.      or eax, eax
    8.      jnz .sign
    9.    .zero:
    10.      mov word [edi], 30h
    11.      jmp .dw2asc
    12.    .sign:
    13.      jns .pos
    14.      mov byte [edi], '-'
    15.      neg eax
    16.      inc edi
    17.    .pos:
    18.      mov ecx, 429496730
    19.      mov esi, edi
    20.    .whilex:
    21.      mov ebx, eax
    22.      mul ecx
    23.      mov eax, edx
    24.      lea edx, [edx*4+edx]
    25.      add edx, edx
    26.      sub ebx, edx
    27.      add bl, '0'
    28.      mov [edi], bl
    29.      inc edi
    30.      test eax, eax
    31.      ja .whilex
    32.      mov byte [edi], 0
    33.    .whiles:
    34.      cmp esi, edi
    35.      jae .endws
    36.      dec edi
    37.      mov al, [esi]
    38.      mov ah, [edi]
    39.      mov [edi], al
    40.      mov [esi], ah
    41.      inc esi
    42.      jmp  .whiles
    43.    .endws:
    44.    .dw2asc:
    45.      pop edi
    46.      pop esi
    47.      pop ebx
    48.      ret
    49. endp
    Я использую такой код, где-то на форуме нашёлся.
    Код (Text):
    1. stdcall dwtoa, eax, buf ; buf   db 10 dup (?)
     
  4. satan

    satan New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2006
    Сообщения:
    10
    Спасиб ... ща проверю.

    А тема так называеца, потому что ... программа берет с настроек число (допустим размер по вертикали) вставляет в ячейку таблицы, но при отображении выводится символ код которого равен числу - например 61 - А помоему, ну так вот код долженпросто перевести А или типа А;№jj в последовательность чисел, ну или строк, но в числовом формате тоесть не А;№jj а примерно 65535 и все, что бы визуально видеть что в настройках ...
     
  5. satan

    satan New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2006
    Сообщения:
    10
    Quantum
    Я просто мож не правильно поставил задачу. Необходимо конвертировать текст в ASCII код и сохранить код в текстовом формате.
     
  6. satan

    satan New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2006
    Сообщения:
    10
    Вообчем работают все примеры, но видно тут дело в другом. Прикреплю сдесь Fresh IDE, мож поможете разобраться. Открываю проект fresh.fpr из папки sourse, захожу в Project manager -> Editor -> Properties editor -> propgrid.asm. Файл окна Properties. Нахожу строку

    Код (Text):
    1. .draw:
    2.         call    .createstr
    3.         push    eax
    4.         stdcall StrPtr, eax
    5.         invoke  DrawText, [.lParam], eax, -1, [.ptrRect], DT_TOP or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_SINGLELINE
    6.         stdcall StrDel ; From stack
    изменяю её так

    Код (Text):
    1. .draw:
    2.         ;call    .createstr
    3.  
    4.         mov     esi, [.ptrPropInfo]
    5.         mov     eax, [esi+TPropInfo.ofsVal]
    6.         add     eax, [.ptrCtrl]
    7.  
    8.         push    eax
    9.         stdcall StrPtr, eax
    10.         invoke  DrawText, [.lParam], eax, -1, [.ptrRect], DT_TOP or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_SINGLELINE
    11.         stdcall StrDel ; From stack
    компилирую, запускаю File - New - Form и получаю:

    [​IMG]

    так вот я понял что в полях отображается содержимое регистров, а функции описаные выше должны изменить их представление в удобочитаемом виде (не важно строка или число) ... Так вот вопрос ... где косяк в коде, после которого не сохраняются данные регистров и стека ? Вот я понять не могу чего ...
    Хотя до етого додумал благодаря вашим подсказкам.
     
  7. satan

    satan New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2006
    Сообщения:
    10
    Все ОК ... господа, братья товарисчи ... По примеру n0name - впихнул данную обработку в процедуру, изменил переменные по совету Quantum и получил желаемое. Огромный Сенкую, респект и челПасибо!!!

    Можно закрыть топик.

    ЗЫ ... при необходимости продолжить данную тему (в смысле IDE для FASM, исправленные и доработаные файлы будут приаттачены к топику)

    Засим прошчаюсь !

    ...............................................................(Z)Sn