Всем привет Столкнулся с трудностью замены данных в строке. Есть две строки: 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 Подскажите пожалуйста как мне решить эту задачу. Заранее спасибо.
не вдаваясь в подробности Код (Text): lea edi, string lea esi, string2 mov eax, [esi] ; 'abc,0 mov [edi], eax mov esi, edi mov eax, [esi+6] mov [edi+4], eax mov ax, [esi+10] mov [edi+8], ax Можно и проще...
Вы уточните немного... в буфере string вот это ХХХХХ - всегда будет именно 5 символов? и после знака равенства вот это 12345 - всегда именно 5 символов? Или могут быть разные варианты? Тогда можно и выбирать - копировать, или искать побайтно символ 3Dh (знак равенства)
Xerx, код у тебя не совсем верный. С индексами неполадки. Исправленный вариант: Код (Text): lea edi, string lea esi, string2 mov eax, [esi] ; 'abc,0 mov [edi], eax mov esi, edi mov eax, [esi+5] mov [edi+3], eax mov eax, [esi+9] mov [edi+7], eax Касательно этого примера, имхо, проще не использовать, а за'rep'ить. Код (Text): ;34 байта. Подумаешь, на 6 байт длинее. ;) lea esi, string + 2 mov eax, dword ptr[string2] mov [esi], eax lea edi, string xor ecx, ecx mov cl, 5 rep movsw mov cl, '=' lea eax, string + 3 mov byte ptr [eax], cl
Тут главное усвоить сам процесс работы со строками, потом уже полегче. Давай помаленьку: Смотри: 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 и далее таким же методом как я кратенько показал... И потом нужно затереть конец буфера от остатков... Просто замени там всё нулями...
Хм, нет такого типа. "WORD PTR" нужно писать. Проще скопировать вместе с "родным" нулем, а в конце мусор пусть остается.
Да конечно, Вы правы, затыркался я что-то к вечеру... Исправил. Нужно писать не BYTE DWORD а WORD PTR А насчёт затереть Вы тоже правы - достаточно написать в конце всего 1 ноль. Программа при нахождении нуля считает это место концом строки, и дальше не смотрит. Напишите mov string+(смещение) , 0
Да уж... Малёк вмазался... (Шутка) Я просто сейчас под пивом, ребята. Не ругайте меня очень... Пишем WORD PTR Теперь всё правильно...