반응형
CMP 명령어는 두개의 인자를 비교하는 명령어인데, 이 때 플래그가 설정된다.
플래그란 CPU의 FLAGS 레지스터에 저장되는 데이터이다. 이때 FLAGS의 한 비트가 하나의 플래그가 된다.
플래그는 각각의 명령어(ex cmp, xor...)들을 실행할 때마다 설정된다. CMP도 이 명령어 중 하나이다.
ex)
1 2 3 | cmp 3, 5 // CF = 1 cmp 3, 3 // 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로 바뀐다.
보면 좋은 자료 : http://unixwiz.net/techtips/x86-jumps.html
반응형
'옛날 글들 > Assembly' 카테고리의 다른 글
[Assembly] 6. inc, dec, add, sub, adc, sbb의 사용 (0) | 2018.12.03 |
---|---|
[Assembly] 5. 조건분기 JUMP문 정리 (0) | 2018.12.02 |
[Assembly] 3. JMP의 사용 (0) | 2018.11.29 |
[Assembly] 2. 메모리의 사용과 포인터 사용 (0) | 2018.10.30 |
[Assembly] 1. mov 명령어 (0) | 2018.10.24 |