본문으로 바로가기

[Assembly] 4. CMP의 사용과 상태 플래그

category 옛날 글들/Assembly 2018. 11. 29. 18:43
반응형
CMP 명령어는 두개의 인자를 비교하는 명령어인데, 이 때 플래그가 설정된다.

플래그란 CPU의 FLAGS 레지스터에 저장되는 데이터이다. 이때 FLAGS의 한 비트가 하나의 플래그가 된다.
플래그는 각각의 명령어(ex cmp, xor...)들을 실행할 때마다 설정된다. CMP도 이 명령어 중 하나이다.

ex)

1
2
3
cmp 35 // CF = 1
 
cmp 33 // ZF = 1
cs

이중 상태 플래그는 6가지가 있는데,

Carry Flag (CF) : 연산 결과가 저장공간을 벗어날 경우 1로 설정. (Unsigned)

Overflow Flag (OF) : 연산 결과가 1비트를 넘어갈 때 1로 설정. (Signed)

Zero Flag (ZF) : 연산 결과가 0일때 1로 설정.

SIgn Flag (SF) : 최상위 비트가 1이 되었을때 ( 부호 있는 정수로는 음수일경우) 1로 설정

Parity Flag (PF) : 비트값이 1인것이 짝수이면 1로 설정. ( 연산 결과의 비트의 1의 갯수가 짝수면 1로 설정이라는 말같다. )

Auxiliary Flag (AF) : 4비트 부호 없는 정수가 overflow일 경우 1로 설정 ( Unsigned )

그럼 CF와 OF의 차이는 무엇일까? 겉보기에도 큰 차이가 없어 보이는 두 명령어는 엄연히 차이점이 있다. 

CF의 예를 들어보자면, 8bit의 부호 없는 정수 11111111(255)가 있다고 하자. 여기에 00000001(1)을 더하면 100000000(256)가 되며 9비트를 필요로 하게된다. 이 때 맨 앞을 Carry라고 하며 Carry Flag가 1로 바뀐다.

만약 8bit로 부호 있는 정수를 나타내면 가장 왼쪽에 있는 비트가 1일때 음수, 0일때 양수가 된다. 만약 +127(01111111)에 +1(00000001)을 더하면, 10000000(-128)이 된다. 이렇게 우리가 예상한 결과(+128)가 아닌 결과가 나올 때를 Overflow라고 하고 Overflow Flag가 1로 바뀐다.



반응형