Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.31;
Скачать: CL | DM;

Вниз

Перевод ассемблерного кода на Делфи   Найти похожие ветки 

 
harisma ©   (2009-02-13 16:51) [0]

Господа! Пришлось столкнуться с такой проблемой:
Достался мне кусок кода программы, в котором часть методов написана на ассемблере.
Как мне перевести данное чудо на язык Дельфи?
Вот 2 метода, которые надо переписать (в коде их гораздо больше, но я прошу только 2 перевести для примера - остальные я сделаю сам по представленому образцу):

function  CF_GetFontSize(var CF: TCellFormat): Integer;
asm
       MOV     AX,[EAX].TCellFormat.FontColorSizeStyle
       SHR     AX,6
       AND     EAX,$7F
end;

procedure CF_SetFontSize(var CF: TCellFormat; Value: Integer);
asm
       AND     [EAX].TCellFormat.FontColorSizeStyle, $E03F
       SHL     DX,6
       AND     DX,$1FC0
       OR      [EAX].TCellFormat.FontColorSizeStyle, DX
end;


где FontColorSizeStyle - поле типа integer, в котором хранится битовое поле для цвета, размера и стиля фонта ячейки.

Буду премного благодарен.


 
Amoeba ©   (2009-02-13 18:00) [1]


> Как мне перевести данное чудо на язык Дельфи?

Нужно ради интереса, или ассемблерный код работает неправильно?


 
harisma ©   (2009-02-13 18:03) [2]

У меня изменился тип поля FontColorSizeStyle. Был Word - стал Integer. А с Integer данный ассемблерный код не работает.


 
Rouse_ ©   (2009-02-13 18:09) [3]

function  CF_GetFontSize(var CF: TCellFormat): Integer;
begin
 Result := (CF.FontColorSizeStyle shr 6) and $7F;
end;

procedure CF_SetFontSize(var CF: TCellFormat; Value: Integer);
begin
 CF.FontColorSizeStyle :=
   (CF.FontColorSizeStyle and $E03F) or ((Value shl 6) and $1FC0);
end;


 
Rouse_ ©   (2009-02-13 18:15) [4]

Ну или переведи на поддержку Integer

function  CF_GetFontSize(var CF: TCellFormat): Integer;
asm
      MOV     EAX,[EAX].TCellFormat.FontColorSizeStyle
      SHR     EAX,6
      AND     EAX,$7F
end;

procedure CF_SetFontSize(var CF: TCellFormat; Value: Integer);
asm
      AND     [EAX].TCellFormat.FontColorSizeStyle, $E03F
      SHL     DX,6
      AND     DX,$1FC0
      OR      [EAX].TCellFormat.FontColorSizeStyle, EDX
end;


 
Rouse_ ©   (2009-02-13 18:16) [5]

AND     EDX,$1FC0


 
Asteroid   (2009-02-15 19:00) [6]

> [5]
     SHL     EDX,6
:)


 
Rouse_ ©   (2009-02-16 10:30) [7]


> [6]

Не нужно, т.к. AND все равно затирает все, кроме значения в регистре DX :)


 
KSergey ©   (2009-02-16 10:52) [8]

сорри за флейм, но мне интересно: аффтар сего хотел выпендриться или видел офигенную оптимизацию?

А топикстартеру я бы посоветовал на таком примере не бояться расширить кругозор за счет работодателя, раз ему повезло встретиься с кодом, написанным более продвинутым молодцем. Это всегда хорошо и полезно, чес. слово, по себе знаю :)



Страницы: 1 вся ветка

Текущий архив: 2010.01.31;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
15-1259271016
Юрий
2009-11-27 00:30
2010.01.31
С днем рождения ! 27 ноября 2009 пятница


15-1259530217
Юрий
2009-11-30 00:30
2010.01.31
С днем рождения ! 30 ноября 2009 понедельник


8-1201820831
cerber
2008-02-01 02:07
2010.01.31
"програмно" нажать ссылку в флеш анимации.


2-1259847059
Anastasia
2009-12-03 16:30
2010.01.31
Как передать значение функции и получить результат?


2-1260206153
Aleks
2009-12-07 20:15
2010.01.31
Текст кодировка