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.
Não há diferença; os documentos até dizem
rol Rd
que é apenas um alias paraadc Rd,Rd
, então é o mesmo opcode, apenas um alias de conveniência para a fonte asm para transmitir mais claramente o significado semântico para leitores humanos.http://content.alexandria.atmel.com/webhelp/GUID-0B644D8F-67E7-49E6-82C9-1B2B9ABE6A0D-en-US-1/GUID-61A4FA30-4426-42D7-B199-0EBF064BF9E1.html
Mas
sbc same,same
não é uma rotação para a direita; o transporte se propaga de baixo para cima (da direita para a esquerda) tanto para subtração quanto para adição.sbc same,same
estáx-x - carry
definindo o registro para0
ou-1
, dependendo apenas do transporte.Observar um ISA diferente fornece um contraste interessante de escolhas de design de ISA:
o x86 tem um opcode separado para
RCL r/m
(rotate through carry) vs.ADC r, r/m
. Sendo uma máquina CISC, ela permite até um operando de memória explícito para a maioria das instruções, entãoadc dword [ebx], [ebx]
não é codificável, entãorcl dword [ebx], 1
não é redundante. O AVR é um RISC, então todas as instruções de computação podem usar apenas operandos de registro. Ox86 também permite contagens diferentes de 1 para deslocamentos/rotações, incluindo variáveis de tempo de execução, mas esses são opcodes separados do opcode rotate-by-implicit-1. (O 8086 original não tinha rotate by immediate count, apenas 1 ou CL)
É um açúcar sintático e permite um código assembly mais conciso e legível.
Não.
Não.
ROR
é um "ROtate Right (registro) através de carry".SBC
é "SuBtract com Carry". Essas são operações muito diferentes.Embora existam muitos outros casos de taquigrafia/açúcar sintático: