펌웨어 모듈을 작성하려고합니다. 기존 펌웨어에는 소스 코드가 없습니다. 모든 Thumb 코드.펌웨어 패치를위한 ARM/Thumb 코드 ... gcc 어셈블러/링커를 BL로 절대 addr로 연결하는 방법은 무엇입니까?
사람이 어떻게 gcc as
(GAS) 어셈블러에서이 작업을 수행하는 어떤 생각을 가지고 않습니다 BL
'나의 코드에서 기존의 일부 기능 (에 보내고 할 때 수동으로 오프셋을 계산하지 않고 사용 BL
..하지만 난 내가 BL
을 사용하려는 경우
현재 알고 자신의 주소), ... 난에 있습니다 내 코드 -figure 아웃 돌아 가자 가자하고 모든 이전의 지침을 조립하여 발생 될 모든 바이트를 추가 함수를 쓰고 있어요 - 내 함수의 시작 주소를 추가 (내가 지정 링커 스크립트에서 쓰고있는 것의 시작 주소) - 전화하고자하는 firmfunc 함수의 주소를 빼십시오.
이 모든 것 ... 가능할 수있는 오프셋을 계산하는 것입니다. bl
오프셋을 쓰면 기존 펌웨어 기능을 호출 할 수 있습니까? 그리고 그 BL 전에 코드를 변경하면 수동으로 다시해야합니다! 내가 잘 BX
를 사용하는 방법을 배우게 할 이유
참조 .. 이 내가 꽤 BX를 이해하지 못하고, 대신 BL
의 ...입니다. 내가 BX를 사용하여 절대 주소로 이동할 경우, Thumb 코드에서 lsb 바이트 1을 유지하기 위해 Thumb 코드를 계산할 때 실제 주소를 1 씩 증가시켜야합니까 ... CPU가 엄지 코드를 알 수 있습니까?
대하여 절대 아니다를에만 프로그램 카운터 상대 주소로 분기 할 수있다. 이것은 고정 된 단어 길이 명령 세트입니다. bx를 사용하여 모드를 전환 할 수는 있지만 레지스터로 제한됩니다. 위에서 설명한대로 또는 가능하면 모드에 기반하여 사용하십시오 (암 모드에서만 작동 할 수도 있음) ldr pc , = function_name은 긴 분기이고 다른 단어를 사용합니다 (가변 길이 길이 명령어와 같습니다)하지만 bx는 분기 링크가 아닌 분기입니다. –
감사합니다. 좋은 설명입니다. 하지만 나는 펌웨어에서 기존의 엄지 손가락 기능을 BL로 할 수 있기를 원합니다. 그 주소는 알고 있습니다. 이런 방식으로 나는 LR을 망쳐 놓지 않아도되지만 어셈블러 나 링커 스크립트에 넣는 방법을 모르겠다. BL LABEL처럼 어셈블러에게 어떤 레이블을 붙여야하는지 알려줘야한다. 그게 내 코드에 없기 때문에 ... 그리고 그걸 어떻게 말할 지 모르겠다. – vmanta
나는 대답을 받아 들일 것이다. 그것은 좋은 정보이다 ... 누군가가 .. pls 답을 안다면 여전히. 방법이 있어야합니다. 링커가 가져 오는 함수 (코드에서 호출하는 외부 함수)에 링크하는 방법 - asm 또는 링커 스크립트에서이 지시어에 사용할 지시문은 무엇입니까? – vmanta