2014-11-25 2 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 : $ 74 .DB, $ 91, 7491 .DB $ 76 $ 28 : 7628

+0

지침은 [AVR 명령 세트 참조] (http://www.atmel.com/images/doc0856.pdf)에 설명되어 있습니다. – Michael

+0

네, 이미 읽었지만 아직도 여기서 무슨 일이 일어나고 있는지 이해할 수 없습니다! 나는 그것이 aems를 저장하는 것을 알고있다. 그러나 나는 방법을 모르고있다. –

+2

계산기 또는 펜 & 종이를 사용하여 각 단계를 수행한다. – Michael

답변

1

LSL 및 ROL 한 쌍의 수행 1 비트 더블 바이트 가치 이동. LSL은 하위 바이트를 시프트하고이 바이트의 이전 최상위 비트를 SREG의 C 플래그로 전달합니다. 그런 다음 ROL은 상위 바이트를 이동시켜 비트에서 C 플래그를 최하위 비트로 이동시킵니다.

멀티 바이트 값을 이동하는이 방법은 널리 사용되는 관용구이므로 두 방향 모두에서 신중하게 기억해야합니다. 실제로 플래그 레지스터가있는 대부분의 프로세서에서 지원되지만 세부 사항은 다를 수 있습니다 (예 : AVR ROL/ROR 대신 x86 이름 지침 RCL/RCR). 또한 한 번에 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. 
관련 문제