2016-07-06 4 views
-1

인수없이 함수를 호출하려고합니다. 나는 함수의 주소가 EAX 레지스터에 있다는 것을 안다. 그 일이 코드가 아닙니다 이유 :동일한 레지스터를 두 번 푸시하는 이유는 무엇입니까?

push EAX 
push EAX 
ret 

는이 하나의 함수 호출 :

push next_a 
push EAX 
ret 
next_a: 

next_a 내가 전화하고 싶은 기능입니다. 하지만이 기능의 주소가 EAX에 있음을 알고 있습니다

EAX를 두 번 밀어 내고있는 것은 무엇입니까?

+0

더 많은 코드를 게시 할 수 있습니까? "next_a"란 무엇입니까? 질문 아래의 "수정"을 클릭하고 코드를 추가하십시오. –

+0

이것은 내가 부르고 싶은 기능이다. 하지만이 함수의 주소가 EAX에 있다는 것을 알고 있습니다 ... –

+1

이것은 시험에서 얻은 질문입니다. 나는 쉬운 전화가 다만 사용 전화다는 것을 알고있다; 교수는 첫 번째 예제가 작동하지 않는다고 말했고 나는 왜 –

답변

2

그냥 어떻게 될지 잘 지켜보십시오. 함수 foo을 호출 해 봅시다.

push eax ; address of foo on the stack 
push eax ; address of foo on the stack again 
ret  ; picks off the top item from the stack, goes to foo 

foo: 
; body of function 
ret  ; picks off the top item from stack, which is still foo 
     ; so invokes itself again 

두 번째 예 : 이와 같이

push next_a ; address of next_a on the stack 
push eax ; address of foo on the stack 
ret   ; picks off the top item from the stack, goes to foo 

foo: 
; body of function 
ret  ; picks off the top item from stack, which is next_a 

next_a: 
; execution continues here 

먼저 전화 foo두 버전. 어쨌든 foo (XY 문제)으로 전화를 걸려면 call eax을 사용하고 처리하십시오.

next_a는 내가 부르고 싶은 기능이다.

정말요? eax=next_a이면 두 코드가 정확히 동일합니다.

+0

어떤 이유에서든 교수의 교수는 첫 번째 예제가이 함수를 호출하지 않는다고 말했습니다. 왜 내가 잘 작동하지 않는지 알기 위해 노력하고 있습니다 ... –

+1

@TalShani : 글쎄, 그것은 함수로 점프하지만 실제로는 아닙니다. 왜냐하면'call '과 같은 리턴 주소를 보내지 않기 때문이다. –

+0

감사합니다! 대신에 반송 주소를 무엇을 압박하고 있는지 아십니까? –

관련 문제