12.03.2013, 20:26
|
|
Прохожий
|
|
Регистрация: 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;
|