Пишу, по большей части, про историю, свою жизнь и немного про программирование.

sgn(x) на ассемблере

Давненько я не брал в руки ассемблер. Лет так 8, наверное (речь идёт об ассемблере под 80x86, это, кстати, 3-й ассемблер, который я учил). Всякие там MMX и SSE уже и не знаю, о программировании на ассемблере в защищённом режиме — тоже, но остальное сидит крепко. У Анатолия Воробья в журнале увидел интересный код — самая быстрая реализация функции знака на ассемблере 80x86:

cwd
neg ax
adc dx, dx

Вот объяснение как это работает:

Здесь начальный аргумент лежит в ax, значение помещается в dx. Работает следующим образом: сначала cwd расширяет знак ax в dx, после чего в dx лежит -1, если аргумент отрицательный, а иначе 0. neg ax меняет знак ax, но это на самом деле неважно, а важно то, что эта инструкция помещает в флаг carry единицу, только если аргумент был ненулевой.

Наконец adc dx, dx складывает dx с самим собой, добавляет carry от второй инструкции, и помещает результат в dx. В результате выходит:

— если ax<0, то dx вначале -1, carry равен 1, результат равен -1*2+1 = -1 (во как!) — если аx=0, то dx вначале 0, carry равен 0, результат 0*2+0=0 — если ax>0, то dx вначале 0, carry равен 1, результат 0*2+1=1

1 комментарий
alk.moikrug.ru 2008

Ты хочешь сказать, что книгу Уоррена «Алгоритмические трюки для программистов» (Hacker’s delight в оригинале) ты не читал?