C 프로그램에서 생성 된 어셈블리 코드의 의미를 찾으려고합니다. 다음은 C로 작성된 프로그램입니다 :컴파일러가 쓸모없는 어셈블리 코드를 생성 할 수 있습니까?
int* a = &argc;
int b = 8;
a = &b;
설명과 함께 생성 된 어셈블리 코드입니다. 주의
프롤로그 :
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
로드 %의 EAX에는 argc의 주소 :
movl %ecx, %eax
부분 내가하지 않습니다 이해가 안 한 부분이있다
movl 4(%eax), %edx
movl %edx, -28(%ebp)
스택 스매싱 보호 코드 (설정) :
A와 B의 6,movl %gs:20, %ecx
movl %ecx, -12(%ebp)
xorl %ecx, %ecx
부하 값 (main.c에의 참조)
leal -20(%ebp), %eax
movl %eax, -16(%ebp)
스택 스매싱 프로텍터 번호 :
movl %eax, -16(%ebp)
movl $8, -20(%ebp)
은 (a = & b)의 값을 수정 (확인 적층인지 확인)
movl $0, %eax
movl -12(%ebp), %edx
xorl %gs:20, %edx
je .L7
call __stack_chk_fail
를 스택이 정상이면 :
.L7:
addl $36, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
그래서 내가 사용하지 않는 부분은 사용되지 않은 주소 인 -28 (% ebp)의 값을 수정합니다. 누군가이 부분이 생성 된 이유를 알고 있습니까?
최적화하지 않고 컴파일하면 (기본값) 컴파일러 출력에는 필요하지 않더라도 메모리에 대한 모든로드/저장이 포함됩니다. 코드를 가져 와서'main'이 아닌 함수에 넣고 최적화 ('-O3')로 컴파일하십시오. –
main()을 사용하지 말고 테스트중인 코드를 다른 함수 이름으로 만드십시오.main() 질문은 질문을 받고 수십 배의 답변을했습니다 ... –
당신은 컴파일러에게 최적화 플래그를 지정하지 않음으로써 뇌를 끄고 이상한 코드를 생성하는지 궁금합니다. – fuz