我在這裏有個問題要理解這部分代碼。任何人都可以向我解釋這兩個命令(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