• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

스택 관련 어셈블리어에서

22.08.31 11:12 작성 조회수 248

0

  1. 스택 관련 어셈블리어에서 mov와 push가 컴파일러에 따라 다르게 나올 뿐 동일한 기능을 하는 것이라면

main 함수 스택프레임의 지역변수 a,b에 대한 mov 어셈블리어를 실행했을 때에는 esp에 변화가 없었지만

MultiplyBy 함수 스택프레임의 매개변수 a, b에 대한 push 어셈블리어를 실행했을 때에는 esp에 변화가 생겼었는데 왜 그런지 궁금합니다;;

 

  1. 그리고 1개 함수의 스택프레임에는 매개변수 + 반환 주소값 + 이전 함수 ebp + 지역변수가 들어가는 것으로 알고 있습니다

그런데 막상 sub esp, ...을 통해서 해당 함수가 사용할 스택프레임의 영역을 정할 때에는 이미 4개 요소 중 3개가 이미 저장된 상태 같은데 왜 이렇게 되는 것인지 모르겠습니다

(매개변수와 반환 주소값은 이전 함수에서 세팅을 해준다고 하더라도 일단은 해당 함수의 스택 프레임에 속할 텐데)

답변 2

·

답변을 작성해보세요.

0

한울님의 프로필

한울

2022.08.31

자료를 읽었는데도 이해가 안 되는 부분이 있습니다

예를 들어서, 매개변수 a와 b가 mov로 작동되는 경우와 push로 작동되는 경우가 있다고 가정했을 때

push로 작동되는 경우에는 esp가 b가 저장된 주소를 가리키게 된 상태에서, 이후 반환주소값을 push하게 되었으니 반환주소값이 b가 저장된 주소보다 낮은 주소에 정상적으로 입력이 될 수 있을 것 같은 반면

mov로 작동되는 경우에는 a,b가 스택에 들어가는 동안 esp에 변화가 없는 상태에서, 이후 반환주소값을 push하게 되었으니 반환주소값이 a,b가 저장된 공간에도 저장을 시도하지 않을까 싶은 생각이 자꾸 듭니다...

p.s. 매개변수 영역도 ebp - ...형태로 접근 및 사용할 것 같은데 esp를 안 내리는 것은 이유가 있을까요?;;

그렇게 되어 있지 않은 부분을, 잘못되어 있다고 가정하시고 미리 걱정하면 안 됩니다.
직접 esp를 내린 다음 영역을 확보해서 mov를 이용해서 ebp+-? 에 데이터를 넣기도 하고
데이터를 스택에 넣음과 동시에 esp를 내려야 한다면 push를 사용하기도 하지만
각 어셈 명령어 기능에 맞게 코드가 만들어지고, 그 역할을 컴파일러가 함수 규약에 따라 해줍니다.
문제가 있다면 그건 컴파일러 혹은 어셈블리 코드를 만든 사람의 잘못이겠죠.
(말씀주신 부분이 일어날 수 없는 것은 아니겠지만.. 일어나면 그건 그렇게 만든 사람 잘못!)

영어를 공부하면서 첫날 가볍게 Hi John!을 배웠는데
왜 꼭 Hi 다음에 John이 나와야 하는지,
사람들이 John Hi라고 뒤바꿔서 말하하면 어떻게 할지를
첫날부터 미리 걱정하진 않겠죠? 그런 것과 비슷합니다.

한울님의 프로필

한울

2022.08.31

이제 이해가 되는 것 같습니다, 감사합니다!

0

늘 강조 드리지만 프로그래머는 '질문'에 의존하면 안되고,
스스로 답을 찾아 나서는 직군입니다.
99%의 질문은 구글링이나 stackoverflow에 검색하면 답을 얻을 수 있습니다.

  1. push 어셈블리 명령어에 대한 문서를 찾아보시면 답이 있습니다.

    image

https://www.cs.virginia.edu/~evans/cs216/guides/x86.html#:~:text=The%20push%20instruction%20places%20its,location%20at%20address%20%5BESP%5D.

따라서 1번에 대한 답은, 그냥 그렇게 명령어가 만들어져 있기 때문입니다.

2.
image
https://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-they-point

지역 변수 영역은 확보가 되지 않았기에 esp를 내리는 것입니다.
지역 변수들은 ebp-?? 형태로 접근하고 사용하는데, esp를 내리지 않는다면
해당 영역은 사실 '유효 범위' 밖에 있겠죠. 그리고 함수에서 다른 함수를 호출하면
또 다시 [매개변수/ebp/ret] 등을 push해줘야 하는데,
esp를 내리지 않은 상태라면 지역 변수 영역을 덮어쓰게 될겁니다.