Восемь лет спустя
kv75
дневник заведен 05-10-2003
постоянные читатели [82]
закладки:
цитатник:
дневник:
местожительство:
Москва, Россия
интересы [13]
шахматы, грибы, Пратчетт, Иваси, Morrowind, Guild Wars
[1] 08-05-2008 07:37
Альпы

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

Я давно хотел написать функцию целочисленного логарифмирования (логарифмическое преобразование 32-битного беззнакового целого в 8-битное беззнаковое целое). После проб и ошибок всё-таки получилось. Разумеется, использовал я тот ассемблер, что встроен в Дельфи.
Теперь надо попробовать интегрировать эту функцию в BorlandC++ 3, ведь смысл этой функции в том, чтобы из-под ДОСа в режиме он-лайн строить графики в логарифмическом масштабе.
Проблема в том, что на языке высокого уровня такое написать (эффективно написать) вроде нельзя, ибо аналога команды BSR в этих языках нет.
Комментарии:
29-01-2004 17:26
грандмастер свалкограф
Извиняюсь за тривиальный код (его ещё можно улучшать), но вдруг кому-то пригодится.
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;

Ваш комментарий:
Камрад:
Гость []
Комментарий:
[смайлики сайта]
Дополнительно:
Автоматическое распознавание URL
Не преобразовывать смайлики
Cкрыть комментарий
Закрыть