O AVR tem as instruções ADC
(Add with Carry) e ROL
(Rotate Left through Carry).
No entanto, parece-me que ROL
não é necessário e ADC r, r
cumpre o mesmo propósito.
Até onde eu sei, ambos ADC r, r
e ROL r
resultam em (r << 1) | carry
. Para ambos, o carry é definido como o MSB do operando.
Aqui está um exemplo:
r = 0x12 = 0001_0010
,carry = 0
ADC r, r
r = 0010_0100 = 0x24
carry = 0
ROL r
r = 0010_0100 = 0x24
carry = 0
Intuitivamente, adicionar o registro a si mesmo é multiplicá-lo por dois, o que é o mesmo que um deslocamento para a esquerda por um. ADC
também adiciona o transporte, que se torna o novo LSB do resultado.
Então, o que é ROL
even para então? Há alguma diferença semântica entre ROL r
and ADC r, r
?
Acredito que o mesmo argumento poderia ser feito para ROR
and SBC
também.