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!? :shock:

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 8) ).

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