изменение данных в строке

Тема в разделе "WASM.BEGINNERS", создана пользователем trust, 15 май 2008.

  1. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Всем привет;)
    Столкнулся с трудностью замены данных в строке. Есть две строки:
    string db "xxxxx=12345",0
    string2 db "abc",0
    Вопрос:
    Как заменить xxxxx строки string db "xxxxx=12345",0, на abc строки string2 db "abc",0.
    Т.е. как сделать так чтобы string db "xxxxx=12345",0 приняла следующий вид = string db "abc=12345",0
    Подскажите пожалуйста как мне решить эту задачу. Заранее спасибо.
     
  2. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    не вдаваясь в подробности :)
    Код (Text):
    1. lea edi, string
    2. lea esi, string2
    3. mov eax, [esi] ; 'abc,0
    4. mov [edi], eax
    5. mov esi, edi
    6. mov eax, [esi+6]
    7. mov [edi+4], eax
    8. mov ax, [esi+10]
    9. mov [edi+8], ax
    Можно и проще...
     
  3. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Xerx а как проще? если не трудно. мне очень интересно.
     
  4. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    trust
    Тут дело не в простоте, а в универсальности :)
     
  5. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Xerx спасибо. если есть еще какой нибудь метод. буду рад;)
     
  6. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
  7. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Вы уточните немного...
    в буфере string вот это ХХХХХ - всегда будет именно 5 символов?
    и после знака равенства вот это 12345 - всегда именно 5 символов?
    Или могут быть разные варианты?

    Тогда можно и выбирать - копировать, или искать побайтно символ 3Dh (знак равенства)
     
  8. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    TOLSTOPUZ - xxxxx ( 8 символов ), 12345 ( 16 символов ). Есть предложения?
     
  9. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Так а второй буфер?
    Тоже фиксированная длина? Какая?
     
  10. FireFox

    FireFox New Member

    Публикаций:
    0
    Регистрация:
    9 май 2008
    Сообщения:
    19
    Xerx, код у тебя не совсем верный. С индексами неполадки.

    Исправленный вариант:
    Код (Text):
    1. lea edi, string
    2. lea esi, string2
    3. mov eax, [esi] ; 'abc,0
    4. mov [edi], eax
    5. mov esi, edi
    6. mov eax, [esi+5]
    7. mov [edi+3], eax
    8. mov eax, [esi+9]
    9. mov [edi+7], eax
    Касательно этого примера, имхо, проще не использовать, а за'rep'ить.
    Код (Text):
    1. ;34 байта. Подумаешь, на 6 байт длинее. ;)
    2. lea esi, string + 2
    3. mov eax, dword ptr[string2]
    4. mov [esi], eax
    5.  
    6. lea edi, string
    7. xor ecx, ecx
    8. mov cl, 5
    9. rep movsw
    10.  
    11. mov cl, '='
    12. lea eax, string + 3
    13. mov byte ptr [eax], cl
     
  11. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    TOLSTOPUZ abc ( 3 символа ). все фиксировано.
     
  12. FireFox

    FireFox New Member

    Публикаций:
    0
    Регистрация:
    9 май 2008
    Сообщения:
    19
  13. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Тут главное усвоить сам процесс работы со строками, потом уже полегче.
    Давай помаленьку:
    Смотри:

    mov ax,WORD PTR string2 ; берём 2 символа из string2

    (WORD PTR - значит что берем сразу 2 символа, а не один, для скорости)

    mov WORD PTR string,ax ; записываем в string первые 2 символа поверх старых

    Дальше также:

    mov al,string2+2 ; Берём оставшийся 3 символ из string2

    (+2 это какой по счёту байт берём, в данный момент значит третий)

    mov string+2,al ; дописали в string (в третий байт буфера) третий символ из string2

    (тут также, +2 значит в какую по счёту позицию вставляем)

    теперь как Выше указал FireFox передвинь в string всё
    с адреса string+8 ; знак равенства и далее
    на адрес string+3 и далее

    таким же методом как я кратенько показал...

    И потом нужно затереть конец буфера от остатков...
    Просто замени там всё нулями...
     
  14. FireFox

    FireFox New Member

    Публикаций:
    0
    Регистрация:
    9 май 2008
    Сообщения:
    19
    Хм, нет такого типа. "WORD PTR" нужно писать.

    Проще скопировать вместе с "родным" нулем, а в конце мусор пусть остается.
     
  15. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    может я отстал от жизни, но большего бреда я давно не читал...
     
  16. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Да конечно, Вы правы, затыркался я что-то к вечеру... :)
    Исправил.
    Нужно писать не BYTE DWORD
    а
    WORD PTR

    А насчёт затереть Вы тоже правы - достаточно написать в конце всего 1 ноль. Программа при нахождении нуля считает это место концом строки, и дальше не смотрит.

    Напишите
    mov string+(смещение) , 0
     
  17. FireFox

    FireFox New Member

    Публикаций:
    0
    Регистрация:
    9 май 2008
    Сообщения:
    19
    Действительно, затыркался...Опять не так. WORD PTR нужно писать. Мы же два байта берем.
     
  18. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Да уж...
    Малёк вмазался... :)
    (Шутка)

    Я просто сейчас под пивом, ребята.
    Не ругайте меня очень... :)

    Пишем
    WORD PTR

    Теперь всё правильно...
     
  19. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    всем спасибо за помощь;)
     
  20. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49