플래그 레지스터: 연산 결과에 따라 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
반응형
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조](14)[어셈블리어 5] (1) | 2025.01.24 |
---|---|
[컴퓨터 구조](13)[어셈블리어 4] (0) | 2025.01.23 |
[컴퓨터 구조](11)[어셈블리어 2] (0) | 2025.01.21 |
[컴퓨터 구조](10)[어셈블리어 1] (0) | 2025.01.20 |
[컴퓨터 구조](9)[운영체제의 추상화] (0) | 2025.01.17 |