Gämföra lösen i ASM

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Gämföra lösen i ASM

Inlägg 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
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Subtrahera varje siffra och kolla om det blir noll! Carry flag
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg 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é ?
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Självklart menar jag Zero flag och inte Carry!? :shock:
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Med

BTFSC Bit Test f, Skip if Clear
eller
BTFSS Bit Test f, Skip if Set

Läs i databladet!
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg 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
Senast redigerad av Micke_s 2 juli 2007, 22:16:38, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47017
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
Skriv svar