Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 22:11   #1
Fataller
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 62
По умолчанию Функция замены символов в строке.

Необходимо функцию strset(s,c), которая заменяет символы в строке S на символ С написать на ассемблере )) среда - фрипаскаль )) я написал функцию, но проблема в том, что она меняет на какой то левый символ, из левой области памяти. Почему - для меня загадка. Требуется помощь
Код:
function StrSet(Str: PChar; Chr: Char): PChar; assembler;
asm
        CLD
	MOV     EDI,Str
        MOV     EDX,EDI
        MOV	CX,0FFFFH
        XOR     AX, AX
@@1:    SCASB
        JE  @@2
        SUB     EDI,1
        MOV     AL,Chr
        STOSB
        XOR     AX,AX
        LOOP @@1
@@2:    MOV     EAX,EDX
end;
var
s,s1:pchar;
c:char;
begin
        s:='abcc';
        s1:='';
        c:='j';
        s1:=StrSet(s,с);
        writeln(s1);
        readln;
end.
Fataller вне форума Ответить с цитированием
Старый 22.01.2010, 22:40   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Может упростить немного.
Код:
mov edi,[str]
xor ebx,ebx
mov al,[chr]

@@1:
cmp [edi],bl
je @@2

stosb
jmp @@1

@@2:
mov eax,[str]
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 22.01.2010, 22:53   #3
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Исходя из кода - прога должна висеть.
SUB EDI,1 - зачем уменьшение на единицу?

Goodwin98, забыл cld вначале

Последний раз редактировалось Д'якон; 22.01.2010 в 22:56.
Д'якон вне форума Ответить с цитированием
Старый 22.01.2010, 22:57   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
SUB EDI,1 - зачем уменьшение на единицу?
Отвечу за автора.
После SCASB, edi увеличивается, а SUB EDI,1 возвращает его обратно для STOSB, который тоже увеличивает edi.

Цитата:
Goodwin98, забыл cld вначале
Как-то привылось у меня, что направление идет всегда прямо...
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 22.01.2010 в 23:00.
Goodwin98 вне форума Ответить с цитированием
Старый 22.01.2010, 23:04   #5
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

в delphi вышибает на stosb почему не очень ясно
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 22.01.2010, 23:08   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
в delphi вышибает на stosb почему не очень ясно
А что под отладчиком видно ?
Там строка, что находится в s:='abcc';, разве не считается константной ?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 22.01.2010 в 23:16.
Goodwin98 вне форума Ответить с цитированием
Старый 23.01.2010, 00:08   #7
Fataller
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 62
По умолчанию

У меня не получается адресоваться к Char как к [Char] - ошибка выводится
16 bit references not supported ((( нужно именно во фрипаскале это все сделать. И вот еще проблема. Пишу еще одну функцию, которая в strpbrk(s1,s2), которая в строке s1 ищет вхождение любого символа из s2 и возвращает указатель на этот символ в s1, т.е. strpbrk('abcd','pc') возвратит 'сd'. Так вот, функцию я вроде написал с горем пополам, но такая фишка - когда я текст функции просто копирую в основную программу, то она работает исправно, а если я ее вызываю как функцию, то ничего не выдает! Почему? Подскажите пожалуйста, очень нужно. Текст ниже
Код:
function StrPbRk(Str,Str2: PChar): PChar; assembler;
asm
        CLD
        MOV CX, 000Ah
        MOV EDI, Str2
        MOV ESI, Str
        XOR AX,AX
@@1:    LODSB
        MOV EDI, Str2
        MOV DX, CX
@@4:    SCASB
        JE @@2
        LOOP @@4
        MOV CX,DX
        LOOP @@1
@@2:    DEC ESI
        MOV EAX, ESI
end;
label l1,l2,l3,l4;
var
s,s1,s2:pchar;
begin
        s:='dace';
        s2:='ba';
        s1:='';
        s1:=StrPbRk(s,s2);
 {     asm
        CLD
        MOV CX, 000Ah
        MOV EDI, s2
        MOV ESI, s
        XOR AX,AX
l1:    LODSB
        MOV EDI, s2
        MOV DX, CX
l4:    SCASB
        JE l2
        LOOP l4
        MOV CX,DX
        LOOP l1
l2:    DEC ESI
        MOV EAX, ESI
        MOV s1,EAX
end;}
        writeln(s1);
        readln;
end.
Fataller вне форума Ответить с цитированием
Старый 23.01.2010, 10:14   #8
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
А что под отладчиком видно ?
Там строка, что находится в s:='abcc';, разве не считается константной ?
да похоже так и есть
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление символов в строке makc101 Помощь студентам 1 09.12.2009 23:01
замена символов в строке euhenia Помощь студентам 3 30.11.2009 20:59
функция для подсчета количества символов в строке типа std::string a Артэс Общие вопросы C/C++ 3 06.07.2009 17:43
Создайте приложение для замены символов текста (VBA) riviera Помощь студентам 1 01.06.2009 22:35
Количество символов в строке Ivan357 Паскаль, Turbo Pascal, PascalABC.NET 0 09.12.2008 17:06