홈>
int suma(int* array, int len)
{
asm(" xor %eax, %eax # resultado = 0 \n"
" xor %edx, %edx # i = 0 \n"
"1: add (%rdi,%rdx,4), %eax # res += array[i] \n"
" inc %edx # ++i \n"
" cmp %edx,%esi # i < len? \n"
" jne 1b # repetir \n"
// " ret \n"
);
}
int main()
{
int v[100];
return suma(v, 100);
}
gcc가 왜
ret
를 삽입 하는가
suma()
의 끝에서
-O0
에서
하지만
-O3
에 직접 추가해야합니다.
?
gcc -v
에서
:
gcc version 8.2.1 20181011 (Red Hat 8.2.1-4) (GCC)
- 답변 # 1
관련 자료
- vim - 왜 vundle은 apt와 함께 사용할 수 없습니까?
- segmentation fault - c에서 atoi와 함께 segfault를 얻는 이유는 무엇입니까?
- c# - 태스크가 CancellationToken과 연결되는 이유는 무엇입니까?
- html - 높이가 100 % 인 오버플로가 발생하는 이유는 무엇입니까?
- microcontroller - 세마포어와 함께 ISR 함수를 사용하는 이유는 무엇입니까?
- mysql에서 정규식으로 조인을 사용할 수없는 이유는 무엇입니까?
- cassandra - 이름 프로필로 UDT를 만들 수없는 이유는 무엇입니까?
- unity3d - 왜 다른 유형으로 컴파일됩니까?
- python - URL이 pk2가 아닌 pk 매개 변수와 작동하는 이유는 무엇입니까?
- .net - CORS가이 구성으로 작동하지 않는 이유는 무엇입니까?
- 왜 타입 스크립트에서`any`로 강력한 타입이 손실됩니까?
- html - 왜 스크롤바가 사라 집니까?
- redirect - 사이트가 nginx로 리디렉션되지 않는 이유
- C 코드를 Ubuntu의 라이브러리와 연결할 수없는 이유는 무엇입니까?
관련 질문
- GCC가 정렬에 필요한 것 이상으로 스택에 필요한 것보다 더 많은 공간을 할당하는 이유는 무엇입니까?
- 점프와 두 개의 return 문이 있는 C의 인라인 어셈블리
- c : 피연산자 뒤에 쉼표, 콜론, 데코레이터 또는 줄 끝이 예상됨
- 다음 code에 해당하는 ARM code를 작성합니다. if (A==B) AND (C!=D):A=A+1. A, B, C, D는 정수를 보유하는 메모리 위치입니다.
- assembly : 지원되지 않는 명령어 'mov'
- 버퍼 오버플로 중 분할 오류이지만 EIP를 덮어쓰지 않음
- __attribute__((section("name"))) 사용법?
- c++ : -O0 대 -O3의 __rdtsc()에 대한 어셈블리 code
- c : 실행 릴리스 파일에서 생성된 코어 덤프 파일을 디버그하는 방법은 무엇입니까?
- avr-gcc: EEMEM과 함께 __attribute__((address))를 사용하는 방법은 무엇입니까?
와이즈 비즈
주된 질문에 대답하기 위해 컴파일러는 단순히
__attribute__((naked,noinline))
를 인라인합니다.suma
로 . 암시 적으로main
입니다 (기본 asm 문이므로) 최적화되지 않습니다.그러나 비 공여 기능 (
volatile
)의 끝에서 실행 ), 정의되지 않은 동작이므로 현대 GCC는suma
를 포기하고 생략합니다. 교수. 실행은 정의되지 않은 동작으로 인해 해당 경로를 사용할 수 없으며 코드 생성을 방해하지 않는다고 가정합니다.ret
를 추가하면return 0;
의 끝까지 그런 다음suma
main
로 끝날 것입니다 지시.<source>: In function 'int suma(int*, int)': <source>:13:1: warning: no return statement in function returning non-void [-Wreturn-type] } ^
에 대한 결과 asm 출력 이것은 RDI가main
이기 때문에 물론 완전히 고장났습니다. ;그것은argc
를위한 공간을 예약하지 않았습니다 C 소스에서 사용되지 않거나 무언가를했기 때문입니다.main: xor %eax, %eax # resultado = 0 xor %edx, %edx # i = 0 1: add (%rdi,%rdx,4), %eax # res += array[i] inc %edx # ++i cmp %edx,%esi # i < len? jne 1b # repetir
와 함께return 0;
의 끝에서 , 그것과suma
의 주요 끝 ;와이즈 비즈 물론xorl %eax, %eax
인라인 asm이 입력 제약 조건을 사용하지 않기 때문에 여전히 완전히 손상되었습니다.ret