Processor State?
Single bit registers
Explicit Reading: setX 위의 CF, ZF, SF, OF를 읽고 이에 따라 한 자리를 바꾸는 setX 명령어 setX Dest : Dest 의 마지막 (low) 한 바이트를 0 또는 1로 바꾼다.
즉 조건문의 결과를 저장하는 데에 사용할 수 있다.
| setX | condition | 설명 |
|---|---|---|
| sete | ZF | |
| setne | ~ZF | |
| sets | SF | |
| setns | ~SF | |
| setg | ~(SF^OF)&~ZF) | > |
| setge | ~(SF^OF) | ≥ |
| setl | (SF^OF) | < ==~≥ |
| setle | (SF^OF) | ZF |
| seta | ~CF&~ZF | > above |
| setb | CF | < below |
Jumping jX instructions: jump to different part of code jX (라벨명)으로 사용하면, 코드에 있는 라벨의 위치로 가서 실행한다. 라벨은 LabelName: 이렇게 콜론을 붙인다.
| jX | condition | 설명 |
|---|---|---|
| jmp | 1 | 그냥 점프한다. |
| je | ZF | |
| jne | ~ZF | |
| js | SF | |
| jns | ~SF | |
| jg | ~(SF^OF)&~ZF) | > |
| jge | ~(SF^OF) | ≥ |
| jl | (SF^OF) | < ==~≥ |
| jle | (SF^OF) | ZF |
| ja | ~CF&~ZF | > above |
| jb | CF | < below |


Goto statement, conditional move 일반적인 분기문은 instruction flow에 방해가 된다. goto를 사용하면 control transfer을 사용하지 않기 때문에 낫다.
if ~ then A else B면 미리 result에 A를 저장해놓고, 조건에 맞으면 B를 대입해 리턴.

- Bad Cases
- val = test(x)? val1(x): var2(x)
이러면 val1와 val2를 전부 계산해야 하므로 비효율
(bad performance)
- val = p? *p: 0
널 에러 가능
(unsafe)
- val = x>0? x*=7: x+=3
side effect 발생
(illegal)
do-While 보통 test에 x같은 변수를 놓고, body에서 1씩 줄이는 등이다.

while translation #1 -og 옵션으로 만들어짐

while translation #2 -o1 옵션으로 만들어짐 do-while 버전으로 만들어져서 번역된다.

For Loop translation while 로 바꾸어서 번역 for(init;test;update)를 init , while(test) update 이렇게 바꾼다.


Switch Statements
스위치에서 가능한 케이스들
multiple case labels case 5: case 6: statement break
fall through case case 2: statement case 3:
missing cases case 4?

점프 테이블 jtab 라벨들을 모아놓은 곳이다. 아래와 같이 작성한다.

위의 스위치 케이스를 구현하려면 다음과 같이 한다
.quad는 64비트 숫자라고 명시해준다. 따라서 .quad .L3 이렇게 하면 .L3의 주소를 가지고 있는 것이다.
