AVR Assembler handledning 5 (3 / 8 steg)
Steg 3: SREG analys och bitvis logik
Som ni minns (från sidan 11 i databladet) AVR statusregistret, heter SREG, lagrar information om vad som pågår i processorn. Vad vi ska göra i det här steget är enkelt analysera registret och se vad finns där och hur det förändras när vi utför några tester.
Det första testet vi vill utföra är enkel. Låt oss testa noll flaggan, som är lite 1 av SREG
viktigaste:
LDI temp, 1
CPI temp, 1
i r20, SREG
rcall analysera
rjmp huvudsakliga
Först vi laddade nummer 1 i temp, så vi "jämfört med" vad är i temp med nummer 1. Minns vad "KEI" gör egentligen. Om du tar en titt på den instruktion set sammanfattande tabell ser du att KPI faktiskt subtraherar två tal och om resultatet är noll det definierar noll flaggan i SREG. Så om noll-flaggan är angiven efter denna anvisning då vet vi är de två killarna lika. Vi sedan kopiera SREG till r20 och analysera innehållet i r20. Så kör ovanstående program och du bör hitta att bitars nummer 1 (dvs LED nummer ett) tänds betecknar att noll flagg SREG är inställd. Stor! Nu titta igen på den instruktion sammanfattningsraden för "KEI". I kolumnen "flaggor" visas att denna instruktion faktiskt handlar om ett gäng flaggorna i SREG. Det står "Z, N, V, C, H" och tittar på sidan 11 vi se dessa är noll flagg, flaggan negativa, de två komplimang overflow flagga, bära flaggan och hälften bär sjunker.
Låt oss se om vi kan vända på några fler flaggor. Låt oss prova detta:
viktigaste:
LDI temp, 1
CPI temp, 2
i r20, SREG
rcall analysera
rjmp huvudsakliga
Detta är samma som sist endast denna tid cpi bör subract 2 från 1. Vi har 1-2 = - 1 och så vi borde inte få noll flagg, men vi får negativ flagg, nu prova det.
Wow. Vi fick en massa flaggor. Vi fick C, N, S och H. På sidan 11 bredvid bit 0, bära flaggan, står det indikerar ett bär i en arthmetic eller logik operation. Sedan står det att vända sig till instruktionen Ange beskrivningen för detaljer. Så låt oss göra det. Om du öppnar upp instruktionsuppsättningar manualen som jag föreslog att du hämtar i den sista läraren
På sidan 63 i instruktionen ange manuell diskuterar det KPI anvisningen. Låt oss ta en titt på vad den säger. Det berättar att operationen utförs är faktiskt subtraktion. Den listar sedan flaggorna och beräkningen utförs för att avgöra vilka flaggor för att ställa. Under "C", eller bära flaggan, det står att den är inställd om det absoluta värdet på K (som är 2 i vårt fall) är större än det absolue värdet av Rd, som är R20 i vårt fall och lika med 1. Eftersom 2 är större än 1, bör bära flaggan fastställas--vilket är precis vad vi hittade. Vad sägs om allt som matematisk ekvation grejer de har där? Vad betyder det? Låt oss göra beräkningen. Här är en sammanfattning av hur bitvis operationer görs http://en.wikipedia.org/wiki/Bitwise_operation vi har inte symbolerna att skriva det precis på samma sätt, så kommer vi att använda en * betecknar en prick (vilket betyder "logiskt och"), och en understrykning, betecknar en overline, här är ekvationen de ger intill flaggan bär:
C: Rd7 * K7 + K7 * R7 + R7 * Rd7
I vårt fall är Rd R20 som har nummer 1 i den. Detta innebär ñ20 = 0b00000001. Även i vårt fall K = 2 vilket innebär att K = 0b00000010. "R" betyder också "Resultatet". Så i vårt fall är resultatet av att subtrahera 2 från 1 -1.
Vad är "-1" i binär? Väl är här där det blir intressant. Om du ta en titt på Wikipedias sida här: http://en.wikipedia.org/wiki/Signed_number_repres... hittar du en diskussion om olika sätt att representera negativa tal i binär. Det finns tre huvudsakliga möjligheter. Först, kanske bit 7 betecknar tecknet? Det skulle innebära att -1 = 0b10000001 en annan möjlighet som kallas "en komplimang" vilket innebär att negationen av ett tal är bara komplimangen av detta nummer. Så i så fall -1 = 0b11111110. Den tredje möjligheten är "två komplimangen" representation. I två komplimang finns negationen av ett nummer av Invertera alla bitar och sedan lägga till 1 till resultatet. Så -1 skulle vara 0b11111110 + 1 = 0b11111111.
Så hur vi lista ut vilken som atmega328p använder? Väl vi kan hitta det i databladet, men istället, låt oss behandla det som en detektiv mysterium och räkna ut "experimentellt", det vill säga genom att utföra beräkningar för varje flagga i SREG och se vilken representation ger svaret har vi tänt på våra bakbord analyzer.
Här är vad vi har för ovanstående ekvation för flaggan bär: Rd7 är 0 eftersom den 7: e biten i R20 är noll i vårt fall och K7 är en 0 också sedan den 7: e biten av K är en nolla. R7 innebär den 7: e lite av "resultatet" och i vårt fall, resultatet av 1-2 -1. Så är våra tre posibilities:
-1 = 0b10000001 (registrera bitarsrepresentation)
-1 = 0b11111110 (en komplimang framställning)
-1 = 0b11111111 (två komplimang framställning)
Så låt oss prova det med var:
En overline betyder "komplimang" vilket innebär att du ändrar alla 0 till 1 och alla 1's till nollor. Således Rd = 0b11111110 och därmed Rd7 = 1. K7 = 0, och R7 är en 1 i alla tre representationer! Så är här vad vi har:
C: 1 * 0 + 0 * 1 + 1 * 1
Det sätt som * eller "Och" fungerar är om båda är 1 får du en 1, annars får du en 0. Så i vårt fall har vi
C: 0 + 0 + 1 = 1
Så är våra resultat för "Bär" flaggan 1. Därför bör den C stycke i SREG på. Vilket är vad vi hittade.
Dock bär flaggan beräkningen gav alla tre representationer av negativa tal samma resultat sedan R7 är en 1 i alla tre fallen. Så låt oss titta på de andra som. Vad sägs om H? Dess säger att H är flaggan "hälften bär" och det säger att det är en 1 om vi "låna från bit 3". Hur vi räkna ut? Instruktionsuppsättning manuell ger följande beräkning:
H: Rd3* K3 + K3 * R3 + R3 *Rd3
I vårt fall har vi Rd3 = 1, K3 = 0, men R3 är 0 i den första framställningen, och en 1 i de andra två. Om vi använder tecken bitarsrepresentation får vi:
H: 1 * 0 + 0 * 0 + 0 * 1 = 0
Men våra bakbord säger bör man ON! Atmega328p är därför inte använda "teckenbiten" representation. Låt oss prova de andra två där båda säger R3 = 1. Sedan ger vår beräkning:
H: 1 * 0 + 0 * 1 + 1 * 1 = 1
Bra! Så vi vet att det måste vara en av de två representationerna. Låt oss försöka N flagg. Beräkningen säger att det är en 1 om MSB (mest betydande lite, dvs bit 7) i resultatet är inställd och 0 annars. I alla tre anmärkningar den mest signifikanta biten är en 1 resultatet är väl -1. Så N = 1 och denna flagga kommer inte att hjälpa oss. Så vi vänder bredvid har S-flaggan som är den sista vi har som lyste upp en LED i våra analyzer. Detta kallas "teckenbiten" och beräkningen är en stege upp "exklusiva eller" som är vad på plustecknet med en cirkel runt den betyder. En "exklusiv eller", eller XOR, betyder att om båda bitar är en 1 du får 0, om båda bitar är 0 du få 0, men om en av dem är en 1 och den andra är en 0 får du en 1 som svar. Med andra ord om först "eller" andra är en 1 men inte båda. Beräkningen är:
S: N XOR V
och i vårt fall N = 1 (sedan bit 2-lampan är tänd) och V = 0 (sedan bit 3-lampan inte lyser) därav svaret är 1 XOR 0 = 1. Vilket innebär att alla tre representationer S-flaggan kommer att vara på.
Så vi har fortfarande inte beslutat experimentellt om atmega328p använder "en komplimang" eller "två komplimang" att representera negativa tal! Så låt oss titta på en annan bit från SREG. Låt oss försöka V lite. Som kallas "två komplimang overflow lite" vilket slags berättar vad vårt svar kommer att vara inte det? Nåja, låt oss fortsätta att försöka kontrollera det. Beräkningen är:
V: Rd7 *K7*R7 + Rd7* K7 * R7
Vi har Rd7 = 0, K7 = 1, R7 = 1 och R7 = 0 i både en och två komplimang. Denna flagga kommer därför också inte att skilja mellan två. Här är vad vi får:
V: 0 * 1 * 0 + 1 * 0 * 1 = 0
Det finns endast en flagga vänster i SREG som vi kan testa! Noll flagga Z. Våra LED säga att denna flagga är avstängd. Beräkningen är
Z: R7*R6*R5*R4*R3*R2*R1*R0
Detta är en serie och åtgärder. Det innebär att Z = 1 om alla bitar i R 1 och noll annars. Men det innebär att alla bitar i R måste vara 0 (eftersom det är komplimang R har alla 1). Vi har
R = -1 = 0b11111110 (en komplimang framställning)
R =-1 = 0b11111111 (två komplimang framställning)
Så i "en komplimang" skulle vi få Z = 0 och i "två komplimang" får vi också Z = 0.
Jo det suger. Vi har testat dem alla och vi fortfarande inte har visat vilken binär representation av negativa tal atmega328p använder. Dock har vi kontrollerat att våra LED ger oss en noggrann läsning av SREG registret.
Och låt oss avsluta det här en gång för alla. W vet att antalet-127 i varje framställning ges av
0b10000000 =-127 (ett komplement)
0b10000001 =-127 (två komplement)
Så är samma negativa nummer lika med ett annat binära nummer i varje representation. Så ett enkelt experiment kommer att avgöra!
viktigaste:
LDI r20,-127
rcall analysera
rjmp huvudsakliga
Där har du det! Testa det själv. Som binär representation är i r20 när du analyserar detta på brädan? Nu vet du svaret.
Detta steg var inte bara för att visa dig hur att testa innehållet i register, men också att visa dig hur man kan förstå hur flaggorna i SREG, att förstå hur man beräknar bitvis logiska operationer i binär och därför att förstå hur man läser instruktionen Ange. Alla operationer i instruktionsuppsättningen har en "operation" att den fungerar som visas i kolumnen åtgärd i tabellen Sammanfattning. Du vet nu hur dessa beräknas och varför de och avmarkera olika flaggor i SREG. Du vet också nu som binär representation av negativa tal Atmega328p använder.
Övning 1: ni kommer ihåg när vi diskuterade TCNT0 timer/counter och använt det tidigare två tutorials fanns det olika bitar som behövs för att ställas in för att göra timern och avbrotten göra vad vi ville ha dem till. Göra en snabb kontroll med våra analyzer och se vad är för närvarande i TCCR0A, TCCR0B, TIFR0 och TIMSK register (inte Glöm att TIMSK0 inte är i registret utdataintervallet så du måste använda ett dyrare kommando än "in" att ladda dess innehåll i ett register!)