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
直观地讲,将寄存器加到自身就是将其乘以二,这与左移一相同。ADC
同时还添加了进位,这成为结果的新 LSB。
那么 even 是什么意思呢?和ROL
之间有语义差异吗?我相信和也
可以得到同样的结论。ROL r
ADC r, r
ROR
SBC
没有区别;文档甚至说
rol Rd
只是的别名adc Rd,Rd
,所以它是相同的操作码,只是 asm 源的一个方便别名,可以更清楚地向人类读者传达语义。http://content.alexandria.atmel.com/webhelp/GUID-0B644D8F-67E7-49E6-82C9-1B2B9ABE6A0D-en-US-1/GUID-61A4FA30-4426-42D7-B199-0EBF064BF9E1.html
但
sbc same,same
不是向右循环;对于减法和加法,进位都是从低到高(从右到左)传播的。sbc same,same
将x-x - carry
寄存器设置为0
或-1
,仅取决于进位。查看不同的 ISA 可以对 ISA 设计选择进行有趣的对比:
x86确实有一个单独的操作码用于
RCL r/m
(循环移位)与ADC r, r/m
。作为 CISC 机器,它允许大多数指令最多一个显式内存操作数,因此adc dword [ebx], [ebx]
不可编码,因此rcl dword [ebx], 1
不是冗余的。AVR 是 RISC,因此所有计算指令只能使用寄存器操作数。x86还允许移位/循环使用除 1 之外的计数,包括运行时变量,但这些是与按隐式 1 循环移位的操作码不同的操作码。(原始 8086 没有按立即数循环移位,只有 1 或 CL)
它是一种语法糖,能够允许使用更简洁、更易读的汇编代码。
不。
不是。
ROR
是“通过进位循环右移(寄存器)。”SBC
是“带进位减法”。这些是非常不同的操作。尽管还有其他简写/语法糖的情况: