티스토리 뷰

참조 : http://tikifr.egloos.com/4481530

[ 위 블로그에 올라온 글 ]

펜티엄상의 PUSH, POP은 파이프라인의 효율적인 스퍼스칼라을 동작을 방해합니다.
같은 동작을 함에 있어 펜티엄의 경우 최소 10클럭이 필요하지만, ARM에서는 이론상 최소 3클럭(MOV4개 1클럭, CALL 2클럭)만으로 함수 호출이 가능합니다.

PUSH, POP은 RISC계열의 CPU들에서는 악(惡)으로 간주되어서 명시적인 SP레지스터와 PUSH, POP 명령어가 없습니다.
수퍼스칼라가 몇개건 PUSH, POP을 사용하는 동안에는 하나의 명령어만이 실행가능합니다.
참고로, 대개의 RISC계열예서는 범용 레지스터중 하나를 SP로 사용하며 그 SP조차조 ADD 또는 SUB 명령으로 PUSH, POP 효과를 냅니다.

위 글이 참고가 될까 해서 구글 사마에게 여쭤봤는데,
당체 알아먹을 수 없는 글들 뿐이라서 그냥 아는 분께 질문을 하기로 했다.

그러나, 얻은 대답이 단순한 듯 하면서도 가장 명쾌한 대답이였다.

내가 의문을 갖은 코드 'add esp, 8' 가 이용된 곳이
때마침 '단순히 스택을 버리는 곳'이였던 것이 핵심이였다.

함수 호출을 위해서 PUSH 했던 데이터가
printf 호출 이후에 더이상 필요가 없기 때문에 POP 해서 버려야 했는데
POP 연산 자체가 ESP의 데이터를 읽어서 레지스터에 값을 저장하는 과정이기 때문에
단순 ESP를 증분(ADD) 하는 것에 비해서 오버헤드가 더 크다는 것이다.

  00280    68 00 00 00 00     push     OFFSET FLAT:$SG58206
  00285    68 20 00 00 00     push     OFFSET FLAT:__iob+32
  0028a    e8 00 00 00 00    call       _fprintf         <--- fprintf 수행 이후에는 
                                                                          이전에 push 했던 내용은 더이상 필요가 없음

  0028f     83 c4 08            add        esp, 8        <--- 따라서 pop 대신, esp 를 증가만 해줌

아마, POP 해서 가져오는 데이터가 필요한 경우에는 POP 이 이용될 것이다.
그게 아니라, 단순히 버리는 데이터라면 ADD 가 이용되겠지...

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함