kv75
18:40 28-01-2004 Целочисленное логарифмирование
Сегодня до 3 часов дня лежал в постели, потом почувствовал себя лучше.
Встал за компьютер, поработал. Но кроме работы, ещё написал первую в своей жизни функцию на интеловском ассемблере (в смысле, на ассемблере для процессоров Интел).

Я давно хотел написать функцию целочисленного логарифмирования (логарифмическое преобразование 32-битного беззнакового целого в 8-битное беззнаковое целое). После проб и ошибок всё-таки получилось. Разумеется, использовал я тот ассемблер, что встроен в Дельфи.
Теперь надо попробовать интегрировать эту функцию в BorlandC++ 3, ведь смысл этой функции в том, чтобы из-под ДОСа в режиме он-лайн строить графики в логарифмическом масштабе.
Проблема в том, что на языке высокого уровня такое написать (эффективно написать) вроде нельзя, ибо аналога команды BSR в этих языках нет.
Комментарии:
kv75
17:26 29-01-2004
Извиняюсь за тривиальный код (его ещё можно улучшать), но вдруг кому-то пригодится.
function LogInt(Value: Integer): Integer;
asm
  PUSH ECX
  PUSH EDX
  BSR EDX, EAX
  JZ @L1
  MOV ECX, 31
  SUB ECX, EDX
  SHL EAX, CL
  SHR EAX, 23
  AND EAX, 255
  LEA EAX, @TABLE1[EAX*4]
  MOV EAX, [EAX]
  SHL EDX, 3
  ADD EAX, EDX
  ADD EAX, 1
  JMP @L2
@TABLE1:
  DD  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
  DD  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  DD  2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  DD  3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  DD  4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
  DD  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
  DD  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7
  DD  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
@L1:
  XOR EAX, EAX
@L2:
  POP EDX
  POP ECX
end;