Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

переделка с asm на Delphi :(   Найти похожие ветки 

 
TALLA ©   (2004-04-25 23:15) [0]

Попался мне в руководстве на прибор вот такой код:
<code asm>
Assembler для микроконтроллера МК51
       mov     CRCl, #0FFh    ;\ 1.CRC:=FFFFH
       mov     CRCh, #0FFh    ;/
CRC_r:  
       mov     DPTR,#P_prb    ;\
       movX    A,@DPTR        ; |
       mov     B,A            ; |
       inc     DPTR           ; | читаем из буфера приема один байт
       movX    A,@DPTR        ; | и записываем его в ARG1
       mov     DPH,A          ; |
       mov     DPL,B          ; |
       movX    A, @DPTR       ; |
       mov     ARG1, A        ;/
       inc     DPTR           ;\
       mov     B,DPH          ; |
       mov     A,DPL          ; |
       mov     DPTR, #P_prb   ; | Указатель буфера приема + 1
       movX    @DPTR,A        ; |
       inc     DPTR           ; |
       mov     A,B            ; |
       movX    @DPTR,A        ;/

       mov     A, ARG1        ;\ 2.Исключающее ИЛИ байта запроса и CRCl
       xrl     A, CRCl        ;/
       mov     CRCl, A
       mov     M00,#8
$Loop:  clr     c              ;\
       mov     A, CRCh        ; |
       rrc     A              ; |
       mov     CRCh, A        ; | 3.Сдвиг CRC вправо на 1 бит
       mov     A, CRCl        ; | 4.Если 0 бит CRC = 1, то
       rrc     A              ; |     a) исключающее ИЛИ A001h и CRC
       mov     CRCl, A        ; |     b) переход на пункт 3
       jnc     $1             ; |   Если 0 бит CRC = 0, то пункт 3
       xrl     CRCl, #001h    ; | 5.Сдвиг производим 8 раз.
       xrl     CRCh, #0A0h    ; |
$1:     djnz    M00,$Loop      ;/
       
       mov     A,RAB          ;\
       clr     C              ; |                                
       subb    A, #1          ; |
       mov     RAB, A         ; | количество оставшихся байт минус 1
       mov     A,RAB+1        ; |
       subb    A, #0          ; |
       mov     RAB+1, A       ;/
       jnz     CRC_r          ;\  6.Далее следующий байт запроса и
       mov     A, RAB         ; |   переход на пункт 2.
       jnz     CRC_r          ;/
</code asm>
я переписал его на Delphi:

procedure CRC16(len:integer;var l,h:byte);
Var CRCl,CRCh:byte; i,j:integer;
begin
CRCl:=$FF;
CRCh:=$FF;
For i:=0 to len-1 do begin
 CRCl:=Buffer[i] xor CRCl;
 For j:=1 to 8 do begin
  asm
   ror CRCl,1;
   ror CRCh,1;
  end;
  if (CRCl and 1)=1 then begin
   CRCl:=CRCl xor 1;
   CRCh:=CRCh xor $A0;
  end;
 end;
end;
l:=CRCl;
h:=CRCh;
end;

Однако результаты работы различны, может кто знает, в чем именно проблема?


 
Германн ©   (2004-04-25 23:39) [1]

При беглом взгляде заметно, что порядок сдвига CRC нарушен. Кроме того нет обнуления флага переноса перед сдвигом. А так может и еще что есть. :-(


 
TALLA ©   (2004-04-26 00:00) [2]

>что порядок сдвига CRC нарушен
то есть
  ror CRCl,1;
  ror CRCh,1;
нужно поменять местами?

Какой командой выполняется обнуление флага переноса?
Что-то типа:
pushf
pop ax
and ax,??
push ax
popf


 
Германн ©   (2004-04-26 00:06) [3]

1. Да
2. CLC


 
TALLA ©   (2004-04-26 00:25) [4]

1 и 2 не помогли:(
пример для теста:

Const n=8;
begin
FillChar(Buffer,256,0);
buffer[0]:=1;
buffer[1]:=3;
buffer[2]:=$40; //&#228;&#224;&#242;&#247;&#232;&#234; 1
buffer[3]:=$43;
buffer[4]:=0;
buffer[5]:=2;
// buffer[6]:=$20;//CRClo должно быть
// buffer[7]:=$1F;//CRChi должно быть
CRC16(n-2,Buffer[n-2],Buffer[n-1]);
Caption:=IntToStr(Buffer[n-2])+" - "+IntToStr(Buffer[n-1]);
end;

у меня получается CRClo=0 и CRChi=30.


 
Германн ©   (2004-04-26 01:05) [5]

Движемся дальше.
JNC в обоих аcсемблерах имеет один и тот же смысл и одинаковое написание, но:
if (CRCl and 1)=1 then begin - это не проверка флага переноса, а проверка младшего бита CRCl.


 
Германн ©   (2004-04-26 01:54) [6]

А, понял. Тебя смутил комментарий в строках:

      mov     A, CRCl        ; | 4.Если 0 бит CRC = 1, то
      rrc     A              ; |     a) исключающее ИЛИ A001h и CRC
      mov     CRCl, A        ; |     b) переход на пункт 3
      jnc     $1             ; |   Если 0 бит CRC = 0, то пункт 3


Тот, кто писАл этот комментарий забыл указать, что имеет в виду значение 0-го бита CRC16 до сдвига!


 
TALLA ©   (2004-04-26 02:11) [7]

>Германн
Спасибо, я случайно нашел на этом сайте процедурку, ее результаты то, что надо:) :
procedure CRC16(Len : Word; var l,h:byte);
Var i, j, CRC : Word;
Begin
{$R-}
CRC:= $FFFF;
For i:= 0 to Len-1 do begin
CRC:= (CRC and $FF00) + (Buffer[i] xor Lo(CRC));
For j:= 1 to 8 do begin
 If ((CRC and $0001) <> 0) then
  CRC:= (CRC shr 1) xor $A001
 Else
  CRC:= (CRC shr 1);
End;
End;
{$R+}
l:=lo(CRC);
h:=hi(CRC);
End;


 
Talla2k ©   (2004-04-26 02:12) [8]

А где ты такой код откопал???(это я про MCS51)
У MCS51 минимальный набор регистров,но M00,CRCl,RAB и прочих ТАМ нет и никогда не было.
Дай нормальный код,что-бы можно было на симуляторе запустить и тогда я быстро...


 
Talla2k ©   (2004-04-26 02:27) [9]

2 TALLA ©
Заметь,у нас НИКИ почти одинаковые. :))
З.Ы. Почти братья...


 
Германн ©   (2004-04-26 02:49) [10]

Рад за вас обоих(обеих). :-)



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
3-1079449168
ikondakov
2004-03-16 17:59
2004.04.11
Как в PARADOX удалить записи по определённой маске?


14-1079713798
Chcnger
2004-03-19 19:29
2004.04.11
задача


3-1079458469
Igor G
2004-03-16 20:34
2004.04.11
ВDE в дистрибутив


14-1081935442
Отто
2004-04-14 13:37
2004.04.11
Как программно включить компьютер?


3-1079522419
Rams
2004-03-17 14:20
2004.04.11
Редактирование набора полученного через запрос , выдает ошибку