AVR 용 GNU 어셈블러를 사용하여 PC에 대해 어떻게 점프 할 수 있습니까?
-
21-09-2019 - |
문제
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 스튜디오에서하는 방법입니다 ...