반송 플래그

Carry flag

컴퓨터 프로세서에서 반송 플래그(일반적으로 C 플래그로 표시됨)는 시스템 상태 레지스터/플래그 레지스터의 단일 비트로, 가장 중요한 산술 논리 유닛(ALU) 비트 위치에서 산술적 반송 또는 차입이 생성된 시기를 나타내기 위해 사용됩니다.반송 플래그를 사용하면 2진수 숫자를 부분 덧셈/감축에서 더 중요한 워드의 최하위 비트 위치로 반송(추가)함으로써 단일 ALU 폭보다 큰 숫자를 추가/감축할 수 있습니다.이는 일반적으로 어셈블리나 기계 코드 수준에서 프로세서의 사용자의 내부적으로 특정 프로세서에서, 디지털 논리나 일부 프로세서(combinatorial, 또는"물리적")보다 더 넓등록기와 산술 명령 ALU.[1]그것은 또한 비트 변화와 회전하면을 확장하는데 사용되고 있어 마이크로 코드를 통해 일어날 수 있는 프로그램이 되어 있다. a(전용 플래그를 사용하는 경우도 있습니다) 많은 프로세서에서 같은 방법을 사용합니다.감산 연산의 경우 대부분의 기계가 대여 시 캐리 플래그를 설정하는 반면 일부 기계(6502PIC 등)는 대여 시 캐리 플래그를 재설정하기 때문에 두 가지(반대) 규칙이 사용됩니다.

사용하다

반송 플래그는 대부분의 산술 명령(일반적으로 몇 가지 비트 사용)의 결과에 영향을 받으며 많은 명령의 입력으로도 사용됩니다.이들 설명서의 일부에는 캐리어를 읽거나 무시하는 두 가지 양식이 있습니다.어셈블리 언어에서 이러한 명령어는 다음과 같은 니모닉으로 표시됩니다.ADD/SUB,ADC/SBC(ADD/SUB캐리 포함)SHL/SHR(비트 시프트),ROL/ROR(비트 회전),RCR/RCL(캐리 경유) 등입니다.[2]이 방법으로 반송 플래그를 사용하면 여러 단어 더하기, 빼기, 이동 및 회전 작업이 가능합니다.

예를 들어 8비트 레지스터를 사용하여 255와 255를 더하면 어떻게 됩니까?결과는 9비트 값인 510이어야 합니다.111111110바이너리로.레지스터에 항상 저장되는 최하위8비트는11111110바이너리(십진수 254개)이지만 비트 7(8비트)에서 실행되므로 반송파가 설정되고 결과에 9비트가 필요함을 나타냅니다.유효한 9비트 결과는 carry 플래그와 결과를 연결하는 것입니다.

8비트의 x86 ALU 크기, 8비트 2의 보완 해석, 추가 연산11111111+11111111을 낳다111111110,Carry_Flag세트,Sign_Flag세트 및Overflow_Flag분명한.

한다면11111111는 2의 보완 부호 정수 -1을 나타냅니다.ADD al,-1결과 해석은 -2가 됩니다.Overflow_Flag이상 없습니다.Carry_Flag무시됩니다.결과의 부호는 부정적이다. 왜냐하면Sign_Flag설정되었습니다. 11111110는 부호 있는 정수 -2의 두 개의 보완 형식입니다.

한다면11111111는 부호 없는 정수 바이너리 번호 255 를 나타냅니다( ).ADD al,255)의 경우 결과의 해석은 254가 됩니다.이것은 올바르지 않습니다.결과 중 가장 중요한 비트가Carry_Flag따라서 무시할 수 없습니다.Overflow_Flag및 그Sign_Flag무시됩니다.

다른 예로는 비트 패턴을 가진8비트 레지스터를 들 수 있습니다.01010101그리고 반송 플래그 세트. 만약 우리가 반송 명령을 통해 왼쪽으로 회전한다면, 결과는 다음과 같습니다.10101011캐리가 최하위 비트(비트 0)로 회전하는 동안 최상위 비트(비트 7)가 캐리로 회전했기 때문에 캐리어 플래그가 지워졌습니다.

초기의 마이크로프로세서 Intel 4004Intel 8008에는 캐리어 플래그를 명시적으로 설정 및 리셋하기 위한 특정 명령이 포함되어 있습니다.다만, 최신의 인텔 8080( Z80)에서는, 명시적인 리셋의 캐리 opcode는 포함되어 있지 않습니다.이는 (캐리 플래그를 사용하지 않는) 비트 단위의 AND, OR, 또는 XOR 명령 중 하나를 통해 동일하게 빠르게 실행할 수 있기 때문입니다.

