Sida 1 av 3
Gämföra lösen i ASM
Postat: 2 juli 2007, 21:21:24
av squiz3r
Hej, jag håller på att bygga ett kodlås av en PIC16F877A men jag vet inte riktigt hur jag ska göra. Jag tänkte göra så att jag har 4st variabler (4 siffers kod) som det läggs ett tal mellan 0 och 9 i. Sen ska den gämföra med en inproggramerad kod om det är samma, men hur??
Mvh. Daniel Andersson
Postat: 2 juli 2007, 21:24:25
av Jeppsson
Subtrahera varje siffra och kolla om det blir noll! Carry flag
Postat: 2 juli 2007, 21:30:13
av bengt-re
Öhhh.. XOR och kolla Z- flaggan är väl ändå bättre

Men ähh, finns många sätt att göra det på, men grunden är att göra något med dina jämförelsevärden och sedan kolla Z, C eller så. Likssom grunden till att göra något med en pic då det inte finns så många "fancy" instruktioner.
Postat: 2 juli 2007, 21:31:55
av squiz3r
Någon som har lust att förklara lite hur XOR funkar?? Jag har inte förstått det trots att jag har läst på många ställen

(Inte så bra på ENG).
//Daniel A
Postat: 2 juli 2007, 21:35:21
av bengt-re
1 XOR 1 =0
0 XOR 1=1
1 XOR 0=1
0 XOR 0=0
Detta gör XOR bra för att jämnföra saker: Är alla bitar lika så blir svaret 0. XOR sker altså bitvis:
00110010
XOR
11110000
=
11000010
Är ŕu mé ?
Postat: 2 juli 2007, 21:41:47
av Jeppsson
Självklart menar jag Zero flag och inte Carry!?

Postat: 2 juli 2007, 21:42:19
av squiz3r
Tack! Jag fattar

Men jag tror att jag väljer första alternativet.
Om jag skriver
(var1-4 är rätt kod, var5-8 är inknappad kod)
Kod: Markera allt
movfw var5
subwf var1, destination1
movfw var6
subwf var2, destination2
movfw var7
subwf var3, destination3
movfw var8
subwf var4, destination4
Sen måste jag kolla om alla är 0, hur gör man det på lättaste sättet?
Jeppson: Misstänkte det
//Daniel A
Postat: 2 juli 2007, 21:46:46
av Jeppsson
Med
BTFSC Bit Test f, Skip if Clear
eller
BTFSS Bit Test f, Skip if Set
Läs i databladet!
Postat: 2 juli 2007, 21:51:39
av squiz3r
Den biten förstår jag, men är det lättaste att ta det i "steg" eller kan man ta alla i samma vända?
Exempel på stegvis koll:
Kod: Markera allt
BTFSS destination1
call lab1
bcf korekt_kod
return
lab1
BTFSS destination2
call lab2
bcf korekt_kod
return
lab2
BTFSS destination3
call lab3
bcf korekt_kod
return
lab3
BTFSS destination4
call lab4
bcf korekt_kod
return
lab4
bsf korekt_kod
return
Edit: Det funkar inte.. Det är ju inte bara en bit.. Destinationen av den andra uträckningen blir ju en hel byte.. Om man tar "movfw" och kollar zero flag borde det gå!?
Mvh. Daniel Anderson
Postat: 2 juli 2007, 22:16:05
av squiz3r
Denna koden borde räcka??
Kod: Markera allt
check_code
;-- var1-4 = Rätt kod
;-- var5-8 = inknappad kod
;********
movfw var5
subwf var1, destination1
movfw var6
subwf var2, destination2
movfw var7
subwf var3, destination3
movfw var8
subwf var4, destination4
movfw destination1
btfsc STATUS, Z
call lab1
bcf correct_code
return
lab1
movfw destination2
btfsc STATUS, Z
call lab2
bcf correct_code
return
lab2
movfw destination3
btfsc STATUS, Z
call lab3
bcf correct_code
return
lab3
movfw destination4
btfsc STATUS, Z
call lab4
bcf correct_code
return
lab4
bsf correct_code
return
Postat: 2 juli 2007, 22:16:08
av Micke_s
Eftersom det är mellan 0 och 9 så kan du göra detta.
En bonus med detta är att en timingattack är svår att utföra.
Kod: Markera allt
//c-kod, men lätt att fixa i asm
function test(){
sum = 0;
sum = sum + (input0 xor code0);
sum = sum + (input1 xor code1);
sum = sum + (input2 xor code2);
sum = sum + (input3 xor code3);
if(sum == 0){
return true;
}else{
return false;
}
}
Edit: rättade koden lite
Postat: 2 juli 2007, 22:16:29
av TomasL
Så här kanske
Kod: Markera allt
movfw var5
subwf var1
BTFSS STATUS, Z
BRA FELKOD
movfw var6
subwf var2
BTFSS STATUS, Z ; Testa om Z är satt
BRA FELKOD ; Om nej, fel siffra hoppa till "FEL KOD"
movfw var7
subwf var3
BTFSS STATUS, Z
BRA FELKOD
movfw var8
subwf var4
BTFSS STATUS, Z
BRA FELKOD
Nu vet jag inte om syntaxen stämmer med din ASM.
Postat: 2 juli 2007, 22:23:46
av squiz3r
Tack alla!
TommasL: Varför tänkte jag inte på det?!?! Det är ju ungefär samma som jag gör bara det att jag gör det onödigt långt och krångligt

Tack!
//Daniel A
Postat: 2 juli 2007, 23:01:23
av sodjan
Sen behöver du inte kolla att alla, det räcker med att kolla
tills en är fel (då behöver du inte kolla resten)...
Men 4 XOR som summeras blir inte mycket kod heller...
Postat: 3 juli 2007, 10:33:16
av squiz3r
Jag har modifierat koden lite nu (hoppas att jag inte har förstört den

).
Om koden är rätt kommer "correct_code" flaggan vara satt annars är den nollad.
Kod: Markera allt
test_code
;-- var1-4 = Rätt kod
;-- var5-8 = inknappad kod
;********
bsf correct_code
movfw var5
subwf var1
BTFSS STATUS, Z
bcf correct_code
movfw var6
subwf var2
BTFSS STATUS, Z ; Testa om Z är satt
bcf correct_code ; Om nej, fel siffra skriv en nolla till "correct_code"
movfw var7
subwf var3
BTFSS STATUS, Z
bcf correct_code
movfw var8
subwf var4
BTFSS STATUS, Z
bcf correct_code
return
Tack för all hjälp alla!
Mvh. Daniel Andersson