TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 20 READS

46년 전 인텔 8087 칩 속 마이크로코드 뜯어보기: FSCALE 명령어는 어떻게 2의 거듭제곱을 곱할까

46년 전 인텔 8087 칩 속 마이크로코드 뜯어보기: FSCALE 명령어는 어떻게 2의 거듭제곱을 곱할까
SOURCE IMAGE · HACKER NEWS
46년 전 인텔 8087 칩 속 마이크로코드 뜯어보기: FSCALE 명령어는 어떻게 2의 거듭제곱을 곱할까

오래된 칩을 현미경으로 들여다보는 사람

빈티지 컴퓨터 칩을 현미경으로 찍어서 회로를 하나하나 해독하는 켄 셔리프(Ken Shirriff)라는 분이 있어요. 이번엔 인텔이 1980년에 내놓은 8087 부동소수점 코프로세서의 마이크로코드를 파고들었는데요. 그중에서도 FSCALE이라는 명령어 하나가 칩 내부에서 어떻게 실행되는지를 풀어냈어요. 명령어 하나 가지고 글 한 편이라니 과해 보일 수 있는데, 읽어보면 부동소수점이 실제 하드웨어에서 어떻게 다뤄지는지가 손에 잡히거든요.

8087이 뭐였냐면

8086 CPU에는 원래 소수점 계산 기능이 없었어요. 3.14 곱하기 2.5 같은 걸 하려면 정수 연산을 여러 번 조합하는 소프트웨어 루틴을 돌려야 했고, 그게 엄청 느렸죠. 8087은 그 옆에 꽂아서 소수점 계산을 대신 해주는 보조 칩이에요. 그리고 이 칩이 중요한 이유가 하나 더 있는데, 지금 모든 프로그래밍 언어가 쓰는 부동소수점 표준인 IEEE 754가 사실상 8087 설계를 바탕으로 만들어졌거든요. 여러분이 자바스크립트에서 0.1 + 0.2가 0.30000000000000004로 나오는 걸 볼 때, 그 규칙의 뿌리가 이 칩이에요.

8087은 내부에서 80비트 확장 정밀도로 계산해요. 부호 1비트, 지수 15비트, 가수 64비트요. 그리고 레지스터가 스택 구조라서 ST(0), ST(1) 이런 식으로 맨 위부터 접근하죠.

마이크로코드가 뭐냐면

CPU 명령어라고 하면 하드웨어가 바로 실행하는 것처럼 느껴지는데, 실제로는 그렇지 않은 경우가 많아요. 복잡한 명령어는 칩 안에 있는 작은 ROM에 저장된 '더 작은 명령어들의 프로그램'으로 실행돼요. 이게 마이크로코드예요. 비유하자면, 주문서에 '김치찌개'라고 적혀 있으면 주방에서는 그걸 '물 끓이기, 김치 넣기, 고기 넣기' 같은 세부 단계로 풀어서 수행하잖아요. 그 세부 단계 목록이 마이크로코드고, 그게 적힌 레시피북이 마이크로코드 ROM이에요. 8087은 명령어 대부분이 이렇게 마이크로코드로 구현되어 있어요.

셔리프는 칩의 패키지를 벗기고 실리콘 다이를 현미경으로 찍은 다음, ROM 영역에 트랜지스터가 있는지 없는지를 보고 0과 1을 읽어냈어요. 그렇게 뽑은 비트열을 마이크로 명령어 형식에 맞춰 해독하는 거죠. 문서 하나 없이 회로 패턴만 보고 프로그램을 복원하는 셈이에요.

FSCALE은 뭘 하는 명령어인가

FSCALE은 ST(0)에 2의 ST(1)제곱을 곱하는 명령어예요. 예를 들어 ST(0)이 3.0이고 ST(1)이 4면 결과는 3.0 × 2의 4제곱 = 48.0이 되죠. C 언어의 ldexp()scalbn() 함수가 하는 일이랑 같아요.

그런데 왜 이런 명령어가 따로 있을까요? 부동소수점 숫자는 (가수) × 2^(지수) 형태로 저장되잖아요. 그러니까 2의 n제곱을 곱하는 건 실제로 곱셈을 할 필요가 없어요. 지수 필드에 n을 더하기만 하면 끝이거든요. 곱셈기를 돌리는 것보다 훨씬 빠르고 오차도 전혀 없어요. 그래서 지수 함수나 로그 함수를 구현할 때 마지막 단계에서 이 명령어가 자주 쓰여요.

그런데 왜 마이크로코드가 복잡해질까

'지수에 정수 더하기'라고 하면 한 줄일 것 같은데, 실제 마이크로코드는 훨씬 길어요. 이유가 여러 가지거든요.

먼저 ST(1)이 정수가 아니라 부동소수점 값이에요. 4.7이면 4로 잘라내야 하는데(반올림이 아니라 0 방향으로 절사), 부동소수점 값에서 정수 부분을 뽑아내는 것 자체가 시프트와 마스크 연산을 여러 단계 거쳐야 하는 일이에요. 그 다음엔 특수한 값들을 다 처리해야 해요. ST(0)이 0이거나 무한대거나 NaN이면 어떻게 할지, ST(1)이 너무 커서 지수가 넘치면(오버플로) 무한대로 만들지, 너무 작아서 바닥을 뚫으면(언더플로) 아주 작은 수를 표현하는 '비정규 수' 형태로 바꿀지 등이요. 8087에는 지금 표준에는 없는 '비정상 수(unnormal)'라는 형식까지 있어서 경우의 수가 더 늘어나죠. 이 모든 분기가 마이크로코드 안에 조건 점프로 구현되어 있는 걸 셔리프가 하나하나 추적한 거예요.

한국 개발자에게 주는 시사점

당장 8087 코드를 짤 일은 없겠지만, 이 이야기가 주는 교훈은 지금도 유효해요. 첫째, 부동소수점은 '숫자'가 아니라 '부호, 지수, 가수'라는 구조체라는 걸 기억하면 온갖 오차 문제를 이해하기 쉬워져요. 둘째, 지금 쓰는 인텔이나 AMD CPU도 여전히 마이크로코드로 동작하고, 스펙터 같은 보안 취약점 패치가 마이크로코드 업데이트로 배포된다는 사실도 이 맥락에서 이해할 수 있고요. 셋째, 2의 거듭제곱 곱셈처럼 '구조를 알면 공짜인 연산'을 알아두면 성능 최적화할 때 써먹을 데가 있어요.

정리하며

FSCALE 하나를 뜯어보면 '간단한 연산도 모든 경계 조건을 처리하면 복잡해진다'는 걸 46년 전 실리콘이 증명하고 있어요.

여러분은 부동소수점 때문에 고생한 경험이 있으신가요? 어떤 버그였는지 댓글로 들려주세요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://www.righto.com/2026/09/8087-microcode-reverse-engine...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...