Cambie el valor a algún punto en un número binario

0

Me pregunto si es posible hacer lo siguiente. Por ejemplo, tengo un número 00001110. Lo estoy desplazando hacia la izquierda. - > 00011100 .... Pero la pregunta es si es posible comenzar a establecer el valor en el indicador de acarreo no desde el séptimo bit sino desde el sexto. Hay un comando: ROL cambia un séptimo bit al indicador C, y luego almacena este valor en el bit cero. Pero tengo que hacer esto, pero no haga nada con el séptimo bit, y guarde el sexto bit en el indicador C y luego guárdelo en cero bit. Quiero decir que cuando el valor es 01110000, el siguiente valor debe ser 01100001. ¿Es posible hacer así? Agradecería cualquier ayuda.

    
pregunta solderingiron

2 respuestas

0

Código del ensamblador PIC. El valor está en un registro llamado "Registro"

  clrc  ;clear C bit    
  btfsc  Register,6  ;is bit 6 Hi?    
    setc  ;set C if bit 6 is set
  rlf Register,F  ;rotate left through C
  bcf Register,7  ;clear bit 7

Sé que hay una mejor manera de hacer esto, pero esto debería ayudarte a comenzar.

    
respondido por el Dwayne Reid
2

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 .

    
respondido por el bigjosh

Lea otras preguntas en las etiquetas