2014-09-08 23 views
2

this에 대한 후속 질문입니다. 나는 GNU C 버전 3.4.5 (와 Mingw-비스타 특별 R3)에 의해 컴파일lpm rd, Z는 항상 gpm-avr의 인라인 어셈블리에서 lpm rd, Z +로 변환됩니다.

  • GNU C (WinAVR 환경 20100110) 버전 4.3.3 (AVR)을/사용 __AVR_HAVE_LPMX__ 프로세서 (avr25)에 대한 코드를 쓰고 있어요 , GMP 버전 4.2.3, MPFR 버전 2.4.1.

내가 인라인 어셈블리에서 lpm rd, Z를 사용, 컴파일러는 항상 (LSS-파일에서 발췌) lpm rd,Z+이 번역 : 그것이 look-에 연속 액세스에 사용되는 경우, 나쁜

asm volatile("lpm r24,Z"); 
248: 84 91   lpm r24, Z+ 

테이블. 조회 값은 0xff 일 수 있으므로이 값이 ZH (r31)이 불필요하게 증가하므로 solution이 손상됩니다.

이 문제를 회피하기위한 제안이 있으십니까?

답변

1

해결 방법에는 아무런 문제가 없습니다. 귀하의 디스어셈블러 (avr-objdump -d, binutils 패키지의 일부)가 버그입니다.

Atmel AVR instruction set manual (PDF) 97 페이지를 참조하십시오. lpm 명령 변형

1001 0101 1100 1000 = 0x95C8 lpm r0,Z 
1001 000? ???? 0100 = 0x9??4 lpm r?,Z 
1001 000? ???? 0101 = 0x9??5 lpm r?,Z+ 

후, 우리는 당신의 디스어셈블러보다 더 Atmel의 문서를 신뢰

84 91 lpm r24,Z 

반면 실제로

85 91 lpm r24,Z+ 

, AVR-GCC (GCC) 4.8을 가정으로 인코딩 .2 avr-gcc-4.8.2 -O2 -fomit-frame-pointer -mmcu=avr25을 사용하여 인라인 어셈블리를 동일한 두 바이트 (84 91)로 컴파일하고 lpm r24,Z로 나열합니다. n 어셈블리 소스 파일 (-S 옵션 사용); 객체 파일로 컴파일하고 avr-objdump (GNU binutils) 2.23.1을 사용하여 avr-objdump -d을 사용하여 디스 어셈블하면 명령은 여전히 ​​84 91lpm r24,Z입니다.

이것은 avr-objdump (GNU binutils의 일부)의 버그라고 생각합니다. 아 예, reported hereapparently fixed in binutils-2.23.1 (2013 년 10 월)

요약하면 분해 만 영향을받습니다. Z이 표시 될 때 분해가 Z+으로 잘못 표시됩니다. 사람이 읽을 수있는 출력 만 올바르지 만 생성 된 코드에는 영향을주지 않습니다. 수정하려면 binutils 버전 2.23.1 이상으로 업그레이드하십시오. 그렇게 할 수 없다면 걱정할 필요가 없습니다.이 오류는 사람이 읽을 수있는 디스어셈에만 영향을 미치기 때문에 무시해도됩니다.

질문이 있으십니까?

+0

맞습니다. 시뮬레이터 디스어셈블러에서는 '+ 0000011B : 9184 LPM R24, Z'를 보여줍니다. 트러스트 할 도구를 배워야합니다. 감사! – Thomas