Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
15-1258467927
kyn66
2009-11-17 17:25
2010.01.31
О битовой математике


15-1259343501
xayam
2009-11-27 20:38
2010.01.31
SSH-клиент с автоматический входом


15-1259076739
Rule
2009-11-24 18:32
2010.01.31
У кого есть инвайт в habrahabr.ru поделитесь. И плюс оцените


2-1260172706
uniken1
2009-12-07 10:58
2010.01.31
RichEdit и RTF с картинками


1-1234886728
Drowsy
2009-02-17 19:05
2010.01.31
DLL BCB из Дельфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский