2017-12-09 13 views
1

작은 컴파일러 프로젝트에서 작업하고 있는데 스택의 값 대신 스택 위치의 주소를 푸시하는 방법을 알아낼 수 없습니다 위치. 내 목표는 정수 값을 보유하는 스택 위치 주소를 인쇄하는 C 함수의 void 포인터로 푸시하는 것입니다. 내 궁극적 인 목표는 함수에서 포인터 정수 연산을하는 것입니다. 런타임 라이브러리 확장에서 C 함수를 호출하는데 성공했지만 문제는 어셈블리에서 주소를 푸시하는 방법을 찾는 것입니다.주소의 값 대신 스택 위치 주소를 밀어 넣으십시오.

My C 함수. 내가 주소로 값 42을 주조하고있어 이후

void print(void* ptr){ 
    int* int_ptr = (int*)ptr; 
    printf("*int_ptr is %d\n",*int_ptr); 
} 

내가 지금 무슨에 관해서는 내 조립

.globl main 
main: 
pushl %ebp 
movl %esp, %ebp 
subl $4, %esp 

movl $42, %eax 
movl %eax, -4(%ebp) 

pushl -4(%ebp) 
//Instead of the value at -4(%ebp), I would like the address of -4(%ebp) 
call print 

addl $8, %esp 
leave 
ret 

, 그것은 충돌 것입니다. 좀 더 자세한 정보를 얻으려면 참고 자료 나 자료로 직접 안내해 줄 수 있습니까?

+1

@MichaelPetch 와우! 나는 그게 그렇게 간단하지 않다고 믿을 수 없다. 정말 고맙습니다! – Miket25

답변

3

일반적으로 LEA 명령어를 사용하여 유효 주소가 -4(%ebp)이고 레지스터에 배치하면 스택 기반 주소의 주소를 가져올 수 있습니다. 그런 다음 해당 레지스터를 스택으로 푸시 할 수 있습니다. LEA 명령은 instruction set reference이 방법을 설명한다 :

첫 번째 피연산자 (대상 피연산자)에서 두 번째 피연산자 (소스 피연산자) 저장을의 실효 어드레스를 계산한다. 소스 피연산자는 프로세서 주소 지정 모드 중 하나를 사용하여 지정된 메모리 주소 (오프셋 부분)입니다. 대상 피연산자는 범용 레지스터입니다. 이 같은 코드 뭔가에

은 일한 것 :

lea -4(%ebp), %eax 
push %eax 

이 효과적으로 기능 print에서 사용할 스택에 -4(%ebp)의 주소를 전달해야합니다.