:: Visual Foxpro, Foxpro for DOS
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Если уж быть до конца точным, то надо обрабатывать оба случая: когда длина исходной строки не кратна 4, т.е. cmp esi,ebp
ja _Exit сработает раньше, чем мы выберем хвостовые байты. И когда длина результирующей строки не кратна 4, т.е. в ebx останется "хвост", не сброшенный в буфер.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
spinz
Ну, убедиться же недолго, хотя это и из логики очевидно
Не знаю кому и что очевидно, но я не единожды проверял.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Ну так и я проверял - если строка начинается с пробела, а дальше идут непробельные символы, то пробел не обрезается
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Кстати, от ведущего пробела можно избавиться простым добавлением перед циклом инструкции mov ah,1
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вообще-то логика функции "схлопнуть дублирующиеся пробелы" не предполагает удаления ведущего и хвостового пробелов, если они одиночные... Конечно можно и так сделать - т.е. совместить её с ALLTRIM-ом, но это уже вопрос "постановки задачи"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Функа с удалением ведущих и хвостовых пробелов и корректной, вроде бы, обработкой "хвостов", когда длины строк не кратны 4.
use32
start:
push ebp
mov ebp, esp
push edi
push esi
push eax
push ebx
push ecx
push edx
push ebp
rdtsc
push edx
push eax
mov esi,[ebp+08h]
mov al, 20h
mov edi,[ebp+10h]
mov ecx,[ebp+14h]
mov ecx,[ecx]
mov ebp,esi
add ebp,ecx
sub ebp,4
xor ecx,ecx
mov ah,1
_1Label_0:
mov edx,[esi]
cmp al,dl
jnz _1Label_1
cmp ah,1
jz _2Label_0
inc ah
jmp _1Label_2
_1Label_1:
xor ah,ah
_1Label_2:
shrd ebx,edx,8
inc ecx
cmp ecx,4
jnz _2Label_0
xor ecx,ecx
mov [edi],ebx
add edi,4
_2Label_0:
shr edx,8
cmp al,dl
jnz _2Label_1
cmp ah,1
jz _3Label_0
inc ah
jmp _2Label_2
_2Label_1:
xor ah,ah
_2Label_2:
shrd ebx,edx,8
inc ecx
cmp ecx,4
jnz _3Label_0
xor ecx,ecx
mov [edi],ebx
add edi,4
_3Label_0:
shr edx,8
cmp al,dl
jnz _3Label_1
cmp ah,1
jz _4Label_0
inc ah
jmp _3Label_2
_3Label_1:
xor ah,ah
_3Label_2:
shrd ebx,edx,8
inc ecx
cmp ecx,4
jnz _4Label_0
xor ecx,ecx
mov [edi],ebx
add edi,4
_4Label_0:
shr edx,8
cmp al,dl
jnz _4Label_1
cmp ah,1
jz _4Label_3
inc ah
jmp _4Label_2
_4Label_1:
xor ah,ah
_4Label_2:
shrd ebx,edx,8
inc ecx
cmp ecx,4
jnz _4Label_3
xor ecx,ecx
mov [edi],ebx
add edi,4
_4Label_3:
add esi,4
cmp esi,ebp
jbe _1Label_0
_Exit:
push eax
xor ch,ch
add ebp,4
sub ebp,esi
push ebx
push ecx
jbe _Exit_1
;обработка хвоста исходной строки
xor ecx,ecx
inc ch ;есть хвост
_5Label_4:
mov dl,[esi]
cmp al,dl
jnz _5Label_1
cmp ah,1
jz _5Label_3
inc ah
jmp _5Label_2
_5Label_1:
xor ah,ah
_5Label_2:
shrd ebx,edx,8
inc ecx
_5Label_3:
inc esi
dec ebp
jnz _5Label_4
;сохранение в буфер необработанного в цикле остатка в ebx
_Exit_1:
pop edx
cmp edx,0
pop eax
jz _Exit_4
_Exit_2:
push ecx
mov cl,4
sub cl,dl
shl ecx,3
shr eax,cl
_Exit_3:
mov [edi],al
inc edi
shr eax,8
dec edx
jnz _Exit_3
pop ecx
_Exit_4:
;сохранение в буфер хвоста
cmp ch,1
jnz _Exit_7
_Exit_5:
mov edx,ecx
xor dh,dh
mov cl,4
sub cl,dl
shl ecx,3
shr ebx,cl
_Exit_6:
mov [edi],bl
inc edi
shr ebx,8
dec edx
jnz _Exit_6
_Exit_7:
pop eax
cmp [edi-1],al
jnz _Exit_8
mov byte [edi-1],0
_Exit_8:
rdtsc
pop edi
sub eax,edi
pop esi
sbb edx,esi
pop ebp
mov edi,[ebp+0Ch]
mov [edi],eax
mov esi,[ebp+14h]
mov [esi],edx
pop edx
pop ecx
pop ebx
pop eax
pop esi
pop edi
mov esp, ebp
pop ebp
ret 0010h

Фоксовый код приводить не буду, лень набивать))
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
OFFTOP

"В руках" medstraxa команда mov почему-то ассоциируется с фрикциями.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
а команда pop?
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Таки да.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
spinz
а команда pop?
без push бессмысленна...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
ну почему же

mov [esp], что то там твердое
pop
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Что же ты собрался "вынимать", если до того ничего не "вложил"? Впрочем, знатокам виднее


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
И все-таки, Леонид был почти прав, когда говорил, что его код очень быстрый.

Если пересылку байтов делать не через стек, а через регистр, т.е. заменить
push dword [esi]
pop dword [edi]

на

mov dl,[esi]
mov [edi],dl

то его код выигрывает у моего в случая 1,5,6 и 8. В остальных мой код быстрей.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Надо попробовать запилить код на MMX/XMM регистрах. За счет уменьшения чтения/записи должен получиться неплохой выигрыш. Правда уверенности в этом нет, т.к. работа с ними требует больше телодвижений, чем с регистрами общего назначения, что может свести к нулю выигрыш.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
_vit

Сообщений: 5175
Дата регистрации: 29.07.2002
spinz
не, для сравнения ассемблерной реализации рулит RDTSC

Пожалуй да если проц одноядерный и система не с вытесняющей многозадачностью.

Почему не RDTSCP ?

Как насчет сериализации выполнения команд?
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
_vit

Сообщений: 5175
Дата регистрации: 29.07.2002
Вот тут хорошо в одном месте все и о проблемах с RDTSC на разных процах и о методологии измерения.

www.slideshare.net
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Ну так RDTSCP все же относительно новая инструкция, поэтому закладываться на ее наличие я бы не стал - старого железа кругом навалом.

Плюс по моим наблюдениям фокс и CallWindowProc исполняются постоянно на одном ядре.

Вот начет сериализации вопрос не понял.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016

Дальше пятой страницы читать не стал.

Человек, у которого каша в голове из-за непонимания хотя бы состояний ACPI и как они коррелируют с работой процессора, ничего дельного не напишет
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Igor Korolyov
spinz
а команда pop?
без push бессмысленна...

Я весьма часто использовал такую конструкцию:

M1:
dd 0
...
call M2
M2:
pop eax
mov ebx, [eax-M2+M1]

Здесь как раз pop без push.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Ну это стандарт же, получить текущий EIP
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 32 (Гостей: 32)

© 2000-2024 Fox Club 
Яндекс.Метрика