본문 바로가기

Programming Language/Assembly

산술비교 명령어 모음

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
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