정수 연산 어셈블리 명령어는 명령어 자체에 숫자를 바로 적어 넣을 수 있습니다.
addq $32, %rax # %rax 레지스터에 숫자 32를 더하라 (32가 명령어 코드 안에 직접 들어감)
명령어 바이트 안에 숫자를 직접 넣는 방식을 즉시값 (Immediate value)이라고 부릅니다.
하지만 실수(부동소수점) 연산 명령어는 즉시값을 지원하지 않습니다.
# 문법 에러가 발생하는 불가능한 명령어
vmulsd $3.14, %xmm0, %xmm0 # CPU에 이런 형태의 기계어 형식이 아예 존재하지 않음!
x86-64 CPU를 설계할 때, 64비트 실수(double)의 복잡한 0과 1 비트 패턴을 명령어 코드 안에 직접 집어넣는 하드웨어 회로 규격을 만들지 않았기 때문입니다. 실수 연산 장치(AVX/SSE)는 오직 레지스터끼리 계산하거나 메모리 주소에서 숫자를 읽어와서 계산하도록만 만들어졌습니다.
컴파일러는 C 코드에 적힌 실수 숫자(3.14)를 프로그램의 읽기 전용 데이터 영역(.rodata) 메모리에 미리 8바이트 숫자로 기록해 둡니다.
.section .rodata
.LC0:
.long 1413754136 # 3.141592... 의 하위 4바이트 정수 표현
.long 1074340347 # 3.141592... 의 상위 4바이트 정수 표현
.text
# 메모리 주소 .LC0에서 8바이트를 읽어와서 실수 전용 레지스터 %xmm0에 복사
vmovsd .LC0(%rip), %xmm0
# 레지스터에 들어있는 값끼리 곱셈 실행
vmulsd %xmm0, %xmm1, %xmm0
.rodata 영역에 먼저 저장됩니다.