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