어셈블리

김대익·2022년 2월 22일
0

프로그래밍 중에 어셈블리를 보는 경우는 거의 없고
빠른 코드를 짜기 위해서는 benchmark나 profile을 찍어보는게 더 맞는 방법이다.

그럼에도 어셈블리를 공부하는 이유는

  • c++컴파일러가 코드를 어떻게 최적화시키는지 알 수 있다
  • 각 아키텍처마다 machine code가 어떻게 생성되는지 알 수 있다


라는 코드가 있을 때 -S옵션으로 어셈블리 파일을 얻을 수 있다.

실제 커맨드환경에서 어셈블리를 직접 확인하는 것은 비효율적이여서

구글에서 compiler explore c++를 검색해

를 사용하는 것이 좋다.


빨간펜으로 그린 부분을 보면 아키텍처, 컴파일러, 컴파일러 옵션도 모두 적용이 가능한 것을 알 수 있다.

보통 bit shift가 그냥 곱하기보다 더 빠르다고 생각하지만 실제로 어셈블리코드를 보면 둘이 동일하다는 것을 알 수 있다.
따라서 이해하기 좋은 곱하기를 사용하는 것이 낫다.



세 줄만에 끝나는 첫 번째 코드가 다섯 줄이나 되는 이유는
컴퓨터 아키텍처에 따르면 idiv명령어가 imul에 비해 5배 많은 clock이 필요하므로
아래 다섯 줄 코드가 더 빠르기 때문이다.



gcc에서는 if else보다 switch case가 더 효율적인데
인수를 4와 비교해주는 cmp edi, 4까지 도달하는데 아래 switch case문이 코드 수가 더 짧은 것을 알 수 있다.
하지만 clang에서는 완벽하게 동일한 어셈블리코드를 반환한다.

0개의 댓글