문제

AVR-Objcopy를 사용하여 분해 한 이진 파일이 있습니다. 인터럽트 벡터 테이블은 다음과 같습니다.

00000000 :
    ; VECTOR TABLE
   0:   13 c0           rjmp    .+38        ;  0x28, RESET
   2:   b8 c1           rjmp    .+880       ;  0x374, INT0
   4:   fd cf           rjmp    .-6         ;  0x0
   6:   fc cf           rjmp    .-8         ;  0x0
   8:   fb cf           rjmp    .-10        ;  0x0
   a:   fa cf           rjmp    .-12        ;  0x0
   c:   f9 cf           rjmp    .-14        ;  0x0
   e:   f8 cf           rjmp    .-16        ;  0x0
  10:   f7 cf           rjmp    .-18        ;  0x0
  12:   c7 c1           rjmp    .+910       ;  0x3a2, TIMER1 OVF
  14:   f5 cf           rjmp    .-22        ;  0x0
  16:   f4 cf           rjmp    .-24        ;  0x0
  18:   f3 cf           rjmp    .-26        ;  0x0
  1a:   f2 cf           rjmp    .-28        ;  0x0
  1c:   2b c2           rjmp    .+1110      ;  0x474, ADC conversion complete
  1e:   f0 cf           rjmp    .-32        ;  0x0
  20:   ef cf           rjmp    .-34        ;  0x0
  22:   ee cf           rjmp    .-36        ;  0x0
  24:   ed cf           rjmp    .-38        ;  0x0
  26:   00 00           nop
  ; START
  28:   f8 94           cli
 (snip)

몇 가지 수정 으로이 파일을 다시 조립하고 싶습니다. 처음 2 개의 열을 제거하여 일반 어셈블리 파일이되도록 재구성했습니다. 즉:

.org 0
    rjmp    .+38            ;  0x28, RESET
    rjmp    .+880           ;  0x374, INT0
(snip)

그러나 내가 달릴 때

$ avr-as -mmcu=atmega8 test.asm

그런 다음 생성 된 파일을 분해합니다. (objcopy -s a.out 사용) 출력은 다음과 같습니다.

00000000 :
   0:   00 c0           rjmp    .+0             ;  0x2
   2:   00 c0           rjmp    .+0             ;  0x4
   4:   00 c0           rjmp    .+0             ;  0x6
   6:   00 c0           rjmp    .+0             ;  0x8
   8:   00 c0           rjmp    .+0             ;  0xa
   a:   00 c0           rjmp    .+0             ;  0xc
   c:   00 c0           rjmp    .+0             ;  0xe
   e:   00 c0           rjmp    .+0             ;  0x10
  10:   00 c0           rjmp    .+0             ;  0x12
  12:   00 c0           rjmp    .+0             ;  0x14
  14:   00 c0           rjmp    .+0             ;  0x16
  16:   00 c0           rjmp    .+0             ;  0x18
  18:   00 c0           rjmp    .+0             ;  0x1a
  1a:   00 c0           rjmp    .+0             ;  0x1c
  1c:   00 c0           rjmp    .+0             ;  0x1e
  1e:   00 c0           rjmp    .+0             ;  0x20
  20:   00 c0           rjmp    .+0             ;  0x22
  22:   00 c0           rjmp    .+0             ;  0x24
  24:   00 c0           rjmp    .+0             ;  0x26
  26:   00 00           nop
  28:   f8 94           cli
(snip)

그렇다면 PC 관계 점프를 존중하기 위해 AVR-AS를 어떻게 얻을 수 있습니까?

도움이 되었습니까?

해결책

나는 대답을 찾았다!

나는 조립했지만 연결하지 않았다. 따라서 어셈블러는 모든 상대 점프/통화/분기를.+0으로 채우고있었습니다.

이 문제를 해결하려면 다음을 포함하는 사용자 정의 링커 스크립트를 만들어야합니다.

SECTIONS
{
  . = 0x0;
  .text : { *(.text) }
}

이것은 링커에 주소 0에서 .text 섹션을 시작하도록 지시합니다.

그런 다음 다음을 사용하여 코드를 연결할 수 있습니다.

$ avr-ld -mavr4 -Tlinker.x a.out -o output.o

위 명령을 사용하여 연결 한 후 모든.+0은 올바른 값으로 채워졌습니다!

그 이유는/gcc가 이진 파일에 포함 될 다른 것이 무엇인지 알지 못하기 때문에 연결 단계까지는 이진 파일에 포함될 것이기 때문입니다. 모든 개별 객체 파일을 가져 와서 하나로 결합하는 링커입니다. 따라서 링커 단계가 실행되지 않으면 절대 점프로 상대 점프를 채울 방법이 없습니다.

AVR의 어셈블러는 조립 및 링크를 모두 수행합니다. 그러나 GNU 어셈블러는 더 일반적이므로 별도로 연결해야합니다.

다른 팁

나는 그것을 가정합니다 rjmp PC+2 AVR-AS에서 작동하지 않습니까? 그것이 내가 AVR 스튜디오에서하는 방법입니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top