Sida 1 av 2

Fråga om AvrStudio

Postat: 26 juli 2007, 22:19:37
av Chribbe76
Med Pic (MPLAB) kan man tex skriva BNZ $ +4 för att hoppa över nästa instruktion med lämplig branch.

Hur gör man detta i AvrStudio?
BRNE $ +4 fungerar inte.

Postat: 26 juli 2007, 23:15:11
av sodjan
Bara en liten detalj...

MPLAB och AVR Studio är två *utvecklingsmiljöer*.
Dina frågor rör två *programmeringsspråk*, PIC resp.
AVR assembler...

Sen, angående ditt problem, *står* det i AVR Assembler manualen
att det *ska* fungera ? Om inte, varför tror du att det ska fungera ?

Postat: 27 juli 2007, 04:52:53
av Chribbe76
Jag kan inte hitta något i manualen alls om hur man ska göra.
Det skulle förvåna mig mycket om det inte är möjligt + att jag är "säker" på att jag har sett det i något projekt någonstans, men jag kommer inte ihåg hur syntaxen ska vara.

Postat: 27 juli 2007, 05:35:15
av bos
Addera lagom värde till Program Counter?

Hur man gör det med AVR har jag ingen aning om.

Postat: 27 juli 2007, 06:55:31
av Chribbe76
Om du menar att man ska addera med någon form av ADD-instruktion så blir det ju inget villkorligt hopp.

Jag kan naturligtvis skriva en label vid nästa instruktion men meningen är att slippa det när det bara är en eller två instruktioner som ska hoppas över.

Postat: 27 juli 2007, 07:40:16
av Icecap
Jag känner igen problemet men jag tycker att det är dålig programmeringsstil att inte använda labels. Anledningen är att man "i all hast" kan råka ändra den överhoppade instruktion och missa att längden kan ha ändrats och DET är en jävla intressant situation som kan ta många timmer att debugga.

Samtidig medför detta sätt med fasta relativa hopp att man måste veta hur lån en instruktion är vilket kommer att ge en massa problem för dig om 1 år när du ska modifiera och trimma, programmet är mycket svårare att läsa då och tro mig: du kommer knappast ihåg exakt vad du gjorde så för.

Då jag i sin tid disassemblerade BASIC-prommen till TRS80 hittade jag en del instruktioner (tabelluppslag) som laddade Acc med ett värde men mellan varje steg fanns det en byte som gjorde att när Acc var laddad blev nästa instruktion tolkat till att ladda BC med nästa instruktion, BC användes sedan inte.

Jag antar att det var ett sätt att spara minne på och nog ett "vi kan bevisa att de har kopierat vår prom". Jag ändrade självklart allt sådant till riktiga jump då jag byggde om "lite" på den och hade plats nog.

Postat: 27 juli 2007, 07:44:53
av bos
Chribbe76 skrev:Jag kan naturligtvis skriva en label vid nästa instruktion men meningen är att slippa det när det bara är en eller två instruktioner som ska hoppas över.
Det där osar dålig programmeringssämja. Du förlorar liksom inget på att ha labels mer än att det tar upp kanske 10 bytes extra i lagringsplats. Å andra sidan förlorar du ungefär allt som kan tänkas genom att ha absoluta hopp. Har ingen koll på AVR, men att överskrida page boundary är ett. Att få mer svårläst kod är ett annat.

Postat: 27 juli 2007, 08:21:42
av Chribbe76
Page boundary är inget problem i detta fall eftersom det är AvrAssembler som ränkar ut adressen.
Jag tycker koden blir tydlig, det ska ju bara användas för att hoppa över en eller kanske 2 instruktioner, vid längre hopp använder man labels.
Att använda många labels är fult och jobbigt eftersom man måste hitta på unika labels hela tiden, det här är ett sätt att slippa onödiga labels.

Jag kan ju tillägga att även våran egen sodjan använder denna metod och alla vet ju att det är emot naturens lagar att sodjan har fel. :lol:

Postat: 27 juli 2007, 11:53:10
av sodjan
Att göra rellativa hopp via $ är inte att rekomendera. Jag kan inte
på rak arm se något läge då det är att föredra. Och det finns inget
att vinna på "sloopy coding"...

> Jag kan ju tillägga att även våran egen sodjan använder denna metod
> och alla vet ju att det är emot naturens lagar att sodjan har fel.

Jag kan inte komma på vad du syftar på. Visa ett exempel på kod
som *jag* har skrivit så ska jag ändra det. Den automatgenererade
koden från delay-generatorn på piclist.com räknas inte (även om jag
*skulle* kunna ha ändrat det, men det skulle kunna vara förvirrande
för den som kör egan rutiner för andra delay tider...).

Postat: 27 juli 2007, 11:59:19
av vfr
Om du har ett bra skäl till att verkligen inte använda lablar så prova med * istället för $. Har ingen aning om det funkar, men Atmel använder mycket Motorolastil på sina instruktioner så kanske även detta är liknande.

Postat: 27 juli 2007, 12:10:38
av sodjan
Alltså, *om* det finns en motsvarighet till "$", så måste det väl vara dokumenterat ??

Postat: 27 juli 2007, 15:21:56
av Chribbe76
sodjan, Jag förstår exakt hur du tänker men jag köper ändå inte din dubbelmoral med delay-rutinerna eftersom dina exempel riktar sig mot nybörjare.
Jag tycker att dina exempel bara ska innehålla kod som du kan stå för personligen.
Det är bättre om du ändrar dessa rutiner till något som är lite enklare för en nybörjare att förstå.

* fungerar inte tyvärr, det blir bara unexpected '*'.

Jag väljer gärna att programmera på det här sättet om det går eftersom det är mina egna prylar, jag gör som jag vill helt enkelt.
Men om jag skulle programmera till ett företag skulle jag ha helt andra värderingar och en helt annan nivå på dokumentation osv.

Postat: 27 juli 2007, 15:33:18
av Micke_s
Med RJMP så kan du bara skriva siffran du vill hoppa framåt lite.

Postat: 27 juli 2007, 15:42:15
av Chribbe76
Nu tänker du på hur opkoderna är uppbyggda, branch-instruktionerna är oxå relativa.
Problemet är att om man skriver en tal efter en RJMP eller en BREQ så tolkar AvrAssembler det som absolut och kommer beräkna vad det blir i relativ form så då stämmer det inte.
För att vara säker så provade jag det efter att du skrev ditt inlägg.

Postat: 27 juli 2007, 15:48:28
av Micke_s
Testa
RJMP PC+2 eller så då.