Главная страница
    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.043 c
14-1082459041
Dmitrij_K
2004-04-20 15:04
2004.05.09
Оконный глюк


9-1071308489
SliderCrash
2003-12-13 12:41
2004.05.09
Как взять палитру из загружаемого bmp (8bit)?


9-1068290513
cyborg
2003-11-08 14:21
2004.05.09
Создание игры для начинающих


8-1076286432
Maratus
2004-02-09 03:27
2004.05.09
Прорисовка двигающегося выделения как в графических пакетах


1-1082720979
WebErr
2004-04-23 15:49
2004.05.09
Father for Basic form





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский