인텔 BCD opcode

Intel BCD opcode

인텔 BCD opcode바이너리 코드 10진수로 동작하는6개의 x86 명령어 세트입니다.x86 프로세서의 숫자 표현에 사용되는 기수는 2입니다.이것은 이진수 체계라고 불립니다.단, x86 프로세서는 10진수 시스템에 한정되어 있습니다.

또한 x87부부동소수점 레지스터에 로드하여 저장할 수 있는 고유한 18자리(10바이트) BCD 포맷을 지원하며, 여기에서 일반적인 FP 연산을 [1]실행할 수 있다.

정수 BCD 명령은 롱 모드에서 더 이상 지원되지 않습니다.

사용.

번호 표현

BCD 번호는 정수 레지스터에서 패킹된 10진수와 언팩된 10진수의 두 가지 방법으로 나타낼 수 있습니다.

  • 포장(4비트)
    • 패킹된 십진수 표현에서는 십진수 자릿수하나의 니블에 저장됩니다.
    • 10 ~ 15 의 값은 [2]사용되지 않습니다.
  • 언팩(8비트)
    • 압축되지 않은 10진수 표현에서는 10진수가 1바이트에 저장됩니다.
    • 10 ~ 255 의 값은 사용되지 않습니다.
    • 상위 니블은 무시되며 0 또는 ASCII 문자([2]값 3)의 선행 니블 중 하나입니다.

값은 일반적으로 레지스터의 하위 8비트에 저장되는 것으로 가정합니다(예: AL).

추가 중

직접 추가할 수 있는 것은 0 ~99 의 10 진수 뿐입니다.

먼저 add(또는 carry 플래그가 필요한 경우 adc)를 사용하여 평상시와 같이 숫자를 추가합니다.프로세서는 양쪽 하위 니블의 합계가 16 이상이면 조정 플래그를 설정하고, 양쪽 바이트의 합계가 256 이상이면 반송 플래그를 설정합니다.

그런 다음 숫자 표현에 따라 결과가 조정됩니다.

  • 포장된
    • 결과는 daa를 사용하여 조정됩니다(추가 후 10진수 조정).결과의 최하위 니블이 10 이상인 경우 또는 조정 플래그가 설정되어 있는 경우 프로세서는 결과에 6을 더하고 니블의 오버플로우를 폐기합니다.
    • 다음으로 결과의 최상위 니블이 10 이상일 경우 또는 캐리어 플래그가 설정되어 있을 경우 프로세서는 결과에 96(6×16)을 가산하여 [2][3]캐리어 플래그를 설정합니다.
  • 언팩
    • 결과는 aaa를 사용하여 조정됩니다(추가 후 ASCII 조정).결과의 최하위 니블이 10 이상일 경우 프로세서는 6을 더하고 모든 니블 오버플로를 폐기하여 최하위 바이트에 저장합니다.
    • 최상위 바이트가 증가합니다.
    • 이 시점에서 최상위 바이트에는 유효한 10진수가 [2][3]포함되지 않을 수 있습니다.

뺄셈

직접 수 있는 것은 0에서 99까지의 소수점뿐입니다.먼저 서브(또는 반송 플래그가 필요한 경우 sbb)를 사용하여 평상시와 같이 숫자를 뺍니다.프로세서는 최하위 니블에서 차용이 발생한 경우 조정 플래그를 설정하고, 최하위 니블에서 차용이 발생한 경우 반송 플래그를 설정합니다.

  • 포장된
    • 결과는 das를 사용하여 조정됩니다(감산 후 10진수 조정).결과의 최하위 니블이 10 이상일 경우 또는 조정 플래그가 설정되어 있을 경우 프로세서는 결과에서 6을 뺍니다.
    • 다음으로 결과의 최상위 니블이 10 이상일 경우 또는 캐리 플래그가 설정되어 있을 경우 프로세서는 결과에서 96(6×16)을 감산하여 캐리 [2][3]플래그를 설정합니다.
  • 언팩
    • 결과는 aas를 사용하여 조정됩니다(감산 후 ASCII 조정).결과의 최하위 니블이 10 이상일 경우 프로세서는 이 니블에서 6을 감산하여 최하위 바이트에 저장합니다.
    • 최상위 바이트가 감소합니다.
    • 이 시점에서 최상위 바이트에는 유효한 10진수가 [2][3]포함되지 않을 수 있습니다.

곱셈

압축 해제된 표현만 지원됩니다. 자리 숫자만 곱할 수 있습니다.

먼저 mul을 사용하여 평소처럼 숫자를 곱합니다.

