AVR 同时具有
ADC
(带进位加法)和 ROL
(通过进位向左旋转)指令。ROL
,而 ADC r, r
也能达到同样的目的。
据我所知,
ADC r, r
和ROL r
都会导致(r << 1) | carry
。对于两者,进位均设置为寄存器的 MSB。
这是一个例子:
r = 0x12 = 0001_0010
,carry = 0
ADC r, r
r = 0010_0100 = 0x24
carry = 0
ROL r
r = 0010_0100 = 0x24
carry = 0
直观上,寄存器与自身相加就是将其乘以 2,这与左移 1 相同。
ADC
还添加进位,成为结果的新 LSB。
那么,
ROL
到底是为了什么? ROL r
和 ADC r, r
之间有语义差异吗?ROR
和 SBC
。
没有区别;文档甚至说
rol
只是一个别名 adc same,same
,所以它是相同的操作码,只是 asm 源的一个方便别名,以便更清楚地向人类读者传达语义。但是
sbc same,same
不是右旋转;进位从低到高传播(从右到左)。sbc same,same
是将寄存器设置为 x-x - carry
或 0
,仅取决于进位。