2009-11-19 4 views
2

나는 avr-objcopy를 사용하여 분해 한 이진 파일을 가지고 있습니다. 인터럽트 벡터 테이블은 다음과 같습니다 :AVR 용 GNU 어셈블러를 사용하여 PC에 상대적으로 점프 할 수 있습니까?

 
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 열을 제거하여 다시 형식화하여 정규 어셈블리 파일이되도록했습니다. 예 : 다음

$ avr-as -mmcu=atmega8 test.asm

을 실행하고

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

은, 생성 된 파일을 분해. (-S의 a.out을 objcopy의 사용)처럼 출력은 같습니다

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) 

그래서 어떻게 AVR-로 PC 상대 점프를 존중하는 얻을 수 있나요?

답변

6

답변을 찾았습니다!

조립 중이지만 연결되지 않았습니다. 그래서 어셈블러는 .0으로 모든 상대 점프/호출/분기를 채우고있었습니다.

내가 다음이 포함되어 내가 linker.x라는 사용자 지정 링커 스크립트 작성에 필요한이 문제를 해결하려면 다음

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

이 주소의 텍스트 섹션을 시작하는 링커 지시를 0

그럼 내가 코드를 사용하여 링크 할 수 있습니다 :

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

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

이유는 연결 단계까지/gcc가 바이너리 파일에 포함될 다른 항목을 알지 못하기 때문입니다. 모든 개별 객체 파일을 하나의 객체 파일로 결합하는 링커입니다. 따라서 링커 스테이지가 실행되지 않으면 상대 점프를 절대 점프로 채울 방법이 없습니다.

AVR의 어셈블러는 어셈블 및 링크를 수행합니다. 하지만 GNU 어셈블러는 좀 더 일반적이고 별도로 링크해야합니다.

0

저는 rjmp PC+2이 avr-as에서 작동하지 않는다고 가정합니다. AVR Studio에서이 작업을 수행하는 방법은 ...

+0

팁 주셔서 감사합니다. 나는 그것을 시도했지만 작동하지 않습니다. : 사실 리터럴을 사용할 때 "rjmp. + 0"이외의 다른 것으로 분해 할 수있는 유일한 시간이지만, 더 이상 상대는 아니지만 절대적입니다. – kroylar