Sida 4 av 9

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 17 oktober 2012, 22:38:27
av 1802
Men blir inte talet fel då?

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 17 oktober 2012, 22:47:38
av TomasL
Nej, det blir helt korrekt.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 17 oktober 2012, 23:00:20
av eqlazer
Borde väl bli såhär?

In:
Carry 0
%10000001

Utför en (1) ROL

Ut:
Carry 1
%00000010

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 17 oktober 2012, 23:06:03
av TomasL
Han gjorde två ROL.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 17 oktober 2012, 23:10:37
av sodjan
> Men blir inte talet fel då?

Vad är rätt och vad är fel?
Och vilket "tal"?

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 00:11:35
av jesse
Om man ska utföra en shiftinstruktion, eller rotera, så ska man ju ha ett syfte med det. Att bara rotera runt bitarna för nöjes skull kan ju ge vad för resultat som helst. Varför ska du t.ex. göra ROL två gånger efter varandra på samma register? Om du ska multiplicera med 2 eller med 4 så är det ju inte ROL du ska använda, då använder du LSL. Och ska du rotera bitar i fler än en byte så använder du alltså LSL på första byten (den lägsta) för att du inte ska få in carry i bit0, sedan vill du ju ta med carry in i nästa byte,, och då ska du använda ROL, precis som i mitt exempel.

Om du vill rotera åtta bitar runt i samma register utan att "carry" blir inblandat som en nionde bit, så får du fixa lite extra:

1) gör LSL (logic shift left). bit7 hamnar i carry, men bit0 blir en nolla.
2) nu ska värdet i bit0 få samma värde som carry - alltså det som tidigare var bit7. Det kan du göra genom att addera 0 (noll) till talet med carry:

Kod: Markera allt

LSL r16 ; shifta alla bitar ett steg år vänster. bit7 hamnar i carry.
LDI r17, 0 ; nollställ r17 - ska användas i additionen nedan.
ADC r16, r17; addera carry till r16 (i praktiken flyttas carry-siffran till bit0 i r16)
nu får du den effekt som du ville ha. De åtta bitarna i r16 roterar ett steg åt vänster utan att nån extra bit stoppas in i mellan.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 00:18:28
av Walle
Du missar att ettan när den "knuffas ut" så hoppar den över i carry, och vid nästa operation hoppar den från carry till bit 0.

Edit: hoppsan, missade att det fanns en sida till :)

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 00:57:58
av 1802
jesse: Om du kollar min senaste kod, så funkar den redan. med ASL. ROL diskussionen är separat. LSL finns inte i 6502 Men väl LSR!? Vad anv ROL till? Mest nyfiken. Behöver inte den än...

Skall jag starta nya trådar, om det blir ett nytt projekt? Kan ju vara bra om rubriken visar syftet med koden.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 08:34:58
av eqlazer
Det har ju jesse mfl förklarat flera gånger: Ska du shifta ett större tal än 8-bit behöver du ROL för att få med dig carry.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 11:15:06
av 1802
eqlazer: LSL (om den finns) gör det jobbet. ROL trycker in en extra bit, som jag inte fattat ännu.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 11:26:53
av Icecap
Ett sista försök: Om du kör med värden större än 8 bit på en 8-bit CPU måste du ju kunde föra över overflow för att få rätt värde. Ska du alltså shifta t.ex. ett 16 bit värde kör man först en shift som ju flyttar in en nolla och skickar ut högsta bit'en till Carry. Sedan kan man rotera ett valfrit antal bytes med Carry inblandat om man alltså behöver.

Ett 64-bit värde behöver 8 bytes och ska du multiplicera det med två ska den lägsta byte shiftas en plats åt vänster.
Men då kan den högsta bit ju falla bort om inte man tar hand om den, alltså måste man rotera de nästa 7 bytes, inte shifta. På det vis flyttas överflödet "automatisk" till nästa byte högre upp i värdekedjan.

Din brist på förståelse verkar bero på att du inte kan räkna med mer än 8 bit men det finns många värden som behöver signifikant fler bits för att hålla värdet, alltså måste man jobba över fler bytes om man använder en 8-bit CPU. Programmerar man i högnivåspråk kommer kompilern att lägga in rutiner som tar hand om detta, t.ex. en rutin för att multiplicera ett 32 bit värde med ett annat 32 bit värde, det blir ju ett miniprogram i sig.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 11:42:08
av 1802
Typ att första byten LSL, och de andra ROL?
Går det med lite extra kod(som kollar carry) att klara sig utan ROL?

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 12:39:46
av Wedge
Klart det går, men vad är poängen med att inte använda de verktyg som erbjuds?

Om du inte skiftar (roterar) in en satt carrybit som behövs för att resultatet ska bli rätt så kan du naturligtvis kolla om carry är satt och sedan ORa in en etta på rätt plats. Oerhört tillkrånglat.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 15:23:25
av 1802
Dimman börjar lättna, tror jag. Vi börjar med #128 och kör en ROL. Efter denna första roll är carry flytande (kan vara både 0 eller 1), och det som hamnar i bit 0. Efter nästa ROL kommer inte bit 7, utan carry av bit 7. De är exakt lika varann, men inte samma sak. Därav min förvirring över vad den första ROL gör. Om bit 7 vart lik carry, skulle jag inte märkt nått. Jag har inte provat, men ROL sen CLC (clear carry) borde göra samma som ASL(LSL på atmega).

Wedge: I utbildnings syfte för att polletten skall trilla ner.

Re: Var är det lämpligt att diskutera .asm kod?

Postat: 18 oktober 2012, 16:57:43
av Wedge
Dimman har inte lättat än. Börjar du med en ROL på talet 128 får du alltid en etta i carry. Vad du får i LSB är okänt, det blir vad carry hade innan ROL.

Om du gör CLC och sen ROL blir det samma sak som ASL. Tvärt emot det du föreslår.