Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

переделка с 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;

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


 
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 нарушен. Кроме того нет обнуления флага переноса перед сдвигом. А так может и еще что есть. :-(


 
Германн ©   (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


 
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


 
Германн ©   (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.


 
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: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 до сдвига!


 
Германн ©   (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;


 
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:12) [8]

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


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

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


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

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


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

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


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

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



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

Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.054 c
1-1082482837
Yegorchic
2004-04-20 21:40
2004.05.09
Goto


3-1081933782
nv_
2004-04-14 13:09
2004.05.09
Поиск в подстановочном поле


14-1082365331
АлексейК
2004-04-19 13:02
2004.05.09
Вот и верь теперь своим глазам.


3-1081669851
ppcat
2004-04-11 11:50
2004.05.09
Проект, базы данных


1-1082027236
$tranger
2004-04-15 15:07
2004.05.09
Закладка "SERVICES"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский