我在这里有个问题要理解这部分代码。任何人都可以向我解释这两个命令(lsl和rol)的工作原理吗?逻辑移位和旋转
主:
clr r0
clr r22 ;
LDI ZL,LOW(AEMS)
ldi zh,HIGH(AEMS)
lsl zl
rol zh
mov r22,zl
AEMS包含: AEMS:.db的$ 74 $ 91; 7491 .db的$ 76 $ 28; 7628
我在这里有个问题要理解这部分代码。任何人都可以向我解释这两个命令(lsl和rol)的工作原理吗?逻辑移位和旋转
主:
clr r0
clr r22 ;
LDI ZL,LOW(AEMS)
ldi zh,HIGH(AEMS)
lsl zl
rol zh
mov r22,zl
AEMS包含: AEMS:.db的$ 74 $ 91; 7491 .db的$ 76 $ 28; 7628
该对LSL和ROL的执行一个位双字节价值转移。 LSL移动较低的字节并将该字节的前一个最重要的位传递给SREG中的C标志。然后,ROL移位高位字节,将该位从C标志移入最低位。
这种移位多字节值的方法是一个广泛使用的习惯用法,在两个移位方向都应该谨慎记住。实际上,它在大多数带有标志寄存器的处理器中得到了支持,但细节可能不同(例如,x86名称指令RCL/RCR而不是AVR ROL/ROR)。而且,每次移位超过1位,另一种方法更为有效(如x86 SHLD/SHRD)。
的两条指令由2
一起乘以Z
指针寄存器(16位)值,但我什么也看不见,可能是很好的。
通常,您取的指标值(到一个数组),乘上阵列元件(2例如)和然后大小的结果添加到指针指向数组的第一个元素,如
ldi r24, N ; Nth element of the array (0-based!)
clr r25
lsl r24 ; multiply by 2 for double-byte array elements
rol r25 ; (<- this is really only needed if the array is bigger than 256 bytes, otherwise r25 will always be 0)
ldi zl,LOW(AEMS)
ldi zh,HIGH(AEMS)
add zl, r24 ; add offset to base address
adc zh, r25
; Now Z points to the address of the Nth double-byte element from AEMS.
这些指令全部在[AVR指令集参考](http://www.atmel.com/images/doc0856.pdf)中描述。 – Michael 2014-11-25 10:02:19
是的,我已经阅读过,但我仍然不明白这里发生了什么!我知道这是为了节省aems,但我不知道如何 – 2014-11-25 10:04:33
使用计算器或笔和纸执行每一步。 – Michael 2014-11-25 10:07:15