○제어문
▶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 |