2014-11-25 94 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.