2014-11-25 81 views
0

我在这里有个问题要理解这部分代码。任何人都可以向我解释这两个命令(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

+0

这些指令全部在[AVR指令集参考](http://www.atmel.com/images/doc0856.pdf)中描述。 – Michael 2014-11-25 10:02:19

+0

是的,我已经阅读过,但我仍然不明白这里发生了什么!我知道这是为了节省aems,但我不知道如何 – 2014-11-25 10:04:33

+2

使用计算器或笔和纸执行每一步。 – Michael 2014-11-25 10:07:15

回答

1

该对LSL和ROL的执行一个位双字节价值转移。 LSL移动较低的字节并将该字节的前一个最重要的位传递给SREG中的C标志。然后,ROL移位高位字节,将该位从C标志移入最低位。

这种移位多字节值的方法是一个广泛使用的习惯用法,在两个移位方向都应该谨慎记住。实际上,它在大多数带有标志寄存器的处理器中得到了支持,但细节可能不同(例如,x86名称指令RCL/RCR而不是AVR ROL/ROR)。而且,每次移位超过1位,另一种方法更为有效(如x86 SHLD/SHRD)。

0

的两条指令由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.