· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.A&O —› Циклические счетчики

Посл.отвђт Сообщенiе


Дата: Сен 15, 2003 11:21:39 · Поправил: masquer

Не совсем уверен в правильности назвния темы :)
В общем бывает иногда нужно иметь такую схему - на вход поступает число, которое должно изменяться в пределах одного диапазона (как правило 0...Х), и при достижении одной границы переходить на другую границу. Простейший вариант - двухдиапазонный переключатель:
xor eax, 1

Попытался накидать универсальное решение с прокруткой в обе стороны:
	mov eax,  A; initial value
	mov edx, X+1 ; upper limit value + 1
	mov ecx, -1 ; forward = -1 backward = 1
@@:	sub eax, ecx
	mov edi, eax
	add edi, 1
	sbb ebx, ebx
	add edi, edx
	and edi, ebx
	add eax, edi
	mov edi, eax
	sub edi, 1
	sbb ebx, ebx
	not ebx
	and eax, ebx
	mov edi, eax 
	sub edi, edx
	sbb ebx, ebx
	and eax, ebx
	cmp eax, X
	jz @F
	; 1 cycle takes 11 clocks
	; here we can process the value calculated before
	jmp @B
@@:

на asmcommunity была давненько похожая тема, но давно было - найти не смог. Весь код мой, а аглицкие комменты из-за паталогической лени ;)
Вместо eax лучше, конечно, использовать другой регистр, из тех, которые предохраняются.
Может у кого есть свои наработки в этой области?


Дата: Сен 15, 2003 12:46:05

А чем лучше "add edi, 1", чем "inc edi" (и "sub edi, 1", чем "dec edi")


Дата: Сен 15, 2003 12:51:03

В выставлении Carry Flag.


Дата: Сен 15, 2003 13:02:11 · Поправил: Fixer

В приведенном куске отсутствует проверка на входе на принадлежность входной величины заданному диапозону (скажем если A>X и шаг -1)


Дата: Сен 15, 2003 13:11:29

Да, есть такое, это можно предварительно проверить. В моем случае в этом не было необходимости.


Дата: Сен 15, 2003 15:02:07

Вероятно самый компактный алгоритм
    mov   eax, A ; initial value
    mov   ebx, X+1 ; upper limit value + 1
    mov   ecx, step

    sub   eax, ecx
_beg_loop:
    add   eax, ecx
    xor   edx, edx
    add   eax, ebx
    div   ebx
    mov   eax, edx
;
    jmp   _beg_loop


Дата: Сен 15, 2003 18:25:30

inc eax
cmp eax,X+1
sbb ebx,ebx
and eax,ebx

dec eax
sbb ebx,ebx
and ebx,X+1
add eax,ebx


Дата: Сен 15, 2003 18:51:45

Black_mirror

Для реверсивного цикла (я как понимаю) нужно поставить после dec - cmp (как для прямого)


Дата: Сен 16, 2003 03:58:41

Fixer
Это я сглючил, нужно ставить sub eax,1

Можно еще сделать совсем универсальный вариант:
eax - start
ecx - delta
eax изменяется от left до right при условии что ecx<=right-left

add eax,ecx
cmp eax,left
sbb ecx,ecx
and ecx,right-left+1
add eax,ecx
cmp eax,right+1
sbb ecx,ecx
and ecx,right-left+1
lea eax,[eax+ecx-(right-left+1)]


Дата: Сен 25, 2003 06:00:47

В рассылку закрался неправильный вариант! Правильно должно быть так:
sub eax,1;а не dec eax
sbb ebx,ebx
and ebx,X+1
add eax,ebx


Дата: Сен 25, 2003 11:36:03

Black_mirror
Понял.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.079