Compilers: Understanding assembly code generated from small programs에서 컴파일러는 스택 포인터를 조정하지 않고 두 개의 로컬 변수를 사용합니다. 지역 변수의 사용을 RSP을 조정하지RSP를 조정하지 않고 로컬 변수를 사용하는 컴파일러
는그래서 컴파일러는 인터럽트가 발생할 때 자동으로 시스템 스택으로 전환 하드웨어에 의존하는 것 같다 안전 방해하지 을 보인다. 그렇지 않으면 첫 번째 인터럽트는 명령 포인터를 스택으로 밀어 넣어 로컬 변수를 덮어 씁니다.
질문의 코드이다 :이 컴파일러에 의해 생성
#include <stdio.h>
int main()
{
for(int i=0;i<10;i++){
int k=0;
}
}
어셈블리 코드 :
00000000004004d6 <main>:
4004d6: 55 push rbp
4004d7: 48 89 e5 mov rbp,rsp
4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0
4004e1: eb 0b jmp 4004ee <main+0x18>
4004e3: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
4004ea: 83 45 f8 01 add DWORD PTR [rbp-0x8],0x1
4004ee: 83 7d f8 09 cmp DWORD PTR [rbp-0x8],0x9
4004f2: 7e ef jle 4004e3 <main+0xd>
4004f4: b8 00 00 00 00 mov eax,0x0
4004f9: 5d pop rbp
4004fa: c3 ret
로컬 변수 [rbp-0x4]
에서 [rbp-0x8]
에서 i
및 k
이다.
누구든지이 인터럽트 문제에 불을 붙일 수 있습니까? 하드웨어가 실제로 시스템 스택으로 전환합니까? 방법? 내 이해가 틀렸어?
아마도이 부분이 흥미로울 수 있습니다. http://stackoverflow.com/questions/28759227/which-stack-is-used-by-interrupt-handler-linux – 4386427