Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

Цитата:
Сообщение от Bargest
Я бы делал как-то так:
Код:
   push esi
   mov  bx, CRC_st  //bX - Result
   mov  ecx, len
   mov  esi, buf
   cld
@loop1:
   lodsb
   xor  bl, al
   mov edx, 8 //цикл 8 раз
@loop2:
     shr bx, 1
     jc @m2
     xor bx, CRC_1
  @m2:
     dec edx
     jnz    @loop2
   dec ecx
   Jnz    @loop1 
   mov ax, bx
   pop esi

Здесь не JC @m2, a JNC @m2. А вообще - то буду разбираться и анализировать. Может что и пойму. Спасибо.
Ответить с цитированием
  #17  
Старый 12.03.2013, 01:05
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Для справки, сохранять нужно не только esi, но и edi, ebx. ebx в данном коде используется.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #18  
Старый 12.03.2013, 01:41
Аватар для vvvch
vvvch vvvch вне форума
Прохожий
 
Регистрация: 28.03.2012
Адрес: г.Боровичи, Новг. обл.
Сообщения: 19
Версия Delphi: Lazarus
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Для справки, сохранять нужно не только esi, но и edi, ebx. ebx в данном коде используется.

ESI используется в lodsb (DS:SI -> Al (DS = SS - в данном случае))
А вот где используется EDI? (мне не понятно)
EBX - я забыл сохранить, но ничего не произошло. (EBX - понятно - используется - я просто забыл)
Ответить с цитированием
  #19  
Старый 12.03.2013, 02:34
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
EBX - я забыл сохранить, но ничего не произошло
Повезло.

Это было сказано просто для справки, о регистрах требующих обязательного сохранения при их использовании.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #20  
Старый 12.03.2013, 17:31
Аватар для vvvch
vvvch vvvch вне форума
Прохожий
 
Регистрация: 28.03.2012
Адрес: г.Боровичи, Новг. обл.
Сообщения: 19
Версия Delphi: Lazarus
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Это было сказано просто для справки, о регистрах требующих обязательного сохранения при их использовании.

Так EDI используется неявно или нет в этой ф-ии? Надо сохранять или нет?
Ответить с цитированием
  #21  
Старый 12.03.2013, 17:55
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

edi не используется. Сейвить его не надо. Остальное - по стандарту, не надо. Однако поскольку стандарт fastcall (используемый, например, в делфе) каждый компилятор читает так, как ему хочется, то лучше сохранить все юзаемое, то есть esi, ebx.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

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

Цитата:
Сообщение от Bargest
edi не используется. Сейвить его не надо. Остальное - по стандарту, не надо. Однако поскольку стандарт fastcall (используемый, например, в делфе) каждый компилятор читает так, как ему хочется, то лучше сохранить все юзаемое, то есть esi, ebx.
Спасибо, так и сохранаю все коме EAX ECX EDX (но EDX имеет ссылку на стэк, вернее данные в стэке). По этому его нужно либо не менять, либо сначала вытащить данные, потом менять (можно и через PUSH POP, но я не делал). Если изменить EDX, то ссылки вроде MOV EAX, len не сработает.
Ответить с цитированием
  #23  
Старый 12.03.2013, 19:02
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
но EDX имеет ссылку на стэк, вернее данные в стэке
С каких пор? Стековый фрейм делается от ebp или esp. EDX есть Регистр Общего Назначения (РОН, GPR), он же - регистр Dанных. При чем тут стек? Тем более, что в модели fastcall (которая юзается в делфи) параметры (если их меньше или равно трем) вообще передаются через eax, edx, ecx (то есть тут работы со стеком нет в принципе).
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 12.03.2013 в 19:06.
Ответить с цитированием
  #24  
Старый 12.03.2013, 19:05
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

<Дубликат>
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #25  
Старый 12.03.2013, 19:35
Аватар для vvvch
vvvch vvvch вне форума
Прохожий
 
Регистрация: 28.03.2012
Адрес: г.Боровичи, Новг. обл.
Сообщения: 19
Версия Delphi: Lazarus
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
С каких пор? Стековый фрейм делается от ebp или esp. EDX есть Регистр Общего Назначения (РОН, GPR), он же - регистр Dанных. При чем тут стек? Тем более, что в модели fastcall (которая юзается в делфи) параметры (если их меньше или равно трем) вообще передаются через eax, edx, ecx (то есть тут работы со стеком нет в принципе).

Я сам удивился, но это так. Вообще-то, я пользуюсь Lazarus (наверно он оличается от Delphi). В документации я не нашёл (как в Delphi), сведений о регистрах, подумал что как в Delphi. Но нет, есть отличия. Это я выявил экспериментально (немного помучавшись). А EBP не ссылается на этот фрэйм. Это тоже поставило в тупик, но "практика - критерий истины" ;-) (ещё выяснил DS = SS)

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

И ещё, по поводу AQTime. Наверно хорошее средство, но я не уверен что его можно интегрировать с Lazarus. А другого у меня нет. Вернее я не знаю.
Ответить с цитированием
  #27  
Старый 12.03.2013, 19:59
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

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

Последний раз редактировалось Bargest, 12.03.2013 в 20:02.
Ответить с цитированием
  #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;
Ответить с цитированием
  #29  
Старый 12.03.2013, 20:56
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

То есть нормальный стековый фрейм на ebp.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #30  
Старый 12.03.2013, 21:30
Аватар для vvvch
vvvch vvvch вне форума
Прохожий
 
Регистрация: 28.03.2012
Адрес: г.Боровичи, Новг. обл.
Сообщения: 19
Версия Delphi: Lazarus
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
То есть нормальный стековый фрейм на ebp.
Ну может фрейм и нормальный. (я в этом не очень большой специалист, т.е. не имею опыта и много чего еще. Многое для меня непонятно) Но добраться до данных с помощью EBP, у меня не получилось. А вот с с EBX - сразу. Кроме того я изменил EBX и всё, сразу "связь" пропала.

Я действовал так:
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]
и т.д.
Всё, я бльше не понимаю. :-(
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter