마이크로
프로세서실습
플래그 레지스터
조건분기명령은 비교명령이나 연산명령의 결과에 따라서 분기합니다.
그러나, 정확히 말하자면 비교명령이나 연산명령의 결과에 의해 세트된 플래그 레지스터의 값에 따라서 분기하는 것입니다. 플래그 레지스터는 여러 가지 상태를 기억하기 위한 레지스터입니다.
+------------------------------------------------------------------+
*플래그 레지스터의 각 비트의 명칭
공백인 비트는 사용하지 않읍니다.
비트 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
OF DF IF TF SF ZF AF PF CF
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+------------------------------------------------------------------+
스테이터스 플래그(status flag)
연산의 결과에 따라서 세트 혹은 리셋되는 플래그로 다음과 같은 것이 있읍니다.
-CF : 캐리플래그 (carry flag)
연산한 결과,최상의 비트로 부터의 높은 자리로 자리올림(캐리)
혹은 최상의 비트로 부터의 빌림이 발생한 경우에 1로 세트되고
그 이외의 경우 0으로 세트됩니다.
-PF :패리티 플래그(parity flag)
연산한 결과, 1로된 비트의 수가 짝수개(EVEN)일 때 1로 세트되
고 그 이외의 경우 0으로 리셋됩니다.
-AF : 보조 캐리플래그(auxiliary carry flag)
8(16)비트 연산에서,하위 4(8) 비트로 부터 상위 4 비트로 자리
올림 혹은 빌림이 발생한 경우에 1로 리셋된다. 10진 보정 명령에
있어서도 사용 됩니다.
-ZF : 제로 플래그(zero flag)
연산한 결과가 0으로 되었을 때에 1로 세트되고,그이외일 때는
0으로 리셋됩니다.
-SF :사인 플래래그(sign flag)
연산한 결과,최상의 비트가 1이 되었을 때(즉,보수표현으로
음수가 되었을 때) 1로 세트되고,그이외일 때는 0으로 리셋됩니다.
-OF : 오버플로우 플래그(overflow flag)
연산을 부호가 달린 숫자로 했을때,오버 플로우 혹은 언더 플로우
가 발생한 경우에 1로 세트되고,그 이외일 때는 0으로 리셋됩니다.
콘트롤 플래그(control flag)
CPU의 동작 상태 를 제어하는 레지스터로 플래그 제어 명령이나 플래그 전송명령을 사용하여 프로그램 중에서 세트 혹은 리셋됩니다.
-DF : 디렉션 플래그(direction flag)
스트링 조작을 할 때에 이 플래그가 0이면 번지를 나타내는
레지스터값이 자동으로 증가하고 1이면 레지스터값은 자동적으로
감소합니다.
-IF : 인터럽트 플래그(interrupt flag)
이 플래그가 0 일 때 INTR단자로 부터의 외부 인터럽트 요구는
무시되고,1 일 때에는 외부 인터럽트 요구를 받아 들일 수 있게
됩니다.
-TF : 트랩 플래그(trap flag)
이 플래그가 0일 때 CPU 는 보통대로 명령을 실행한다.이 플래그가
1일 때 CPU 는 한 명령을 실행할 때마다 자동적으로 내부 인터럽트
(INT1)가 발생하고,인터럽트 처리 루틴으로 들어간다.(단, 이 처리
루틴의 실행중에는 트랩플래그는 0으로 클리어 된다).이 플래그는
프로그램의 추적에 사용됩니다.
플래그 레지스터 제어 명령 과 전송 명령
STC (Set Carry flag) 캐리플러그를 1로 세트한다.
CLC (CLear Carry flag) 캐리플러그를 0으로 리셋한다.
CMC (CoMplement Carry flag) 캐리플래그가 0이면 1로 1이면 0으로 세트한다.
STD(Set Direction flag) 디렉션 플래그를 1로 세트한다.
CLD(CLear Direction flag) 디렉션 플래그를 0으로 리셋한다
STI(Set Interrupt-enable flag) 인터럽트 플래그를 1로 세트한다.
CLI(CLear Interrupt-enable flag) 인터럽트 플래그를 0으로 세트한다.
LAHF(Load AH from Flags) 플래그 레지스터의 하위 8비트를 AH레지
스터로 전송한다.사용하지 않는 비트의 값은 정해져 있지 않다.
SAHF(Store AH into Flags) AH레지스터의 내용을 플래그레지스터의하위 8비트에 전송한다.
PUSHF (PUSH Flas onto stack) 플래그 레지스터의 내용을 스택(stag)상에 푸쉬(PUSH:삽입)한다.
POPF (POP Flags off stack) 스택 위의 워드데이터를 플래그레지스터에 POP한다.
다음 두 명령의 차이를 알아 봅시다.
CMP AX,BX ;AX레지스터로 부터 BX 레지스터를 가상적으로 뺀
다음 그 결과에 따라 플래그 레지스터만을 변화시킨다.
SUB AX,BX ;AX레지스터에서 BX 레지스터를 뺀다음 그결과에 따라
플래그 레지스터를 변화 시킨다.
결국 두명령의 결과 플래그 레지스터의 결과는 똑 같읍니다.
플래그 레지스터의 값은 산술 논리연산을 행할 때에 세트 리셋되고,전송
명령이나 분기명령에서는 변화하지 않읍니다.따라서 비교명령과 분기명령
사이에 전송명령등을 사용할 수 있읍니다.
CODE SEGMENT
ASSUME CS:CODE
MOV AX,1234H
MOV BX,8888H
CMP BX,0
JB L1
JL L1
NOP
8888H를 부호없는 숫자로 간주하면 0보다 크므로
JB에서는 분기하지 않는다 그러나 부호있는 숫자로
보면 0보다 작으므로 JL에서 분기한다.
L1: CMP AX,BX
JG L2 ;부호있는 숫자로 보았을 때 AX가 크므로 JG에서 분기한다.
JA L2
NOP
L2: ADD AX,8000H
JC L3
JS L3 ;1234H에 8000H를 더하면 9234H가 된다.자리 올림이
생기지 않으므로 캐리플러그는 0이 된다.그러나 최상위
비트가 1이 되므로 사인 플러그는 1이 된다.
따라서 JC 에서는 분기하지 않고JS에서 분기한다.
NOP ;아무것도 하지 않는다는 명령
L3: ADD AX,8000H ;두 수를 더하면 자리올림이 발생하고 결과는 1234H
가 된다.이때 캐리 플러그는 1로 세트된다.제로가
아니므로 제로 플러그는 0이다.
MOV AX,0
JZ L4
JC L4 ; 캐리플러그가 1이므로 분기한다.
NOP
L4: MOV AX,0FFFFH
ADD AX,1
JC L5
NOP
L5: CLC ;CLC는 clear carry로서 캐리플러그를 0으로 만든다.
MOV AX,0FFFFH
INC AX ;INC명령에 의해 자리 올림이 생긴 경우에는 캐리
플러그의 값은 변화하지 않는다.
JC L6
JE L6
NOP
L6: MOV AH,4CH
INT 21H
CODE ENDS
END
플래그 레지스터를 보는 방법
+-----------+----+----+----+----+----+----+----+----+
플래그 이름 OF DF IF SF ZF AF PF CF
+-----------+----+----+----+----+----+----+----+----+
0 NV UP DI PL NZ NA PO NC
+-----------+----+----+----+----+----+----+----+----+
1 OV DN EI NG ZR AC PE CY
+-----------+----+----+----+----+----+----+----+----+
약자를 읽어 내는 방법
NV:not overflow OV:overflow
uP:up DN:down
DI:disable interrupt EI:enable interrupt
PL:plus NG:negative
NZ:not zero ZR:zero
NA:not auxiliary carry AC:auxiliary carry
PO:parity odd PE:parity even
NC:not carry CY:carry
INC명령과 DEC명령은 캐리플래그에 영향을 주지 않읍니다.
-T
AX=1234 BX=0000 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=54EF ES=54EF SS=54FF CS=54FF IP=0003 NV UP EI NG NZ NA PE NC
54FF:0003 BB8888 MOV BX,8888
-T
AX=1234 BX=8888 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=54EF ES=54EF SS=54FF CS=54FF IP=0006 NV UP EI NG NZ NA PE NC
54FF:0006 83FB00 CMP BX,+00
-T
AX=1234 BX=8888 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=54EF ES=54EF SS=54FF CS=54FF IP=0009 NV UP EI NG NZ NA PE NC
54FF:0009 7203 JB 000E
BX레지스터와 0H 의 비교 결과에 따라 플래그레지스터가 세트됩니다.
뺄셈결과 8888H이므로 최상의 비트는 1이 되고 사인플래그는 NG(음수)가
됩니다.빌림이 발생하지 않았으므로 캐리플러그는 NC(0) 가되고 오버플래그
는 NV(0)가 됩니다.
-T
AX=1234 BX=8888 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=54EF ES=54EF SS=54FF CS=54FF IP=000B NV UP EI NG NZ NA PE NC
54FF:000B 7C01 JL 000E
-Q
LOOP 명령어
- LOOP OPR
- OPR : short label
- 8 bit displacement(-126 ~ +129)
- (CX) <- (CX) - 1
jump if (CX) <> 0
분기(branch)명령어
- PC의 값의 변경
. 순차적인 프로그램의 진행순서가
다른 부분으로 이동하여 수행
- 대표적인 프로그램 제어 명령어
- 분기명령
. 조건부 분기명령
. 무조건 분기명령
- 스킵(skip)
. 주소가 필요없는 무주소 명령어
- 콜(call)과 리턴(return) 명령어
. 서브루틴과 연관되어 사용
- 비교명령어와 테스트명령어
. 특정 상태를 나타내는 레지스터를 조정하므로써
후에 분기를 일어키게 하는 역할 수행
. 비교명령어는 두수의 크기를 비교하고,
테스트(test) 명령은 두수를 AND시켜서 특정 상태를 나타나는 비트를 조정
상태 비트 조건
- 상태비트: 조건 코드(condition code)나 플래그(flag)
- 상태 레지스터 비트
. 4개의 상태비트 V,Z,S,C
1) C비트: ALU의 출력 캐리
2) S비트: ALU의 연산결과에서 부호 비트
3) Z비트: ALU의 연산결과의 워드
4) V비트: C8, C9캐리의 excluive-OR 결과
조건부 분기 명령어
- 조건부 분기 명령어 표
. 각 니모닉은 분기를 나타내는 B와 조건이름 약자로서 구성하며
반대조건의 경우 N을 추가
- 비교 명령어
. 두개의 피연산자의 차이를 계산
. 부호가 있는 경우와 부호없는 경우의 비교
'프로그래밍' 카테고리의 다른 글
패턴이란 무엇인가 (0) | 2010.09.13 |
---|---|
j2ee (0) | 2010.09.13 |
Fault Barrier Pattern (0) | 2010.08.26 |
log4j (0) | 2010.08.13 |
경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:????????' did not find a matching property. (0) | 2010.07.19 |