AVR的“ADC r18,r18”和“ROL r18”的区别

问题描述 投票:0回答:1

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

assembly cpu-architecture avr instruction-set carryflag
1个回答
0
投票

没有区别;文档甚至说

rol
只是一个别名
adc same,same
,所以它是相同的操作码,只是 asm 源的一个方便别名,以便更清楚地向人类读者传达语义。
http://content.alexandria.atmel.com/webhelp/GUID-0B644D8F-67E7-49E6-82C9-1B2B9ABE6A0D-en-US-1/index.html?GUID-DD2BF306-0985-404E-A564-5FB45558ACE5

但是

sbc same,same
不是右旋转;进位从低到高传播(从右到左)。
sbc same,same
是将寄存器设置为
x-x - carry
0
,仅取决于进位。
    

© www.soinside.com 2019 - 2024. All rights reserved.