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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

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

Inlägg av 1802 »

Kod: Markera allt

 .ORG 1000
 
   LDA #178
loop:
   ROL
  BCC skipp
   LDX#$01
jmp loop
  skipp: 
   LDX#$00
jmp loop 
   RTS
Bara en slarvig test på vägen. Trodde att det bara skulle komma nollor från höger, men det kommer blandat nollor och ettor!? Gör kanske inget, men varför?

Tillägg: Först kommer en okänd bit, sen innehållet repeterat.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46984
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Bara en slarvig test på vägen
Sluta slarva, börja fundera på vad du gör, om du inte förstår, rita grafiskt med pilar osv var bitarna tar vägen till vilka register osv.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

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

Inlägg av 1802 »

Nu var det ju de förväntade nollorna som uteblev jag undrar över. Programmet är under utveckling. Kommer mera.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

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

Inlägg av jesse »

Det blir ingen bra utveckling om du slarvar eller gissar dig fram. Då lär du dig inte på ett bra sätt. Jag valde medvetet att inte ge dig ett färdigt exempel, men med min pseudokod på förra sidan ska du kunna förstå exakt vad som händer hela tiden - varenda bit!

Och välj processor! Programmera antingen för 6502 eller AVR. Gör inte ett mellanting - det lär du dig inget på och du blir bara förvirrad eftersom du inte vet vad instruktionen gör i just den processorn - eller om den ens finns.

Sedan gör du ett flödesschema (som Tomas skriver - rita med pilar osv..).
Därefter väljer du ut lämpliga instruktioner.

Ladda ner AVR Assembler User Guide. Gör det !

Sedan läser du den detaljerade beskrivningen för varje instruktion du tänker använda. Så att du vet exakt vad som händer.

Sedan kommer du att vara expert.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

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

Inlägg av 1802 »

På viket sätt hjälper ovan 2 inlägg varför ROL kommandot inte gör som jag trodde? Vad är extra bitten för något? Overflow kanske? Eller simulator bugg? Nu när jag ser vad som händer kan jag rätta mig efter det. Och skriva vidare på programmet. Gör man inga misstag så lär man sig inget. Helt ok att ni inte släpper färdig kod direkt.

Har för mig att man anv ROL när man mutiplicerar(*2). Skall nog inte vara så svårt att hitta ett färdigt exempel och analysera.

Hur kommer det sig att olika proffs lyckas olika bra, om "det är bara att läsa manualen"?
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

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

Inlägg av Wedge »

ROL roterar ju in carrybiten i LSB också.
Ska du multiplicera med 2 bör du ju börja med att rensa carry, alternativt använda ASL (6502) eller LSL (AVR).
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46984
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Har för mig att man anv ROL när man mutiplicerar(*2). Skall nog inte vara så svårt att hitta ett färdigt exempel och analysera.
Nej det gör man inte, skall du multiplicera med 2 använder du shift-left , vad det nu kan bli hos din processor.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

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

Inlägg av 1802 »

Wedge: precis det jag ville veta. ASL den måste jag prova. I mitt fall borde det inte ha nån betydelse. Men alltid lär man sig nått.

Edit: ASL funkar, och kommer att nollställa automagiskt. Så den får det bli. ROL funkar men lämnar "skräp" i registret. Viket inte spelar så stor roll i mitt fall.

TomasL: Står i Wedges inlägg.

Till båda: Vill man inte ha carry med sig när man multiplicerar? Min gissning nej. Den påverkas ändå, och skall behandlas vid större tal.
Senast redigerad av 1802 16 oktober 2012, 15:05:50, redigerad totalt 1 gång.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

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

Inlägg av jesse »

Carry: vill man ju ha med om man t.ex ska shifta 16 bitar. Men multiplicerar du ett tal med 2 så vill du ju inte att svaret ska bli olika beroende på hur carry råkar stå.

multiplicera ett 16-bitars tal med 2 blir alltså:
LSL r16 ; // r16 är den låga byten - lämnar carry
ROL r17 ; // r17 är den höga byten - plockar upp carry
1802 skrev:På viket sätt hjälper ovan 2 inlägg
De hjälper väldigt bra om du läser dem. Om du inte vill läsa dem så är det givetvis ingen nytta.

Det kändes lite svårt att svara på frågan " Trodde att det bara skulle komma nollor från höger, men det kommer blandat nollor och ettor!?" eftersom inlägget började med ett (slarvigt?) program som inte jag orkade sätta mig in i eftersom det inte ens var AVR-instruktioner. Skulle du inte programmera AVR? Jag kan inte 6502 även om jag kan gissa vad den gör.

