FABS, FADD, FCMP
Example
FABS, FADD, FCMP는 일반 정수 명령어(ABS, ADD, CMP) 앞에 Floating-Point를 뜻하는 F가 붙은 형태입니다. 정수 연산과 부동소수점 연산은 “아예 일하는 공장(연산 장치)과 규칙이 완전히 다른 별개의 세상”입니다.
💡 0. 무대가 다르다: FPU와 전용 레지스터 (S, D 레지스터)
가장 먼저 교본에 박아 넣어야 할 핵심 차이는 “사용하는 레지스터와 실행 장치”가 다르다는 점입니다.
- 일반 정수 명령어 (ADD, CMP 등): CPU 내부의 ALU(산술논리연산장치)에서 실행되며, 일반 범용 레지스터(W0~W31, X0~X31)를 사용합니다.
- 부동소수점 명령어 (FADD, FCMP 등): CPU 내부의 FPU(부동소수점 연산장치)라는 특수 공장에서 실행되며, 전용 플로팅 레지스터인 S0~S31 (단정밀도 32비트, float) 또는 D0~D31 (배정밀도 64비트, double)을 사용합니다.
FABS
Floating-point Absolute value (부동소수점 절댓값)
- 정수 버전 (ABS / CNEG 등)과의 결정적 차이:
- 정수에서 절댓값을 구하려면 숫자가 음수인지 비교(CMP)하고 부호를 뒤집는 수학적 연산(CNEG) 과정을 거쳐야 했습니다.
- 하지만 부동소수점의 세계에서는 수학 계산을 아예 하지 않습니다! 컴퓨터 하드웨어 표준(IEEE 754)상 부동소수점 데이터의 가장 첫 번째 비트(최상위 비트, MSB)는 ‘부호 비트(Sign Bit)’로 딱 고정되어 있기 때문입니다. (0이면 양수, 1이면 음수)
- 따라서 FABS 명령어는 하드웨어 회로 수준에서 “가장 첫 번째 비트(부호 비트)를 강제로 0으로 툭 바꿔버리는 비트 마스킹”만 수행합니다. 비교도 계산도 필요 없기 때문에 정수 절댓값보다 훨씬 가볍고 초고속으로 작동합니다.
FABS S0, S1 ; S1에 든 소수의 부호 비트를 0으로 만들어(양수화) S0에 저장!
FADD
Floating-point Add (부동소수점 덧셈)
- 정수 버전 (ADD)과의 결정적 차이:
- 정수 덧셈은 그냥 이진수 자리올림만 하면 끝나는 매우 단순한 작업입니다.
- 반면 부동소수점 덧셈(FADD)은 내부적으로 하드웨어가 엄청나게 바쁘게 움직이는 “초정밀 4단계 공정”을 거쳐야 합니다. 예를 들어 $1.23 \times 10^1 + 4.56 \times 10^{-1}$을 더한다고 생각해 보세요. 소수점 위치(지수)가 다르면 바로 더할 수가 없죠!
- 지수 맞추기 (Alignment): 두 소수의 소수점 위치를 똑같이 맞추기 위해 한쪽 숫자를 옆으로 밀어줍니다. 2. 가수부 덧셈 (Fraction Addition): 소수점 자리가 맞은 상태에서 실제 알맹이 숫자들을 더합니다. 3. 정규화 (Normalization): 더한 결과값을 다시 표준 규격(예: $1.xxxx \times 2^y$) 형태로 소수점 위치를 예쁘게 재조정합니다. 4. 반올림 (Rounding): 레지스터 크기(32비트 또는 64비트)를 넘어가서 잘리는 소수점 아래 무한 소수들을 반올림 규칙에 따라 정밀하게 다듬습니다.
이처럼 FADD는 정수 ADD와 겉보기엔 같아 보여도, 보이지 않는 곳에서 하드웨어가 엄청난 정밀 제어를 수행하는 복잡한 명령어입니다.
FCMP
Floating-point Compare (부동소수점 비교)
- 정수 버전 (CMP)과의 결정적 차이:
- 정수 비교는 앞서 배웠듯 단순히 빼기(-)를 해서 0인지 음수인지 확인하면 끝입니다.
- 하지만 부동소수점의 세계에는 “숫자가 아닌 괴물들”이 살고 있습니다. 수학에서 정의할 수 없는 값인 NaN (Not a Number, 예: 0 나누기 0의 결과)이나, 양의 무한대(+∞), 음의 무한대(-∞) 같은 특수한 상태가 존재합니다.
- 특히 NaN이라는 녀석은 자기 자신과 비교해도 “다르다”고 판결이 나는 엄청난 미스터리 박스입니다.
- 따라서 FCMP는 단순히 크다/작다를 넘어, “비교 대상 중에 NaN이 포함되어 있지는 않은지”까지 정밀하게 검사하여 CPU 플래그 레지스터에 기록해 줍니다.
- 만약 NaN을 잘못 건드리면 하드웨어 예외(익셉션)가 발생해 프로그램이 뻗을 수 있으므로, FCMP는 이 예외를 발생시킬지 말지 조절하는 안전장치 기능도 내부적으로 포함하고 있습니다.
FCMP S0, S1 ; S0과 S1 두 소수를 비교 (NaN 상태까지 정밀 검사!)
🧱 후진 양성 마크다운 교본용: 정수 vs 부동소수점 전격 비교 판넬
후배들이 두 세계의 본질적인 차이를 한눈에 관통할 수 있도록 정갈하게 비교 표를 선물해 드립니다!
| 항목 | 정수 명령어 (ABS, ADD, CMP) | 부동소수점 명령어 (FABS, FADD, FCMP) | 후진들을 위한 선배의 한마디 포인트 |
|---|---|---|---|
| 작동 무대 | 일반 ALU (산술논리연산장치) | FPU (부동소수점 전용 연산장치) | “일하는 부서와 도구(레지스터)가 완전히 다르다!” |
| 사용 레지스터 | Wn (32비트), Xn (64비트) | Sn (32비트 float), Dn (64비트 double) | “소수점 전용 서랍장을 사용해야 한다!” |
| 절댓값 (FABS) | 비교 후 부호 반전 연산 필요 (CNEG) | 오직 부호 비트를 0으로 바꾸는 비트 마스크 | “수학 계산이 아니라 단순한 스위치 조작이다!” |
| 덧셈 (FADD) | 단순 이진수 자리올림 덧셈 | 소수점 정렬 ➡️ 덧셈 ➡️ 정규화 ➡️ 반올림 | “정밀도를 지키기 위한 하드웨어 4단계 공장이다!” |
| 비교 (FCMP) | 단순 뺄셈을 통한 크기 비교 | 크기 비교 + NaN (숫자가 아님) 유무 정밀 검사 | “미스터리한 값(NaN)까지 잡아내는 안전망이다!” |