○제어문

 ▶Processor State: 현재 실행중인 프로그램에 대한 정보

  ▷임시 데이터 (%rax ...)

  ▷runtime stack 위치 (%rsp)

  ▷현재 코드 control point (%rip ...)

  ▶Condition Code 

   ▷CF (Carry flag): 최상위 비트로부터 carry/borrow out이 일어났는가? (unsigned overflow)

   ▷ZF (Zero flag): 0인가?

   ▷SF (Sign flag): 0보다 작은가? (signed로 취급) -> 최상위 비트가 1인가?

   ▷OF (Overflow flag): 2의 보수에서 overflow가 일어났는가? (a>0 && b>0 && t<0 || a<0 && b<0 && t>0)

   ▶코드 읽기 (SetX Instructions)

    ▷아래의 명령어들을 통해 한 바이트 값에 SetX 명령의 결과값을 입력한다. 

    ▷매개변수 = 이전 연산의 Condition Code

    ※규칙

      ▷n: not

      ▷s: signed

      ▷g: greater (signed)

      ▷l: less (signed)

      ▷e: equal

      ▷a: above (unsigned)

      ▷b: below (unsigned)

 

▷주로 최하위 비트를 이용한다.

    ▷주로 Zero Extension을 사용하여 결과를 확인한다.

 

 ▶Conditional Branch (가정문)

  ▶Jump

   ▷라벨의 부분(Label - ~: )으로 이동한다.

   ▷C의 goto문과 유사하다.

   ▷SetX와 유사한 조건을 공유한다.

   ◎If -> Jump

 

  ▶Conditional Move (cmov[조건])

   ▷if (조건) Dest <- Src

   ▷GCC가 해당 연산이 안전하다고 확인하면, Jump대신 사용한다.

   ▶장점

    ▷순차수행(Control Transfer가 일어나지 않음)하여 pipe-lining에 적합함.

   ▶불가능한 경우 (두 경우의 연산 모두 시행되기 때문에 생기는 위험)

    ▷연산의 비용이 높은 경우 (함수 호출)

    ▷연산이 조건에 영향을 주는 경우 (x += 1)

    ▷NUL포인터를 참조하는 경우

   ◎if -> cmov

 

 ▶Loop (반복문)

  ▷Do-While문의 해석을 기본으로 함.

  ▷do -> Label / while -> if(조건) go to do

  ▶While 해석

   ▷Jump-to-middle : 반복문 시작에 Do-while의 조건검사로 Jump

   ▷Do-while conversion : While문을 Do-while 형식으로 바꿈

  ▶For 해석

   ▷For문의 Init Test부분은 컴파일러에 따라 생략가능 (초기 상태를 지정하기 때문)

 

 

 

 ▶Switch

  ▷if-else문을 기본으로 하지만, 여러 예외를 경계해야함

   ▷Multiple case labels (여러 라벨이 동일 연산)

   ▷Fall through cases (break문이 없을 때 다음 case의 연산도 진행)

   ▷Missing cases (없는 조건)

 

  ▶Jump Table

   ▷case에 따른 CodeBlock으로 이동함.

   ▷조건 변수(x)가 양수이며, 어느정도 연속된 경우에는 x를 Index로 사용 가능

   ▷조건 변수가 서로 멀리 떨어져있는 경우, if-else문 처럼 해석

  ◎Jump Table을 이용한 Switch문 변환

  ▷ja .L8 : unsigned 비교를 통해 음수(최상위 비트가 1)와 범위보다 큰 양수값들을 default (.L8)로 보냄.

  ▷jmp *.L4(,%rdi,8) : L4+8*%rdi의 위치로 이동함. * -> 간접점프를 의미?

  ▷.quad : 8바이트 지정

 

  ▷x = 0, 4: default (,L8)

  ▷x = 1: .L3

  ▷x = 2, 3: 2에서 fall through 발생. w의 초기화를 x = 3에서 하는 이유는 초기화를 x = 3일 경우에만 하면 되기 때문, 그로 인해 x = 2에서 x = 3이 아니라 x = 2, 3이 동시에 진행하는 다른 Label(.L6)로 이동함.

▷x = 5, 6 / default: 5, 6은 같은 Label이용.

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Assembly - Array  (0) 2020.10.29
Assembly - Procedure  (0) 2020.10.28
Assembly  (0) 2020.10.07
Architecture / Machine Code  (0) 2020.10.07
Float  (0) 2020.10.07

+ Recent posts