Condition Code

김민욱·2025년 4월 23일

Condition Code

가장 최근의 연산 상태를 저장하는 1비트짜리 레지스터
산술연산에 의해 묵시적으로 결정된다.

CF: Carry flag. unsigned 연산 결과 MSB에 carry나 borrow가 발생하면 1.
ZF: Zero flag. 연산 결과가 0이면 1.
SF: Sign flag. 연산 결과가 음수면 1.
OF: Overflow flag. signed 연산 결과 오버플로우가 발생하면 1.

Example

cmpq b, a
// a - b 연산으로 비교

CF: a - b 연산 중 carry 발생 \rarr CF = 1
ZF: a - b == 0 \rarr ZF = 1
SF: a - b < 0 \rarr SF = 1
OF: (a>0 and b<0 and a-b<0) || (a<0 and b>0 and a-b>0) \rarr OF = 1

Test 연산
test 연산을 통해 condition code를 설정할 수 있다.

test b, a

a&b연산 수행 \rarr condition code 설정, a&b 결과는 저장X

setX 명령
destination의 하위 바이트를 condition code의 조합 0과 1로 바꿈.
나머지 7 bytes는 변경되지 않음.

setXConditionDesription
seteZF = 1같다 / 0
setneZF = 0같지 않다 / !0
setsSF = 1음수
setnsSF = 0음수 아님
setgZF = 0 and SF = OF더 큼 (signed 비교)
setgeSF = OF크거나 같음 (signed 비교)
setlSF != OF더 작음 (signed 비교)
setleSF!=OF or ZF = 1작거나 같음 (signed 비교)
setaCF = 0 and ZF = 0더 큼 (unsigned 비교)
setbCF = 1더 작음 (unsigned 비교)

Example: setX 실습

xorq %rax, %rax
subq $1, %rax
cmpq $2, %rax
setl %al
movzblq %al, %eax
Instruction%raxSFCFOFZF
xorq %rax, %rax0x0000 0000 0000 00000001
subq $1, %rax0xFFFF FFFF FFFF FFFF1100
cmpq $2, %rax0xFFFF FFFF FFFF FFFF1100
setl %al0xFFFF FFFF FFFF FF011000
movzblq %al, %eax0x0000 0000 0000 00011000

Jumping

jX 명령
condition code에 따라 코드의 다른 부분으로 점프함.
( = jump if X)

jXConditionDescription
jmp1조건 없이 그냥 뜀
jeZF = 1같거나 0이면 뜀
jneZF = 0같지 않거나 0이 아니면 뜀
jsSF = 1음수면 뜀
jnsSF = 0음수가 아니면 뜀
jgSF=OF and ZF = 0더 크면 뜀 (signed 비교)
jgeSF=OF더 크거나 같으면 뜀 (signed 비교)
jlSF != OF더 작으면 뜀 (signed 비교)
jleSF != OF or ZF = 1더 작거나 같으면 뜀 (signed 비교)
jaCF = 0 and ZF = 0더 크면 뜀 (unsigned 비교)
jbCF = 1더 작으면 뜀 (unsigned 비교)

조건문에서 활용
if-else 문은 Goto code로도 표현할 수 있음.

//only if-else
long absdiff(long x, long y)
{
    long result;
    if (x > y) result = x - y;
    else result = y - x;
    
    return result;
}

\darr

//with goto
long absdiff_j(long x, long y)
{
	long result;
    if ntest = x <= y;
    if (ntest) goto Else;
    result = x - y;
	goto Done;
Else:
	result = y - x;
Done:
	return result;
}

Example: condition branches

// if-else in C
long absdiff(long x, long y)
{
	long result;
    if (x > y) result = x-y;
    else result = y-x;

    return result;
}
RegisterUse(s)
%rdiArgument x
%rsiArgument y
%raxReturn value
//Assembly code
absdiff:
	movq %rdi, %rax
    subq %rsi, %rax //result = x-y;
    movq %rsi, %rdx
    subq %rdi, %rdx //eval = y-x;
    cmpq %rsi, %rdi
    cmovle %rdx, %rax //if (x<=y) result = eval;
    ret

* cmovX : 조건부 이동 명령

조건문은 항상 분기문으로 작성되지는 않는다.
최적화 된 형태로 작성함.


<참고자료>
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition
안성용, "시스템소프트웨어", 부산대학교

0개의 댓글