AVR指令中ADC r,r与ROL r的语义差异及存在意义探讨
AVR中ADC r,r与ROL r的功能等价性疑问
我发现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,也就是左移一位;而ADC还会加上进位值,把它作为结果的新最低位(LSB),这和ROL的循环逻辑完全一致。
那ROL指令存在的意义是什么?ADC r,r和ROL r是否真的没有语义差异?同样的疑问也适用于ROR和SBC指令。
内容的提问来源于stack exchange,提问作者NyxCode
相关产品推荐
相关产品推荐

