어셈블리 명령어중 push에관한 질문입니다.

binoopang의 이미지

보통 디어셈 할때 push 는 스택에 넣는걸로 알고있는데요 ..

0x80483f6 : pushl 0xffffffd8(%ebp,%eax,4)

이런식으로 인자가 3개 있는경우 어떻게 push 되는지 궁금합니다 !!

아시는 분 답변 부탁드립니다 ^^

Necromancer의 이미지

어느 아키텍쳐인지요.

제가 예전에 인텔 문서에서 본 내용으로는
push 명령은 인수가 1개 밖에 없습니다.
레지스터 아니면 메모리 주소가 들어오죠.

메모리 주소지정에 레지스터 두개 썼는지 획인해보세요.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

grassman의 이미지

IA-32는 겉으로 볼 때 CISC 머신이므로 push 명령에 indirect addressing을 못쓰게 하는 등의 제약을 두지 않습니다. 다만 컴파일러가 만들어 낸 코드들은 효율성 측면에서 push/pop 명령에 레지스터 외의 직간접 메모리 접근을 최대한 기피하는 듯 하더군요.

결론적으로 저 명령은 AT&T 문법에서 Intel 문법으로 바꾸면 push dword ptr [ebp+eax*4-28] 입니다. [ebp+eax*4-28] 위치의 32비트 값을 현재의 esp 위치에 push 하라는 것입니다.

grassman의 이미지

-28이 아니라 -28h입니다.

0xffffffd8 = -0x28