2016-09-30 2 views
0

다음 코드 조각과 같이 네거티브 주소 오프셋을 사용하여 스택에서 데이터를 저장하고로드 할 수 있습니까? 스택 경계의 실제 외부 ([sp, #-16] 또는 [sp, #-20]) 인 메모리 주소에서 데이터를 쓰고 읽는 것이 안전합니까? 감사합니다.ARM 어셈블리. 네거티브 오프셋을 사용하여 스택에서 데이터 저장 및로드

stmdb sp, { r4 - r6 } 

mov r4, #255 
str r4, [sp, #-16] 

mov r3, #127 
str r3, [sp, #-20] 

ldr r4, [sp, #-20] 

sub sp, #12 
ldmia sp, { r4 - r6 } 
+1

"할 수있는"의미가 무엇입니까? 분명히 그것은 유효한 명령 암호화이고 주어진 주소에 액세스 할 것이라는 점에서 확실히 안전 할 수 있습니다 (즉, 데이터가 손상되었는지 여부 등)는 OS/환경 및 ABI가 무엇이든지간에 (안전하고 신뢰성 있는지 여부) M- 프로파일 아키텍처와 특정 ABI의 효과적인 구술을 포함한다면 잠재적으로 CPU조차도 마찬가지입니다. – Notlikethat

+0

현재 Android (A - profile) 코드를 작성하고 있습니다. –

답변

3

이것은 아키텍처 나 언어가 아닌 ABI의 질문이므로 궁극적으로는 운영 환경과 시행중인 ABI에 달려 있습니다.

액세스 주소가 SP보다 작 으면 기본 레지스터가 r13이고 음수 오프셋이있는로드 또는 저장소가 완벽하게 유효한 명령어이므로 데이터가 안전한지 여부를 지정하는 것은 ABI뿐입니다 존재 여부, 그리고 그러한 접근이 첫 번째 장소에서 segfault되지 않도록 보장되는지 여부를 결정합니다. 현재 사용중인 대부분의 시스템은 아마도 "유니버설 스택 제약"의 일환으로, procedure call standard 말한다 ARM EABI, 일부 변형을 사용하는 것입니다 :

프로세스 수도의 폐쇄 구간 (읽기 또는 쓰기) 전용 액세스 전체 스택은 [SP, stack-base-1]에 의해 구분됩니다 (여기서 SP는 레지스터 r13의 값입니다).

즉 실제로 아무 것도 그 제약 조건을 위반하지 못하도록 시도하고 시도해보십시오. 모든 베팅은 해제되어 있습니다.

EABI (특히 GNU 변형) 인 Android를 언급 했으므로 Linux 커널이 신호를 보내는 방식이 가장 분명합니다. 프로세스가 str r3, [sp, #-20] 바로 뒤에 신호를 받으면 프로세스 스택을 사용하여 신호 처리기가 실행될 수 있으므로 정상 실행이 다시 시작될 때 SP 자체가 이전과 동일한 값으로 돌아가는 반면 누가 ldr r4, [sp, #-20]을 알 수 있습니까? 실제로로드합니다.

some environments은 스택 포인터 아래에서 수행되는 작업에 대한 추가 보장을 제공 할 수 있으며 사용자가 베어 메탈 시나리오 또는 완전히 제어 할 수있는 경우 원하는대로 수행 할 수 있지만 일반적으로 그렇지 않다면 대답을 "아니오"라고 가정하십시오.