Разделить текст средствами MASM

Тема в разделе "WASM.WIN32", создана пользователем Valentin, 29 дек 2008.

  1. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    Подскажите, как вставить в эдит-контролы тексты между разделителями (`)??:

    ой-бла`10,874`асм`forum`1000

    т.е. разбить текст на колонки.
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Valentin
    А в чем именно сложности? В самом разделении?
    Код (Text):
    1.   mov esi,text
    2. next_word:
    3.   mov edi,buf
    4. next_char:
    5.   lodsb
    6.   cmp al,'`'
    7.   jnz next_char
    8.   xor al,al
    9.   stosb
    10.   ; отображение текста buf там где надо
    11.   ; проверка, надо ли продолжжать поиск
    12.   jz next_word
    13. ...
    14. buf resb 64
     
  3. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    сканируем до встречи '`'
    а где найти само слово "ой-бла" ?
     
  4. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    meduza, спасибо, буду пробовать.
     
  5. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    Получается так:
    Код (Text):
    1. .data
    2.     text   db "ой-бла`10,874`асм`forum`1000", 0
    3. .data?
    4.         buf  dd     ?
    5. .code
    6.  
    7. start:
    8.  
    9.   mov esi,offset text
    10. next_word:
    11.   mov buf,edi ; [b]!!!здесь ничего нет.[/b]
    12.  next_char:
    13.   lodsb
    14.   cmp al,'`'
    15.   jnz next_char
    16.   xor al,al
    17.   stosb
    18.   ; отображение текста buf там где надо
    19.   ; проверка, надо ли продолжжать поиск
    20.   jz next_word
    21.  
    22.     ret
    23.     invoke ExitProcess,NULL
    24. end start
    Мне нужно прочитать первое слово - послать в контрол, дальше второе и т.д.
     
  6. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Valentin
    круто, что ты этим хотел сказать? :) Вообще-то аргументы надо местами переставить.
    4 байта под строку? не маловато ли?! Я бы написал хотя бы "db 64 dup (0)", но тебе лучше знать, какой длины максимально может быть строка.

    Ты пишешь на масме/тасме? Тогда не забывай про слово "offset", когда нужен адрес. Т.е. "mov edi,offset buf".

    если всего пять слов, то код вместе с "проверкой, надо ли продолжать поиск" будет такой (masm):
    Код (Text):
    1.   mov esi,offset text
    2.   mov ecx,5
    3. next_word:
    4.   mov edi,offset buf
    5. next_char:
    6.   lodsb
    7.   cmp al,'`'
    8.   jnz next_char
    9.   xor al,al
    10.   stosb
    11.   ; отображение текста buf там где надо
    12.   dec ecx
    13.   jnz next_word
    ret нафига тута? ;)
     
  7. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    ret -это ошибка при копировании (не нужно).
    Код (Text):
    1. .........
    2.   stosb
    3.   ; отображение текста buf там где надо
    4.        
    5.  dec ecx
    6. ........
    Я так понял, что в буфере buf найденого текста нет.
    mov edi,offset buf
    т.к. он (буфер) ложится в edi

    Немного изменим задачу для наглядности.
    Код (Text):
    1.  mov esi,offset text
    2.   mov ecx,5
    3. next_word:
    4.   mov edi,offset buf
    5.  
    6. next_char:
    7.   lodsb
    8.   cmp al,'`'
    9.   jnz next_char
    10.   xor al,al
    11.   stosb
    12.   ; отображение текста buf там где надо
    13.  invoke MessageBox,NULL,offset buf,0,MB_OK OR MB_ICONWARNING OR MB_SYSTEMMODAL             
    14.  dec ecx
    15.   jnz next_word
    Вот как сейчас поместить слова в MessageBox (к примеру), чтобы они отображались при каждом проходе через '`' ?
     
  8. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Valentin
    Есть.
    Не буфер, а его адрес.

    ой, я ложанулся, с самого начала сделал ошибку, а потом ее переписывал. После lodsb надо поставить stosb:
    Код (Text):
    1. next_char:
    2.   lodsb
    3.   stosb ; *
    ты уже написал код, если добавить stosb после lodsb, то все будет работать.

    п.с. я точно не знаю, но вроде MessageBox портит ecx, его надо сохранить перед вызовом и восстановить после, например в стеке.
     
  9. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    ой-бла!!!

    Meduza
    Спасибо, все работает.

    С Новым Годом!!! Удачи во всем..