저는 지금 당분간 어셈블리를 연구 해왔고 그걸 이해하기 시작했습니다. 그러나 이해할 수없는 한 가지 이 작은 프로그램 (& T 구문 AT, 64 비트 GNU 컴파일러로 컴파일 된 코드를)함수를 호출 할 때 스택 포인터를 감소시킬 필요가있는 이유는 무엇입니까?
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
call __main
movl $0, -4(%rbp)
movl $4, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %eax
addl %edx, %eax
movl %eax, -12(%rbp)
movl -4(%rbp), %edx
movl -12(%rbp), %eax
addl %eax, %edx
movl -8(%rbp), %eax
addl %edx, %eax
movl %eax, -16(%rbp)
addq $48, %rsp
popq %rbp
ret
을 : 우리는이 코드를 살펴 로컬 변수에 대한 로밍을 떠날 스택 포인터를 감소시키는 데 필요한 않는 이유입니다 나는 그 모든 것을 esp를 48만큼 줄이지 않고도 할 수 있다고 상상할 수있다. 나는 base pointer를 사용하여 stack과 값을 이동시키고, esp가 ebp를 pop하고 반환 할 준비가되어있는 같은 위치를 가리킬 수있다. 누군가 지역 변수에 "방"을 남겨 둘 필요가있는 이유를 분명히 할 수 있습니다. 감사합니다. !! 어리석은 질문 인 것 같으면 사과드립니다
좋아요, 스택 포인터를 감소시키는 요령은, 우리가 다른 함수를 호출 할 때'mov "return address", -52 ($ ebp)'와 같은 일을하는 번거 로움을 덜어주기위한 것입니다. 항상 ebp를 줄입니다. 우리는 새로운 함수에 대한 지역 변수를 삽입하고, alsp는 각 프레임의 beginig와 end를 추적합니다 (ebp를 밀고 esp를 줄임으로써). – user3769877