CS/컴퓨터 구조

[컴퓨터 구조](12)[어셈블리어 3]

황올뱀 2025. 1. 22. 16:20

플래그 레지스터: 연산 결과에 따라 0or1의 값을 가지는 1비트의 레지스터

  • ZF (zero flag): 연산의 값이 0이면 1
    • 예시) xorq rax, rax (rax = 0이 됨) -> ZF = 1
  • CF (carry flag): (비부호형에서) 연산의 값이 비트의 범위를 벗어나면 1
    • 예시) 1111(15) + 0001(1) = 10000(16) -> CF = 1
  • SF (sign flag): (부호형에서) 연산의 결과가 음수면 1
    • 예시) 0001(1) + 1110(-2) = 1111(-1) -> SF = 1
  • OF (overflow flag): (부호형에서) 연산의 결과가 오버플로우면 1
    오버플로우 판단은 결과값의 맨 첫번째 비트랑 두번째 비트를 xor하고 1 나오면 오버플로우다.
    • 예시) 0111(7) + 0001(1) = 1111(-8) -> OF = 1

비교 연산


CMP 연산 (cmp S1, S2): S1과 S2를 비교, 단, 비교 후 값 저장은 하지 않고 플래그 값만 바꿈
비교 형식: S2 - S1을 한 뒤 플래그로 나타냄

  • 예시) cmp $0x001(1), $0x011(2)
  • ZF: 0x011-0x001 = 0x010 != 0 -> ZF = 0
  • CF: 0x011-0x001 = 0x010 -> 비트 범위를 벗어나지 않았으므로 CF = 0
    TEST 연산 (test S1, S2): S1과 S2를 비교, 단, 비교 후 값 저장은 하지 않고 플래그 값만 바꿈
    비교 형식: S2 & S1을 한 뒤 플래그로 나타냄
  • 예시) test $0x101(-3), $0x111(-1)
  • ZF: 0x101 & 0x111 = 0x101 != 0 -> ZF = 0
  • SF: 0x101 & 0x111 = 0x101(-3) < 0 -> SF = 1
    CMOV 연산 (cmov S D): 플래그 값에 따라 조건을 만족하면 S를 D로 옮김.
  • 예시) cmovz %rax, %rsi: 만약 ZF 값이 1이라면 rax 값을 rsi로 옮겨라
  • 예시) comvns %rax, %rsi: 만약 SF 값이 0이라면 rax값을 rsi로 옮겨라

SET 연산 (set R): 이전의 비교 연산 결과에 따라 레지스터 값을 0 or 1로 바꾼다.

  • 이때 값 바꿀 레지스터(R)은 무조건 1바이트 크기여야 됨
  • sete / setne: 비교연산 결과가 같은가 / 다른가
  • sets / setns: 비교연산 결과가 음수인가 / 음수가 아닌가
  • setg / setl: (부호형 연산) 비교결과가 크냐 / 작냐
  • setge / setle: (부호형 연산) 비교결과가 크거나 같냐 / 작거나 같냐
  • seta / setb: (비부호형) 비교결과가 크거나 같냐 / 작냐
  • 보통 set연산 다음에 movzbl을 통해 1바이트에서 4바이트로 늘려서 저장함
  • 예시)
    rsi = 0x001, rdi = 0x003 <- 비부호형
    cmpq %rsi, %rdi -> rdi가 rsi보다 큼
    setg %al -> 비교 연산 결과가 큼으로 나왔으므로 al레지스터가 1이됨
728x90
반응형