CMP <A>, <B>
위 명령은 두 정수를 빼서 대소 비교를 하라는 뜻입니다.
A - B의 결과는 양수 또는 0 또는 음수 중 하나일텐데,
각 상황별로 CPU에 내장된 ZF(Zero Flag), CF(Carry Flag)라는 두 플래그에 값이 저장됩니다.
그리고 ZF, CF의 상태에 따라 몇 가지 분기 구문이 존재합니다.
분기 구문은 A와 B는 최상위 비트는 부호 비트로 쓸 것인지 여부에 따라 signed, unsigned 형으로 나뉘는데 각 명령은 다음과 같습니다.
상태 플래그 레지스터
AF (Auxiliary Flag) : 반 워드 단위로 자리수가 바뀔때 1로 설정. 예를 들어 8비트 CPU에서는 0100에서 10100이 되는 경우, 또는 11011에서 1011이 되는 경우
CF (Carry Flag) : unsigned형의 두 정수를 산술연산할 때 자리수가 1자리 올라가면 1로 설정됨
DF (Direction Flag) : 0이면 순서대로 메모리가 탐색됨, 1이면 역순으로 메모리가 탐색됨 (문자열 조작할 때 유용함)
IF (Interrupt Flag) : 0이면 외부 인터럽트 무시, 1이면 외부 인터럽트 허용
PF (Parity Flag) : 2진수로 표현시 1의 개수가 짝수개이면 1, 홀수개이면 0으로 설정됨. 패리티 통해 오류 검출하는 경우 유용함
OF (Overflow Flag) : signed형의 두 정수를 산술연산할 때 결과의 절댓값이 너무 크면 1로 설정됨)
SF (Sign Flag) : 두 정수의 연산 결과가 0보다 작으면 1로 설정됨
TF (Trap Flag) : 0이면 정상, 1이면 한 명령 할 때마다 인터럽트(INT 1)발생. 오류 추적 및 디버깅때 유용함. 인터럽트 처리시에는 0으로 복귀됨
ZF (Zero Flag) : 두 정수의 연산 결과가 0이면 1로 설정됨
부호에 따른 작동예: 양수 = SF(0) & ZF(0), 0 = SF(0) & ZF(1), 음수 = SF(1) & ZF(0)
비교 상황별 작동되는 명령어와 플래그
상황 | 플래그 조건 |
분기 명령어 |
A == B (A와 B가 같다) |
ZF = 1 |
JE, JZ |
A != B (A와 B가 같지 않다) |
ZF = 0 |
JNE, JNZ |
A > B (A가 크다) |
부호있음: SF == OF & ZF = 0 |
부호있음: JG |
부호없음: CF = 0 & ZF = 0 |
부호없음: JA |
|
A >= B (A가 크거나 같다) |
부호있음: SF == OF |
부호있음: JGE, JNL |
부호없음: CF = 0 |
부호없음: JAE, JNB, JNC |
|
A < B (A가 작다) |
부호있음: SF != OF & ZF = 0 |
부호있음: JL |
부호없음: CF = 1 & ZF = 0 |
부호없음: JB |
|
A <= B (A가 작거나 같다) |
부호있음: SF != OF | ZF = 1 |
부호있음: JLE, JNG |
부호없음: CF = 1 | ZF = 1 |
부호없음: JBE, JNA |
'Programming Language > Assembly' 카테고리의 다른 글
산술 비교 알고리즘 - 2편. ">"와 "<=" (0) | 2013.04.12 |
---|---|
산술 비교 알고리즘 - 1편 "!="과 "==" (0) | 2013.04.11 |
점프 명령어 JMP (0) | 2013.04.06 |
두 번째 예제: Hello, World! (0) | 2013.03.31 |
첫 예제: 1개의 문자 출력 (0) | 2013.03.31 |