![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перевод ассемблерного кода на Делфи [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]
> Как мне перевести данное чудо на язык Дельфи?
Нужно ради интереса, или ассемблерный код работает неправильно?