2016-09-19 9 views
1

Thumb-2 어셈블리 코드에서 다음 명령어에 대한 포인터를 저장해야하는 상황에 처해 있습니다. Thumb-2 명령어는 16 비트 및 32 비트 일 수 있으므로 하프 워드로 정렬됩니다. add에서 소스 피연산자로 PC을 사용할 때 실제로는 워드 정렬 된 프로그램 카운터 + 4 (즉 현재 명령보다 2 또는 4)를 읽습니다. 따라서 다음 명령 주소를 얻기 위해 현재 프로그램 카운터에 0 또는 2를 추가해야합니다.ARM 어셈블리 전처리에서 정렬 얻기

단어 경계에서이 명령어를 사용하려면 .align을 사용할 수 있습니다.이 경우 간단히 0을 추가 할 수 있습니다. 그러나 필요하지 않은 경우 nop을 사용하지 않습니다.

다음과 같은 것이 가능한가요? 내가 nop을 사용할 수 없습니다

.if alignment_of_next_instruction % 4 == 2 
     add r12,pc,#2 
.else 
     add r12,pc,#0  @ just an example, mov would be better 
.endif 
     str r12,[sp,#-4]! 

이유는 어떤 경우에는 내가 다음 명령어의 주소를 얻을 필요는 없지만, 그 이후의 명령, 또는 추가 심지어 한 것입니다. 이 경우 add이 필요하지만 10이나 12를 추가해야하는지 여부는 정렬에 따라 다릅니다. 이 명확하지 않으면

가 여기 .align 내 제안 구문과 같을 것이다 것입니다 :

.if alignment_of_next_instruction % 4 == 2 
     nop 
.endif 

내가 ARM의 SDK 참조 가이드에서 아무것도 찾을 수없는, 섹션 어셈블러 식 및 운영 (5.9), 하지만 어쩌면 내가 다른 곳을 봐야 할 것입니다.

+0

NOP로 패딩하는 대신 더 길지만 동등한 명령어를 사용하는 것은 x86에서 알려진 기술입니다 (정확히 동일한 명령어의 경우 다른 인코딩을 사용할 수있는 경우가 많지만 어셈블러가 대신 사용하지는 않습니다). 잘 알고 있듯이 오픈 소스 어셈블러에서 이와 같은 것을 구현하려는 사람도있을 것입니다. 이런 식의 실행 가능한 구문을위한 아이디어이기 때문입니다. –

+0

@PeterCordes 필자는 더 길거나 (더 짧은) 동등한 명령어가 있다고 생각하지 않는다.이 'add'는 이미 32 비트이며, 16 비트로 만들 방법이 없다. ARM에서는 모든 옵션이있다. 너는 얻는다. 나는 아침에''as '소스 코드가 어떻게 보이는지 보거나 binutils 목록에 이메일을 쓸 것이다. – Keelan

+0

추가하기 전에 어딘가에 * 명령을 사용하여 작업 할 수 있습니까? 그래서 항상 'mov'에 대해 원하는대로 정렬되어 있습니까? (장래의 파손을 막기 위해서'.p2align 2'를 앞에 놓으십시오. 누군가 당신이 어디에서 정렬을하고 어디에서 필요한 코드가 바뀌면 NOP를 받게 될 것입니다. 그래서 지금 당장은 패드를 칠 필요가 없습니다 그러나 장래에 파손 대신 패딩이 생길 것입니다. 요구 사항을 위반하면 빌드 타임 오류를 만드는 데이 조건부를 사용하십시오. –

답변

2

오히려 단지 레이블 지침, 즉의 관점에서 사물을 를 지정, 주소 및 오프셋의 관점에서 해결하려고 노력에 대해 faffing 이상 :

adr r12, 1f 
    ... 
1: <instruction of interest> 

어셈블러와 링커는 어떻게 해야할지.

+0

나는 그것이 가장 쉽고 내가 그것을 보았어 야한다고 생각한다. 고마워. – Keelan