반송 플래그는 비교 지침에 따라 자주 사용되며, 일반적으로 감산 연산에 의해 구현되며, 비교된 두 값 중 어느 값이 다른 값보다 낮거나 크거나 같은지 결정할 수 있습니다.carry 플래그를 검사하는 분기 명령어는 종종 다음과 같은 니모닉으로 나타납니다.BCC그리고.BCS캐리(carry)가 클 경우 분기하고 캐리(carry)가 각각 설정된 경우 분기합니다.이와 같이 사용할 경우 반송 플래그는 값을 부호 없는 정수로 비교하는 메커니즘을 제공합니다.이는 값을 부호 있는 정수값으로 비교하는 메커니즘을 제공하는 오버플로 플래그와는 대조적입니다.

vs. 차용 플래그

반송 플래그는 덧셈에 대해 잘 정의되어 있지만 일반적으로 반송 플래그를 감산 작업에 사용하는 두 가지 방법이 있습니다.

첫 번째는 비트를 차용 플래그로서 사용하여 a-b를 계산할 때 <b>를 설정하고 차용을 수행해야 합니다.a'b경우 비트는 클리어 됩니다.차용에 의한 뺄셈(SBB) 명령은 a-b-C = a-(b+C)를 계산하는 반면, 빌리지 않은 차감(SUB)는 빌린 비트가 클리어된 것처럼 동작합니다.8080, 6800, Z80, 8051, x86[2]68k 패밀리는 차용 비트를 사용합니다.

두 번째는 -x = (x아님)+1인 항등식을 직접 사용하고(즉, 반전된 반송 비트를 저장하지 않고) a-b를 a+(b가 아님)+1로 계산합니다.캐리어 플래그는 이 덧셈에 따라 설정되며 캐리어에서는 a+not(b)+C빼고 캐리어 비트가 설정된 것처럼 동작합니다.그 결과, abb이면 캐리 비트가 설정되고 a<b이면 클리어 됩니다.System/360,[3] 6502, MSP430, COP8, ARMPowerPC 프로세서는 이 표기법을 사용합니다.6502는 반송 연산 없이 감산할 수 없기 때문에 특히 잘 알려진 예입니다.따라서 프로그래머는 차입이 [4]필요하지 않은 모든 감산 연산 전에 반송 플래그를 설정해야 합니다.

감산 시 반송 플래그의 다양한 사용 요약
운반 또는
차용 비트
빼기
운반/배송
빼다
빌려서
빼다
운반하여
C = 0 ab
= a + not(b) + 1
ab0
= a + not(b) + 1
ab1
= a + not(b) + 0
C = 1 ab1
= a + not(b) + 0
ab0
= a + not(b) + 1

일반적으로 첫 번째 대안은 "차입이 있는 차감"이라고 하고, 두 번째 대안은 "차입이 있는 차감"이라고 한다.단, 양방향에는 예외가 있습니다.VAX, NS320xx 및 Atmel AVR 아키텍처는 차용 비트 표기법을 사용하지만 a-b-C 연산을 "carry 포함 서브트랙트(subtract with carry)"라고 부릅니다.SBWC,SUBC그리고.SBCPA-RISC PICmicro 아키텍처는 캐리어 비트 규약을 사용하지만, 이러한 a+not(b)+C 연산을 "subtract with borrow"(차용 제외)라고 부릅니다.SUBB그리고.SUBWFB).

ST6 8비트 마이크로컨트롤러는 아마도 가장 혼란스러울 것입니다."carry와 함께 subtract" 명령어는 없지만 뺄셈 명령에 의해 설정된 캐리어 비트가 있으며 이 규칙은 프로세서 모델에 따라 달라집니다.ST60 프로세서는 "carry" 규약을 사용하고 ST62 및 ST63 프로세서는 "borrow" [5]규약을 사용합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ 잘 알려진 Z80과 68000이 이러한 CPU의 예입니다.
  2. ^ a b "Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual" (PDF). Retrieved 2007-10-25.
  3. ^ IBM System/360 Principles of Operation (PDF). p. 28. IBM Form A22-6821-0.
  4. ^ Tan, B.T.G. (May 1983). "SBC, TSX and TXS instructions of the 6800 and 6502" (PDF). Dr. Dobb's Journal (79): 67–68.
  5. ^ "ST6 Family Programming Manual" (PDF). Revision 2.0. STMicroelectronics. October 2004. pp. 21–22, 42. Retrieved 2017-02-28.

외부 링크