|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Цитата:
Здесь не JC @m2, a JNC @m2. А вообще - то буду разбираться и анализировать. Может что и пойму. Спасибо. |
#17
|
||||
|
||||
Для справки, сохранять нужно не только esi, но и edi, ebx. ebx в данном коде используется.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#18
|
||||
|
||||
Цитата:
ESI используется в lodsb (DS:SI -> Al (DS = SS - в данном случае)) А вот где используется EDI? (мне не понятно) EBX - я забыл сохранить, но ничего не произошло. (EBX - понятно - используется - я просто забыл) |
#19
|
||||
|
||||
Цитата:
Это было сказано просто для справки, о регистрах требующих обязательного сохранения при их использовании. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#20
|
||||
|
||||
Цитата:
Так EDI используется неявно или нет в этой ф-ии? Надо сохранять или нет? |
#21
|
||||
|
||||
edi не используется. Сейвить его не надо. Остальное - по стандарту, не надо. Однако поскольку стандарт fastcall (используемый, например, в делфе) каждый компилятор читает так, как ему хочется, то лучше сохранить все юзаемое, то есть esi, ebx.
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 12.03.2013 в 18:07. |
#22
|
||||
|
||||
Цитата:
|
#23
|
||||
|
||||
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 12.03.2013 в 19:06. |
#24
|
||||
|
||||
<Дубликат>
jmp $ ; Happy End! The Cake Is A Lie. |
#25
|
||||
|
||||
Цитата:
Я сам удивился, но это так. Вообще-то, я пользуюсь Lazarus (наверно он оличается от Delphi). В документации я не нашёл (как в Delphi), сведений о регистрах, подумал что как в Delphi. Но нет, есть отличия. Это я выявил экспериментально (немного помучавшись). А EBP не ссылается на этот фрэйм. Это тоже поставило в тупик, но "практика - критерий истины" ;-) (ещё выяснил DS = SS) Последний раз редактировалось vvvch, 12.03.2013 в 19:40. |
#26
|
||||
|
||||
И ещё, по поводу AQTime. Наверно хорошее средство, но я не уверен что его можно интегрировать с Lazarus. А другого у меня нет. Вернее я не знаю.
|
#27
|
||||
|
||||
Мда. С такими компиляторами глаз да глаз. Стандарты? Не, не слышал. Может они еще и результат функции передают в esp? На самом деле, ОЧЕНЬ странные ребята: использовать DATA REGISTER для базы стека, в то время как есть специально для этого сделанный BASE POINTER. Тогда имеет смысл и ecx сохранить, раз эти умники решили, что они выше всех стандартов. Или отказаться от лазаруса в пользу компиляторов от вменяемых разработчиков.
Вообще "выяснил экспериментально (немного помучавшись)" - как-то странно звучит. Достаточно дизассемблировать программу, найти функцию и узнать точно. Может такое поведение связано с какими-то по jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 12.03.2013 в 20:02. |
#28
|
||||
|
||||
Цитата:
Отказаться от 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; |
#29
|
||||
|
||||
То есть нормальный стековый фрейм на ebp.
jmp $ ; Happy End! The Cake Is A Lie. |
#30
|
||||
|
||||
Цитата:
Я действовал так: mov EAX, dword ptr len это равно mov EAX, dword ptr [EBX-4] //4байта - это смещение до len mov al, byte ptr [EBX] //buf[0] //mov al, byte ptr [buf] mov al, byte ptr [EBX+1] //buf[1] //mov al, byte ptr [buf+1] mov al, byte ptr [EBX+2] //buf[2] //mov al, byte ptr [buf+2] и т.д. Всё, я бльше не понимаю. :-( |