Si lo que realmente desea es rotar los bits 5-0 a los bits 6-1, y luego colocar el valor original del bit 6 en el bit 0, entonces el siguiente código se completará de manera determinista exactamente en 4 ciclos y ocupará 8 palabras de la memoria del programa.
bst r16,6 ; Store bit 6 of in T Flag
lsl r16 ; logical shift left by one bit. bit 0 gets 0.
bld r16,0 ; Load T into bit 0
cbr r16, $7F ; clear bit 7
Esto es lo que está sucediendo en cada paso ...
EstecódigooperaenelregistroR16,perosepuedemodificarparaquefuncioneconlosregistrosR16-31.EstonofuncionaráenregistrospordebajodeR16debidoalrangolimitadodeCBRalfinalqueborraelbit7.
Sinecesitaqueelcódigofuncionedemanerauniformeencualquierregistro(incluidoR0-15),puedeborrarelbit7conunacombinacióndecambioalaizquierda/aladerechaquerequiereuncicloadicionaly2palabrasdememoriaadicionales..
bstr1,6;Storebit6ofinTFlaglslr1;logicalshiftleftbyonebit.bit0gets0.bldr1,0;LoadTintobit0lslr1;logicalshiftleft.lsrr1;logicalshiftright.bit7gets0.
Estoesloqueestápasando...
Este código opera en el registro R1, pero se puede modificar para que funcione en cualquier registro.
Finalmente, si necesita establecer el bit de acarreo de acuerdo con el valor original del bit 6 (no fue solo un efecto secundario), podría usar el siguiente código (incluso más largo) ...
bst r1,6 ; Store bit 6 of in T Flag
lsl r1 ; logical shift left by one bit. bit 0 gets 0.
bld r1,0 ; Load T into bit 0
lsl r1 ; logical shift left.
bld r1,0 ; Load T into bit 0
lsr r1 ; logical shift right. bit 7 gets 0. C gets original bit 6.
Esto es lo que está sucediendo (este es un poco más complicado, por lo que los cambios se resaltan en verde) ...
ElcódigoanteriorsepuedemodificarparacualquierregistroR0-R31.
Puedeleerunadescripcióncompletadetodasestasinstrucciones(incluidalamuyprácticainstruccióndeBitStoreenlapágina46)del AVR Manual del conjunto de instrucciones .