Форум: "Основная";
Текущий архив: 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; //äàò÷èê 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; //äàò÷èê 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.035 c