Om jag bara svarat på den frågan så lär du dig bara den detaljen. Om du istället läser mitt inlägg så lär du dig att snabbt hitta svaret på de flesta frågorna. Sen är det mänskligt att man fastnar för att man inte förstår uttrycken eller att det blir för tekniskt. Då blir det lättare att svara på frågan, för då kan du beskriva problemet bättre, troligtvis.

Jag försöker faktiskt tillföra något positivt... Men det kanske lite alltid går hem hos alla. :?

I AVR-assember finns det fyra olika shift-instruktioner:

LSL = logic shift left - flytta alla bitar en bit åt vänster.
Atmel förklarar det med tecken: Rd(n+1) ←Rd(n),Rd(0) ←0,C ←Rd(7)
lägsta biten blir nolla, värdet i högsta biten flyttas till carry.

LSR = Logical Shift Right , Rd(n) ←Rd(n+1),Rd(7) ←0,C ←Rd(0)
flytta alla bitar ett steg åt höger. översta biten blir nolla, lägsta biten flyttas till carry.

ROL Rotate Left Through Carry, Rd(0) ←C,Rd(n+1) ←Rd(n),C ←Rd(7)
TIll skillnad från "shift" så är detta "rotera". Enda skillnaden är egentligen att värdet i carryflaggan flyttas in i den lägsta biten.
ROR som ROL fast åt andra hållet.

Kod: Markera allt

; ---- shifta ut bitar en och en
;-------- indata i r17 ----------
; ------- r16 används ---------
    ldi r16, 8     ; r16 använs att räkna varv
loop:
    rol r17      ; flytta ut översta biten till carryflaggan.
    brcc nolla   ; Branch if Carry Cleared
    ; ----- etta --- gör något här ---
    rjmp forts
nolla:
    ; ----- nolla --- gör något här ---
    dec r16
    brne loop
; --- end ---
brcc = Branch if Carry Cleared
brne = Branch if Not Equal
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

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

Inlägg av 1802 »

TomasL: ROL i 6502 Rotate One bit Left. Typ samma sak, men med lite mer som inte framgår av namnet. Se Wedges inlägg.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

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

Inlägg av 1802 »

jesse: Jag är mycket tacksam för din hjälp. Men när det gäller flödesschemakrav, kan vi enas om att vi är oense. Jag tycker att de inte alltid behövs. Sen har jag inte helt fattat varför carry biten dyker upp vid ROL. Att den påverkar carry flaggan förstår jag, och varför.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Normalt brukar en "rotate" vara en rotering *genom* carry-flaggan.
En "shift" brukar vara "öppen" i båda ändar, så att säga...

Första bilden "rotate", andra bilden "shift" :

Bild

Bild
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

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

Inlägg av 1802 »

sodjan: Jag har märkt det, men varför? Det börjar klarna men inte helt. Tackar även dig, för illustrativa bilder.

Kod: Markera allt

; AslBit0.2.65s
;/åtta bitar finns i register "r" som ska analyseras.
;    sätt loop-räknare till 8
;loop:
;    rotera "r" vänster med ROL så att bit 7 hamnar i carry
;    hoppa till "off" om carry är nolla.
;        utför "on"-rutin
;        hoppa till forsätt_loop
;off:
;        utför off-rutin
;fortsätt_loop:
;    minska loop-räknade med ett (dec)
;    hoppa till loop om loopräknare inte är noll.
; Nedan följer inte ovan slaviskt.

 .ORG 1000
 
 LDA #189                 ; indata
 LDY #$08                 ; kör 8 bitar
loop:
 DEY
 ASL                      ; rol kan också funka i vissa fall
 BCC skipp                ; hoppa om inte carry satt
 jsr on
 CPY #$00                 ; kolla om 8 varv gått
 BEQ end                  ; avsluta om sant
 JMP loop
skipp: 
 jsr off
 CPY #$00                 ; kolla om 8 varv gått
 BEQ end                  ; avsluta om sant
 JMP loop 

end: 
 RTS

on:
 LDX #$01
 stx $d021               ; Ger färgblink på C64
 RTS
off:
 LDX #$00
 stx $d021               ; Ger färgblink på C64
 RTS
Verkar funka. Men tex raderna med " JMP loop ". Är för många. Liksom " CPY #$00 ; kolla om 8 varv gått
BEQ end ; avsluta om sant"
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

> Jag har märkt det, men varför?

Varför vadå? Vad är problemet/frågan kring rotate/shift?
Konstig fråga, lite som att fråga varför går solen upp varje morgon...
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

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

Inlägg av 1802 »

sodjan: Jag har inte tittat på problemen vid större tal än 255 ännu. Vad som händer när man skall överföra carry till nästa byte, och vad som skall vara kvar i den första byten. Men det tar jag när jag behöver det...
Skriv svar