Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перевод ассемблерного кода на Делфи [D5, WinXP]


harisma ©   (2009-02-13 16:51:00) 

Господа! Пришлось столкнуться с такой проблемой:
Достался мне кусок кода программы, в котором часть методов написана на ассемблере.
Как мне перевести данное чудо на язык Дельфи?
Вот 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, в котором хранится битовое поле для цвета, размера и стиля фонта ячейки.

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


KSergey   (2009-02-16 10:52:00) [1]

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

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


Rouse_   (2009-02-16 10:30:00) [2]


> [6]

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


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

> [5]
     SHL     EDX,6
:)


Rouse_   (2009-02-13 18:16:00) [4]

AND     EDX,$1FC0


Rouse_   (2009-02-13 18:15:00) [5]

Ну или переведи на поддержку 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:09:00) [6]

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;


harisma   (2009-02-13 18:03:00) [7]

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


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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо