Показать сообщение отдельно
  #28  
Старый 12.03.2013, 20:26
Аватар для vvvch
vvvch vvvch вне форума
Прохожий
 
Регистрация: 28.03.2012
Адрес: г.Боровичи, Новг. обл.
Сообщения: 19
Версия Delphi: Lazarus
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Мда. С такими компиляторами глаз да глаз. Стандарты? Не, не слышал. Может они еще и результат функции передают в esp? На самом деле, ОЧЕНЬ странные ребята: использовать DATA REGISTER для базы стека, в то время как есть специально для этого сделанный BASE POINTER. Тогда имеет смысл и ecx сохранить, раз эти умники решили, что они выше всех стандартов. Или отказаться от лазаруса в пользу компиляторов от вменяемых разработчиков.
Вообще "выяснил экспериментально (немного помучавшись)" - как-то странно звучит. Достаточно дизассемблировать программу, найти функцию и узнать точно. Может такое поведение связано с какими-то потусторонними эффектами, а стековый фрейм-таки в ebp?

Отказаться от Lazarus конечно можно, но Delphi стоит много денюжек. Кроме того, я думаю что потом будут претензии со стороны Embercadero, стоит написать что - либо стоящее (правда до этого пока далеко). А Lazarus официально бесплатный.

И ещё, я не смог в этом разобраться. Предупреждаю ато стандарт AT&T там чередование источник->приёмник наоборот в сравнении Intel. И регистры рачинаются с %. Короче смотрите:
Код:
function TfCalcCRC.CalcCRC(var buf : array of byte; const len : integer) : word;
  // CRC = $CB72   $0924
type
  TWord = record
    lo, hi  : byte
  end;
var
  i : integer;
  j : byte;
const
  CRC_st = $FFFF;
  CRC_1  = $A001;
begin
  //ucalccrc.pas:75                   begin
  //00424C00 55                       push   %ebp
  //00424C01 89e5                     mov    %esp,%ebp
  //00424C03 83ec18                   sub    $0x18,%esp
  //00424C06 8945f4                   mov    %eax,-0xc(%ebp)
  //00424C09 8955fc                   mov    %edx,-0x4(%ebp)
  //00424C0C 894df8                   mov    %ecx,-0x8(%ebp)
  //ucalccrc.pas:77                   Result := CRC_st;
  //00424C0F 66c745f0ffff             movw   $0xffff,-0x10(%ebp)
  //ucalccrc.pas:78                   for i := 0 to len - 1 do
  //00424C15 8b4508                   mov    0x8(%ebp),%eax
  //00424C18 48                       dec    %eax
  //00424C19 c745ec00000000           movl   $0x0,-0x14(%ebp)
  //00424C20 3b45ec                   cmp    -0x14(%ebp),%eax
  //00424C23 7c50                     jl     0x424c75 <TFCALCCRC__CALCCRC+117>
  //00424C25 ff4dec                   decl   -0x14(%ebp)
  //00424C28 ff45ec                   incl   -0x14(%ebp)
  //ucalccrc.pas:80                   TWord(Result).lo := TWord(Result).lo xor Buf[i];
  //00424C2B 8b4dfc                   mov    -0x4(%ebp),%ecx
  //00424C2E 8b55ec                   mov    -0x14(%ebp),%edx
  //00424C31 8a1411                   mov    (%ecx,%edx,1),%dl
  //00424C34 8a4df0                   mov    -0x10(%ebp),%cl
  //00424C37 30ca                     xor    %cl,%dl
  //00424C39 8855f0                   mov    %dl,-0x10(%ebp)
  //ucalccrc.pas:81                   for j := 0 to 7 do
  //00424C3C c645e800                 movb   $0x0,-0x18(%ebp)
  //00424C40 fe4de8                   decb   -0x18(%ebp)
  //00424C43 90                       nop
  //00424C44 fe45e8                   incb   -0x18(%ebp)
  //ucalccrc.pas:82                   if boolean(Result and 1) then
  //00424C47 668b55f0                 mov    -0x10(%ebp),%dx
  //00424C4B 6681e20100               and    $0x1,%dx
  //00424C50 84d2                     test   %dl,%dl
  //00424C52 7412                     je     0x424c66 <TFCALCCRC__CALCCRC+102>
  //ucalccrc.pas:83                   Result := (Result shr 1) xor CRC_1
  //00424C54 0fb755f0                 movzwl -0x10(%ebp),%edx
  //00424C58 d1ea                     shr    %edx
  //00424C5A 81f201a00000             xor    $0xa001,%edx
  //00424C60 668955f0                 mov    %dx,-0x10(%ebp)
  //00424C64 eb04                     jmp    0x424c6a <TFCALCCRC__CALCCRC+106>
  //ucalccrc.pas:85                   Result := Result shr 1;
  //00424C66 66d16df0                 shrw   -0x10(%ebp)
  //00424C6A 807de807                 cmpb   $0x7,-0x18(%ebp)
  //00424C6E 72d4                     jb     0x424c44 <TFCALCCRC__CALCCRC+68>
  //00424C70 3b45ec                   cmp    -0x14(%ebp),%eax
  //00424C73 7fb3                     jg     0x424c28 <TFCALCCRC__CALCCRC+40>
  //ucalccrc.pas:87                   end;
  //00424C75 668b45f0                 mov    -0x10(%ebp),%ax
  //00424C79 c9                       leave
  //00424C7A c20400                   ret    $0x4

  Result := CRC_st;
  for i := 0 to len - 1 do
  begin
    TWord(Result).lo := TWord(Result).lo xor Buf[i];
    for j := 0 to 7 do
      if boolean(Result and 1) then
        Result := (Result shr 1) xor CRC_1
      else
        Result := Result shr 1;
  end;
end;
Ответить с цитированием