|
|
| Посл.отвђт | Сообщен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 |