Computer Architecture/CS APP

[CS] switch문 내부 동작 원리 (Switch Statement)

  • -

switch문은 정수 인덱스 값에 따라 다중분기 기능을 제공한다.

GCC는 case 값의 밀집도 case의 수를 고려해서 switch문의 번역 방법을 선택한다.

 

장점

switch문을 사용하면 C 코드를 읽기 쉽게 해줄 뿐만 아니라 점프 테이블을 사용해서 효율적인 구현을 가능케 한다.

다단계의 if-else문을 사용하는 것보다 switch문을 실행하는 데 걸리는 시간이 case 수에 관계없다는 장점이 있다.

 

예제

(a)는 C로 구현한 간단한 switch문 예제

(b)는 (a)를 컴파일할 때 생성된 어셈블리 코드의 동작을 C로 나타낸 것

 

  1. 점프 테이블인 배열 jt는 7개의 원소를 가지고 있으며, 이들은 각 코드 블록의 주소다.
  2. jt의 비어있는 원소에는 default 블록 주소를 넣는다.
  3. 컴파일러는 먼저 인자 n에서 100을 빼서 범위를 0에서 6으로 만들어 index 변수에 삽입했다.
  4. index 변수는 unsigned로 하여 범위가 0~6인지를 검사하기보다 6보다 큰지를 검사하여 단순화 시켰다
  5. 코드 16번째 줄에서 jt를 역참조하는 goto문이 실행된다.

 

어셈블리

 

  1. loc_A (.L3), loc_B (.L5), loc_C (.L6),  loc_D (.L7),  loc_def (.L8), done(.L2)
  2. jmp instruction의 operand(인자)는 *로 시작하며 간점 점프를 나타냄
  3. operand는 index 값을 저장하는 레지스터 %rai가 메모리 위치를 지정하는 index로 사용된다.

 

점프 테이블 in 어셈블리

 

.rodata (Read-only Data)라고 부르는 목적코드 세그먼트 내에서7개의 quad(8바이트) 워드가 존재하고
이들은 각각 어셈블리 코드 레이블들에 연관된 instruction 주소다.

 

 

『Computer Systems: A Programmer's Perspective』 책을 읽고 정리한 글입니다.
검색을 허용하지 않고, 수익을 창출하지 않습니다.
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.