Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2020, 11:50   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию Ассемлеровские вставки, поясните что делает каждая строчка - расчет CRC на ассемблере

Добрый день! Нагуглил расчет CRC на ассемблере, подскажите, пожалуйста, что происходит в каждой строке после asm. Ну а так же, если не сложно, общий алгоритм вычисления

Код:
function GetCheckSum(FileName: string): DWORD;
var
  F: file of DWORD;
  P: Pointer;
  Fsize: DWORD;
  Buffer: array[0..500] of DWORD;
begin
  FileMode := 0;
  AssignFile(F, FileName);
  Reset(F);
  Seek(F, FileSize(F) div 2);
  Fsize := FileSize(F) - 1 - FilePos(F);
  if Fsize > 500 then
    Fsize := 500;
  BlockRead(F, Buffer, Fsize);
  Close(F);
  P := @Buffer;
  asm
     xor eax, eax
     xor ecx, ecx
     mov edi , p
     @again:
       add eax, [edi + 4*ecx]
       inc ecx
       cmp ecx, fsize
     jl @again
     mov @result, eax
  end;
end;
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 25.02.2020, 15:49   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Код:
Result:=0;
for i:=0 to fsize-1 do
  result:=result + buffer[i];
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 26.02.2020, 09:53   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

спасибо, но мне просто разобраться со вставками именно ассемлеровского кода, ради интересе, поэтому и создал тему в соответствующем разделе. Полагаю
Код:
  xor eax, eax
     xor ecx, ecx
обнулит регистр eax
далее в регистр edi помещается ссылка на объект типа Pointer...в общем мне нужно понять смысл работы данного кода. Помогите, пожалуйста
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 26.02.2020, 10:59   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Код:
P := @Buffer;
  asm
     xor eax, eax                       // быстрое обнуление регистра 
     xor ecx, ecx                       // быстрое обнуление регистра 
     mov edi , p                        // присваиваем регистру значение указателя 
     @again:                            // Метка 'повтор', знак собаки '@' означает что метка локальная 
       add eax, [edi + 4*ecx]           // сложение регистра со значением по адресу [edi + 4*ecx]
       inc ecx                          // Увеличиваем регистр на 1.  Он у нас в качестве счётчика для цикла
       cmp ecx, fsize                   // Сравниваем регистр со значением переменной fsize                 
     jl @again                          // Условный переход на 'повтор', если меньше то переходим к повтору, если равно или больше переходим к следующей команде
     mov @result, eax                   // Присваиваем переменной result значение регистра eax, здесь @ это ошибка, но компилятор её молча проглатывает. 
  end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 26.02.2020, 11:31   #5
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Отлично, спасибо) ТОгда не ясно какая разница между аsm вставками и тем кодом, который Вы выше привели, он что, будет быстрее работать? Как проверить?
Код:
Result:=0;
for i:=0 to fsize-1 do
  result:=result + buffer[i];
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 26.02.2020, 11:33   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Только это ничего общего с CRC не имеет. Банальная контрольная сумма.
https://ru.wikipedia.org/wiki/Циклич...избыточный_код
Вот один из вариантов на Делфи:
Код:
function GetModbusCRC16(const HexData: string): UInt16;
var
Buffer: Array of Byte; //TArray<Byte>;
b:TArray<Byte>;
CRC: UInt16;
Mask: UInt16;
I: Integer;
J: Integer;
begin
SetLength(Buffer, Length(HexData) div 2);
HexToBin(PChar(HexData), Buffer, Length(Buffer));
 
CRC := $FFFF;
for I := Low(Buffer) to High(Buffer) do
begin
CRC := CRC xor Buffer[i];
for J := 1 to 8 do
begin
Mask := 0;
if ((CRC / 2) <> (CRC div 2)) then
begin
Mask := $A001;
end;
CRC := (CRC div 2) and $7FFF;
CRC := CRC xor Mask;
end;
end;
Как видим, это далеко не 4 машинных команды. Правда, я сам считал CRC не так, предпочитаю табличный метод. Но тоже не 4 команды.

Последний раз редактировалось digitalis; 26.02.2020 в 11:37.
digitalis вне форума Ответить с цитированием
Старый 26.02.2020, 14:49   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
Отлично, спасибо) ТОгда не ясно какая разница между аsm вставками и тем кодом, который Вы выше привели, он что, будет быстрее работать? Как проверить?
Да нету там разницы.Скорее что-бы запутать. Хотели бы быстро заменили inc+cmp на dec.

Как проверить скорость? Да там проблем куча с проверкой.

Можно использовать RDTSC, уче6сть что частота процессора динамически изменяется а счётчик TSC нет. (Кроме Pentium3)
И да в 64 битных системах этот счётчик подменяет ОС. Так что лучше ещё 32 битную ОС без эмуляции. На крайней случай сгодится компилятор D7.

Код:
// Читаем счётчик тактов, отсчёт идёт от запуска процессорного ядра. На разных ядрах свои счётчики.
function RDTSC: Int64; register;
assembler;
asm
RDTSC
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Демонстрация фрактальной графики. Поле из одуванчиков. Напишите пожалуйста что выполняет каждая строчка и за что отвечает Viksa123 Паскаль, Turbo Pascal, PascalABC.NET 5 08.03.2015 10:47
Обьяснить код программи, что каждая строка делает NastyaV Фриланс 2 26.03.2011 17:04
написать что обозначает каждая строчка Ozzzy Помощь студентам 2 31.05.2010 13:13
Что делает эта строчка??? marselik Общие вопросы C/C++ 2 02.11.2009 13:54
Напишите пожалуйста за что отвечает каждая строчка Saaashka Помощь студентам 1 02.07.2008 08:34