2013-10-10 4 views
1

안녕 난 아래 example에, 내가 몇 가지 질문이, AVR의 ASM 프로그램에 새로운 오전 : 긴 8 비트 또는 16 비트 :AVR의 ASM 라벨 * 2

1)는 라벨인가?

2) 왜 2로 곱셈 레이블이 필요합니까?

3) 명령 LPM은 레지스터 R0에 결과를 저장합니까? 그렇다면 Z와 어떤 관련이 있습니까?

이 주소가 두 곱하지 않고 레이블 바이트 주소를 0x60 (워드 주소는 0x30)에있는 경우

", Z는 코드를 가리 킵니다 :

4) 당신은 제공된 링크에서 인용 텍스트를 explaine 수 이 저장됩니다. 나는 이것이 해결 문제를 명확히 바란다. 다른 버전은 "

ldi ZL, low(2*label) 
ldi ZH, high(2*label) 

label: 
.db "Hello world", 0 
lpm 

감사합니다.

+0

이것을'avr-gcc '라고 태그 했으므로, C에서'sizeof (label)'을 수행하고 찾아 낼 수 있다고 가정합니다 (포인터와 크기가 같을 수도 있습니다. 왜냐하면, 음, 그것은 ** 내가 몹시 착각하지 않는다면 ** 포인터이다), –

답변

2
  1. 레이블은 16 비트입니다.
  2. 어셈블러가 워드 주소를 사용하지만 LPM에 바이트 주소가 필요하기 때문에. avr-gcc에 의해 사용되는 gas과 같이 모든 어셈블러가 이것을 수행하는 것은 아닙니다. 그렇다면 곱셈은 필요 없습니다.
  3. 예, 피연산자없는 버전 LPMR0에 자동으로로드되고 Z에서 주소를 가져옵니다. 명령 세트 참조를 참조하십시오.
  4. 그건 너무 분명하지 않았어, 위 # 2 참조.
1

이와 비슷합니다. 아래 다이어그램을 따르십시오. 다이어그램은 시각화에 많은 도움이됩니다.

워드 주소 .................................. 바이트 그래서

|--(0d)---;--(0c)---|06       |--------|06 
|--(0b)---;--(0a)---|05       |--------|05       
|--(09)---;--(08)---|04       |--------|04 
|--(07)---;--(06)---|03       |--------|03 
|--(05)---;--(04)---|02       |--------|02 
|--(03)---;--(02)---|01       |--------|01 
|--(01)---;--(00)---|00       |--------|00 

주소 0x01 단어 주소가 0x02 바이트 주소와 일치 함을 알 수 있습니다. 0x04 단어 주소는 0x08 바이트 주소와 일치합니다.

따라서 2를 곱합니다. 메시지를 위치에 저장했다고합시다.

.org 0x0200 
message: 
.db "1234567890#" 

avr studio를 사용하는 경우 프로그램 메모리 섹션을 확인하십시오. 0x200이 아니라 0x400에 저장되어있는 것을 볼 수 있습니다.