· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Как улучшить?

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


Дата: Сен 26, 2003 18:19:56

На форуме dore.ru, какой-то чел
просит помочь, с решением такой задачи:
"Определить кол-во едениц в диапазоне между 5 и 14
разрядами в слове"
Я вот набросал решение, но думаю его можно значитьльно
улучшить, кто поможет?...
...
...
      xor esi,esi
      mov ax,1100100101010101b
;             \________/
;             14       5

      mov cx,14      ; начнем с "14" бита
_scan:
      bt ax,cx
      jnc _bin_set_0
      inc esi	     ; в SI будет число бит равных "1"
_bin_set_0:
      dec cx
      cmp cx,4
      jne _scan
...
...


Дата: Сен 26, 2003 18:51:09 · Поправил: masquer

Можно и так.
xor ebx, ebx
	mov eax, 1100100101010101b
	mov ecx, 14-4
	shr eax, 5
@@:	adc ebx,0
	dec ecx
	rcr eax, 1
	jns @B
А оптимизировать надо по размеру или скорости? Да, количество единичек в ebx


Дата: Сен 26, 2003 18:54:07

masquer
Да по баробану, скучно мне вот и пытаюсь
себя чем нибудь развлеч...


Дата: Сен 26, 2003 18:55:59

KiNDeR
ОГО???
Нифига себе СЧАСТЛИВЫЙ %))))))))))))


Дата: Сен 26, 2003 18:58:06

Edmond
Ну что я поделаю, если вдохновение меня покинуло.
Вот и хватаюсь за разные задачи... :))
(правда не всегда удачно...:))))


Дата: Сен 26, 2003 19:16:03

	mov ax,12345	;4
        mov ebx,7fe0h	;5
	xor esi,esi	;2
	dec esi		;1
    .l0:
	inc esi		;1
	and ebx,eax	;2
	lea eax,[ebx-1]	;3
	jnz .l0		;2

PS: А слово обязательно сохранять?


Дата: Сен 26, 2003 20:38:47

Да, долго как-то получается...

Ничего, даст Господь, разбогатеем,
купим себе по Итаниуму и будем считать
биты одной инструкцией:

.data
MyData: data8 1100100101010101b

...

.text
movl r5=MyData;;
ld8 r1=[r5];; // Число в r1
addl r2=0x3ff0,r0;; // sext imm22 маску в r2
and r3=r1,r2;; //
popcnt r4=r3;; // в r4 - число бит!
//Да здравствует Ытаниум!


Дата: Сен 27, 2003 00:52:29

Вот еще вариант:
 mov ax,1100100101010101b
 xor bx,bx
 and ax,7fe0h
loop:
 rcr ax,1
 adc bl,bh
 or ax,ax
 jnz loop

результат в bl
итого 16 байт, 7 тактов (просто подсчитаны такты выполнения команд)


Дата: Ноя 6, 2003 13:21:04

2 Johnikum - я взял и улучшил твой код на целый байт :), но у тебя ошибка - rcr вращает биты по кругу, ах будет равен нулю только если имеется 1 ненулевой бит :) или все биты нулевые - нужен shl (shr не берем, потому что нулевых битов справа больше (4 штуки) против 1 нулевого бита слева - цикл закончится быстрее). Вместо or reg,reg лучше применять test reg,reg - при этом процессор не тратит время на запись ax в ax (см. оптимизация :) получилось:
mov ax,1100100101010101b
and ax,7fe0h
cwd ;15bit ax=0, dx=0
loop:
shl ax,1
adc dl,dh
test ax,ax
jnz loop
результат в dl/dx

но позалипав еще полчасика(как сохранить флаг нуля, чтобы не юзать Test ax,ax), убрал еще байт:
mov ax,1100100101010101b
and ax,7fe0h
cwd ;15bit ax=0, dx=0
loop:
shl ax,1
jnc no_inc_count ; если CF=1 идем проверять на ax=0? :)
inc dx ; после inc ZF=0 будет всегда в нашем случае
no_inc_count:
jnz loop

если подумать... хз, может еще можно уменьшить :)


Дата: Ноя 6, 2003 22:46:26

MrAssembler
но у тебя ошибка - rcr вращает биты по кругу, ах будет равен нулю только если имеется 1 ненулевой бит
Ошибки не будет!!!
1. Команда AND ax,7FE0h обнуляет флаг CF
2. Команда ADC bl,bh, тоже не вызовет переноса, так что и здесь CF=0 ;-)


Дата: Ноя 10, 2003 13:17:31

я сам заметил, уже послав сообщение. :)


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