2014-10-23 2 views
2

더 쉽게 액세스 할 수 있도록 어셈블리 코드를 C 프로그램에 통합하려고합니다. 내가 변화하지 않는 것인라인 어셈블리 스택 동작

void push(long address) { 
     __asm__ __volatile__("movq %0, %%rax;" 
          "push %%rax"::"r"(address)); 
} 

(AN 64 64 비트 아키텍처에 난) $의 RSP의 값을 다음 코드를 실행하려고 (도 그 문제에 ESP 않습니다). 제약 조건이 작동하는 방식에 대해 확실하지 않은 것이 있습니까? rax가 주소와 함께 올바르게 할당되고 있지만 주소가 스택에 푸시 된 것으로 보이지 않습니까?

+0

나는 컴파일러가 스택 포인터를 저장하고 복원하는 함수의 프롤로그 및 에필로그를 생성한다고 추측하고있다. 당신은 아마 그것을''naked'라고 표시해야 할 것입니다. (https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html) –

답변

3

당신은 그렇게 할 수 없습니다.

인라인 asm은 입력 내용, 생성되는 출력 및 실행의 일부로 충돌하는 다른 상태를 컴파일러에 기록해야합니다. 여러분의 코드는 그렇게하지 못하지만, 아마도 더 많은 것을 요할 것입니다. 주변의 코드가 asm 블록 다음에 제어권을 다시 얻었을 때 스택 포인터를 마비시킬 수있는 방법이 없습니다. 방법으로 데이터를 찾을 수 있습니다. 스택에 데이터가 저장되어 있다고해도 데이터가 쌓이지 않을지라도 스택을 다시 가져올 방법이 없습니다.

나는 무엇을 하려는지 확실하지 않지만, 그것이 무엇이든간에, 이것은 그것을하는 방법이 아닙니다.

+0

clobbering이라고 할 때,이 경우 rax를 써야한다는 것을 의미합니다. rsp가 clobbered 것으로? (지금 당장은 프로그램을 segfaulting한다고 가정하고, 동작을 이해하고 싶다. asm 블록은 함수가 아니기 때문에 스택 프레임이나 리턴 주소가 없다.) – user1018513

+0

내가 말했던 것처럼 당신이하려는 일을하는 방법은 절대적으로 없습니다. 스택 포인터를 clobber하려고한다는 것을 나타낼 수 있다고하더라도 주변의 코드는 휴지통으로 계속 진행할 방법이 없습니다. 복구 방법이 있다면 수행하려는 작업을 취소합니다. –

+1

당신의 혼란은 함수 하나 (또는 ​​인라인 asm 문)로 단일 푸시를 고려할 수 있다고 가정합니다. 대신, 어떤 목적 으로든 데이터를 스택으로 밀어 넣으려면 스택 조정이 균형을 이루도록 하나의 asm 블록에서 전체 작업을 수행해야합니다. 이렇게하면 스택 포인터는 스택 포인터가 정확하게 시작되었습니다. –