컴퓨터구조 공부 중 System Call에 대한 내용 중에 의문이 드는 점이 있었다.
System call 함수 중 print_float 함수는 $f12 레지스터를 사용한다.
float를 콘솔창에 출력시키는 명령이니 $f 는 부동소수점을 관리하는 레지스터임을 어림짐작했다.
그러나 레지스터 테이블에도 없으며 레지스터는 32개로 한정되어있어 의문이 들었다.
..인터넷 검색결과
$f 는 floating point register 으로 불리며 이를 처리하는 명령어가 따로 존재한다.
그리고 이들을 관리하는 coprocessor 1 은 프로세서와 따로 분리되어 있으며 32개의 레지스터에 부동소수점 레지스터가 포함되지 않았던 이유이기도 하다.
간략하게 부동소수점과 관련한 명령어들을 살펴보면
/ Load and Store (floating point)
single precision
메모리에서 32비트를 부동소수점 레지스터로 로드한다.
lwc1 $f0, 0($t0)
부동소수점 레지스터의 32비트를 메모리에 저장한다.
swc1 $f0, 0($t0)
double precision
메모리에서 64비트를 부동소수점 레지스터로 로드한다.
ldc1 $f0, 0($t0)
부동소수점 레지스터의 64비트를 메모리에 저장한다.
sdc1 $f0, 0($t0)
*부동소수점 명령어는 일반 레지스터를 사용할 수 없다. 따라서 이와같이 메모리에서 가져오거나 부동소수점 레지스터로 부터 메모리에 저장하는 명령어가 필요하다.
/ Load immediate (가상명령어)
li.s $f0, 0.5
li.d $f0, 0.5
/ Print and Read
li $v0, 2
li.s $f12, 0.5
syscall
li $v0, 6
syscall
(읽은 결과는 $f0에 저장될 것이다.)
coprocessor 1 이라는 특별한 프로세서를 사용한다는 점이 흥미로웠고 꽤나 유익했던 검색이었지만 죄다 영문으로 되어있어 꽤나 애를 먹었던 점에서 영어의 중요함을 깨달았다.