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

 WASM Phorum —› WASM.A&O —› Микроупражнение: шестнадцатиричные цифры

<< . 1 . 2 . 3 . 4 .

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


Дата: Июн 15, 2004 18:47:51

The Svin
лучший из подобных - Фог, причём на 99% это аппаратная оптимизация.

Здесь я имею в виду только "статьи по обезбранчиванию". По этой теме, имхо, достаточно Фог + мануалы производителей... Остальное - дело головы на плечах...

volodya
Гадкий ты.

Ну ладно... На самом деле я не умею программировать на ассемблере...


Дата: Июн 15, 2004 20:56:19

На самом деле я не умею программировать на ассемблере

Что ж. У каждого свои недостатки :)

Остальное - дело головы на плечах...

Не надо мне тут демагогию разводить! Демагогию разводить - это мое дело :) Свин, не слушайте всяких тут. Если вы мне турториал с алгоритмами напишете и пройдете от простого к сложному, поэтапно показывая как можно улучшить, то я за такое вам еще чего-нибудь достану вроде Уоррена :)


Дата: Июн 15, 2004 21:00:09

captain cobalt
Чушь, какое отношение обезбранчивание имеет к мануалам производителя и Фогу? У него на эту тему пара куцых примеров с мало кому интересными задачами.


Дата: Июл 9, 2004 19:34:16

Предлагаю новое упражнение:

Есть 16-ричное число в регистре ebx, требуется в регистр eax поместить маску, в которой единицы соответствуют тем разрядам в которых в ebx находятся Fы(или нули смотря что проще будет). Например: если ebx=1F03CF60h, то на выходе должно быть eax=0F000F00h.
Оптимизировать нужно в первую очередь по скорости, а потом по размеру. Регист ebx портить нельзя.


Дата: Июл 9, 2004 23:28:29

MMX наверно наиболее удобен в такой задаче.
Или предлогается ограничится целочисленным устройством?


Дата: Июл 10, 2004 00:42:57

Можно и для MMX, а пока у меня получается такой вариант:
  mov edx,ebx
  mov eax,ebx
  and edx,77777777h
  and eax,88888888h
  add edx,11111111h
  and eax,edx
  shr eax,3
  imul eax,15; или lea eax,[eax*3]/lea eax,[eax*5] лучше?

и зависимость между последними четырьмя командами мне совсем не нравится.


Дата: Июл 10, 2004 04:10:32

Накатал в дебагере. Можно уловить принцип и сократить.

Первые три команды просто для того чтобы загрузить
0F0F..0F в mm0. Они могут быть заменены одной 
movd mm0,mask 
где mask типа mask dd 0F0F0F0Fh
если mask не в кеше то следующие три команды будут быстрее.
Они также будут короче если mask адресовать через офсет.

 0F74C0         PCMPEQB MM0,MM0
 0F71D0 0C      PSRLW MM0,0C
 0F67C0         PACKUSWB MM0,MM0

;Тут преобразование
 0F6EC8         MOVD MM1,EBX ;данные из ebx
 0F6FD1         MOVQ MM2,MM1
 0FDBC8         PAND MM1,MM0
 0F73D2 04      PSRLQ MM2,4
 0FDBD0         PAND MM2,MM0
 0F74C8         PCMPEQB MM1,MM0
 0F74D0         PCMPEQB MM2,MM0
 0FDBC8         PAND MM1,MM0
 0FDBD0         PAND MM2,MM0
 0F73F2 04      PSLLQ MM2,4
 0FEBCA         POR MM1,MM2
 0F7EC9         MOVD EAX,MM1 ;результат в eax или куда нужно


Дата: Авг 9, 2004 11:57:59

С jCC-переходами
xor al,66h
test al,0F0h
jz found
test al,0Fh
jnz not_found
found:
Без переходов
xor al,66h
test al,0f0h
setz ah
and al,0fh
cmp al,1
adc ah,0 ; ZF=1 (zero) - значит нет

<< . 1 . 2 . 3 . 4 .


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