그런 다음 aam을 사용하여 결과를 조정합니다(곱셈을 위해 ASCII 조정).프로세서는 결과를 10으로 나누어 결과의 최상위 바이트에 몫(적분 부분만)을 저장하고 나머지는 결과의 [2][3]최하위 바이트에 저장합니다.

나누기

압축 해제된 표현만 지원됩니다.오퍼랜드는 0 ~99 의 범위내여야 합니다.

먼저 ad를 사용하여 오퍼랜드를 일반 바이너리 표현으로 변환합니다(나눗셈 전에 ASCII 조정).프로세서는 최상위 바이트에 10을 곱하고 최하위 바이트를 추가하여 숫자를 변환합니다.나눗셈의 몫과 나머지 몫은 div를 사용하여 평소처럼 구하며 정규 이진법으로 [2][3]표시됩니다.

x87의 경우

x87 코프로세서는 Pair of Load(FBLD; 로드 페어) 및 Store-and-Pop(FBSTP; 스토어 앤 팝) 명령 형식으로 BCD를 지원합니다.전자는 80비트 BCD 정수를 FPU에 로드하고 후자는 FPU 값을 80비트 정수 값으로 메모리에 씁니다.FPU 내부에는 통상적인 x87 확장 정밀도 플로트로 값이 저장됩니다.정수 방향의 버전과 달리 2개의 명령어는 롱모드로 [1]사용할 수 있습니다.

80비트 포맷은 다음과 같이 나뉩니다.

79 78 .. 72 71 .. 0
서명하다 미사용(0) 18자리 팩

FFFFC000000000000000h로 인코딩된 특별한 "정의 없음" 값이 있습니다.

어플

바이너리 코드 10진수(BCD)[2] 번호는 특히 금융 소프트웨어에서 10진수 저장에 사용됩니다.

위의 opcode는 x86의 기본적인 BCD [2]지원을 제공합니다.

대체 수단

이러한 opcode를 사용하여 BCD 번호를 추가하는 것은 복잡한 작업이며, 작은 숫자라도 추가하려면 많은 명령이 필요합니다.또한 대량의 메모리가 [2]필요할 수도 있습니다.정수 계산만 수행하는 경우 모든 정수 계산은 정확하므로 숫자 표현의 기수는 정확도에 중요하지 않습니다.x86 프로세서에서는 보통 BCD [2]숫자와 같은 계산보다 바이너리 숫자를 사용한 계산이 훨씬 빠릅니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b "4.7 BCD and packed BCD integers". Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1: Basic Architecture (PDF). Version 072. Vol. 1. Intel Corporation. 2020-05-27 [1997]. pp. 3–2, 4-9–4-11 [4-10]. 253665-072US. Archived (PDF) from the original on 2020-08-06. Retrieved 2020-08-06. […] When operating on BCD integers in general-purpose registers, the BCD values can be unpacked (one BCD digit per byte) or packed (two BCD digits per byte). The value of an unpacked BCD integer is the binary value of the low halfbyte (bits 0 through 3). The high half-byte (bits 4 through 7) can be any value during addition and subtraction, but must be zero during multiplication and division. Packed BCD integers allow two BCD digits to be contained in one byte. Here, the digit in the high half-byte is more significant than the digit in the low half-byte. […] When operating on BCD integers in x87 FPU data registers, BCD values are packed in an 80-bit format and referred to as decimal integers. In this format, the first 9 bytes hold 18 BCD digits, 2 digits per byte. The least-significant digit is contained in the lower half-byte of byte 0 and the most-significant digit is contained in the upper half-byte of byte 9. The most significant bit of byte 10 contains the sign bit (0 = positive and 1 = negative; bits 0 through 6 of byte 10 are don't care bits). Negative decimal integers are not stored in two's complement form; they are distinguished from positive decimal integers only by the sign bit. The range of decimal integers that can be encoded in this format is −1018 + 1 to 1018 − 1. The decimal integer format exists in memory only. When a decimal integer is loaded in an x87 FPU data register, it is automatically converted to the double-extended-precision floating-point format. All decimal integers are exactly representable in double extended-precision format. […] [1]
  2. ^ a b c d e f g h i j k l Hyde, Randall (September 2003). Decimal Arithmetic. The Art of Assembly Language Programming. No Starch Press. Archived from the original on 2008-11-02. Retrieved 2008-10-18.
  3. ^ a b c d e f Volume 2A: Instruction Set Reference, A-M (PDF). Intel 64 and IA-32 Architectures Software Developer’s Manual. Vol. 2A. Intel Corporation. 2007-05-17. Archived from the original (PDF) on 2008-03-15. Retrieved 2007-06-27.