다음과 같은 의문점이 있습니다.빨간색 영역이있을 때 스택 할당이 필요한 이유는 무엇입니까?
시스템 V x86-64 ABI는 스택 프레임에서 소위 redzone이라는 고정 크기 영역 (128 바이트)을 제공합니다. 따라서 예를 들어 sub rsp, 12
과 같이 사용할 필요가 없습니다. 그냥 mov [rsp-12], X
을 만들면됩니다.
그러나 나는 그 생각을 이해할 수 없습니다. 왜 중요합니까? redzone없이 sub rsp, 12
해야합니까? 결국, 스택 크기는 처음에 제한되어 있으므로 sub rsp, 12
이 중요한 이유는 무엇입니까? 우리가 스택 맨을 따라갈 수는 있지만 그 순간 그것을 무시하자.
일부 명령어는 rsp
값 (예 : ret
)을 사용하지만 그 순간에는 신경 쓰지 않습니다.
문제의 핵심은 다음과 같습니다 우리는 더 레드 존이없고 우리가했던 :
function:
mov [rsp-16], rcx
mov [rsp-32], rcx
mov [rsp-128], rcx
mov [rsp-1024], rcx
ret
가와 차이가 있습니까?
function:
sub rsp, 1024
mov [rsp-16], rcx
mov [rsp-32], rcx
mov [rsp-128], rcx
mov [rsp-1024], rcx
add rsp, 1024
ret
여기에 표시된 두 번째 코드 스 니펫이 잘못되었습니다. 스택 포인터를 감소 시키면 함수에서 복귀하기 전에 스택 포인터를 복원해야합니다. 그래서'ret rss 앞에'add rsp, 1024'를 추가해야합니다. –
어느 ABI입니까? 나는 리눅스를 가정하지만, 다른 것들도있다. Windows 64, Mac OS X 64 비트 등. –
@rudy 필자가 이해하는 한, 단지 두 개의 x86-64 ABI 만 있습니다 : System V AMD64 ABI (Linux, Solaris, OS X 및 기타 POSIX에서 사용됨) 호환 운영 체제) 및 Windows에서 사용되는 Microsoft 구현. 문제는 전자에 관한 것 같습니다. –