我有一个问题在这里理解这部分代码。谁能解释我这两个命令(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 :(得分:1)
LSL和ROL对执行一位双字节值移位。 LSL移位低字节,并将该字节的前一个最高有效位传递给SREG中的C标志。然后,ROL移位高字节,将该位从C标志移入最低有效位。
这种移动多字节值的方法是一种广泛使用的习惯用法,应该仔细记住两个移位方向。实际上,大多数具有标志寄存器的处理器都支持它,但细节可能不同(例如x86名称指令RCL / RCR而不是AVR ROL / ROR)。此外,一次移位超过1位,另一种方法更有效(如x86 SHLD / SHRD)。
答案 1 :(得分:0)
这两条指令一起将Z
指针寄存器中的(16位)值乘以2。
但是,我无法看到可能有用的东西。
通常,你取一个索引值(放入一个数组),乘以数组元素的大小(例如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.