Sida 1 av 1
PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 13:58:10
av emilrowland
Hej jag undrar om någon här har koll på hur minnesaddreseringen sker på PIC18F2550 i program minnet när PC(Program Counter) Är ett negativt värde.
För när man använder kommandot BRA så verkar det som enligt
databladet för PIC18F2550 att PC kan få ett negativt värde, men vart pekar den då i program minnet?
Så här står det i databladet:
BRA n
-1024 <= n <= 1023
PC + 2 + 2n -> PC
Där 2n är tvåkomplements numret n.
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 14:23:37
av sodjan
Vilken sida/kapitel/stycke syftar du på?
PC kan aldrig vara negativ...
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 14:26:40
av emilrowland
Sidan 321 (märkt sidan 319) Vilket inehåller förklaringen på kommandot BRA.
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 14:46:47
av Castor
Rimligen menas att n kan vara positiv eller negativ, du kan alltså hoppa framåt eller bakåt, dvs öka eller minska PC.
Dock inom gränserna som anges även om minnet i sig är större.
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 14:50:34
av emilrowland
Castor skrev:Rimligen menas att n kan vara positiv eller negativ, du kan alltså hoppa framåt eller bakåt, dvs öka eller minska PC.
Dock inom gränserna som anges även om minnet i sig är större.
Så om PC skulle bli negativ så bör man sätta den till 0?
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 14:56:38
av sodjan
PC kan aldrig bli negativ (skrev jag inte det?).
Däremot kan den "slå över" och man bör väl programmera
så att det undviks. Varför är det ett problem? Vid en BRA
till en label i koden så kan det ju aldrig inträffa.
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 15:02:42
av Castor
Nu förutsätter jag vissa saker: Du skriver assembler och vill göra BRA (branch=hopp?) ? Då vill du fortsätta där rutinen XYZ finns, då räknar assemblern (när du kör den) ut skillnaden mellan nuvarande PC och adressen XYZ och lägger det som en offset (som kan vara positiv eller negativ) efter koden för BRA. När koden sedan exekveras adderas offseten till PC och PC ersätts med det nya värdet (hopp framåt eller bakåt) och programmet fortsätter därifrån.
Jag kör andra processorer än PIC så om detta är fel får någon PIC-guru rätta.
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 15:08:38
av sodjan
Korrekt. Men labeln du hoppar till kan ju inte ligga "under" koden
så att argumentet till BRA skulle kunna peka längre "tillbaka"
än vad det faktiskt finns tillgänglig kod. *All* kod ligger så klart
på positiva adresser.
Kanske bättre om Emil beskrivet ett faktiskt fall där detta är ett problem.
Rent tekniskt kan man ha en BRA på en låg adress med ett argument
som är större (och negativt) än den egna adressen. Detta skulle få
PC att "slå runt" till en hög adress. Sedan början den läsa instruktion
0x000, vilket av processorn tolkas som NOP och den stegar då bara
fram till adress "noll" och startar i princip om. Men detta är ju inget
som händer i praktiken...
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 15:19:01
av Castor
Nu hoppas vi att Emil lägger ihop all info och skriver ett fungerande program, eller analyserar ett befintligt och förstår vad som händer.
Re: PIC18F2550 Assembly kommando "BRA"
Postat: 23 april 2016, 15:26:54
av sodjan
Se också (samma datablad):
5.1 Program Memory Organization
PIC18 microcontrollers implement a 21-bit program
counter which is capable of addressing a 2-Mbyte
program memory space. Accessing a location between
the upper boundary of the physically implemented
memory and the 2-Mbyte address will return all ‘0’s (a
NOP instruction).