부동 소수점 레지스터 $f

송민준·2021년 10월 1일
3

컴퓨터구조

목록 보기
1/1

컴퓨터구조 공부 중 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 (가상명령어)

  • single precision
    li.s $f0, 0.5
  • double precision
    li.d $f0, 0.5

/ Print and Read

  • print
li $v0, 2
li.s $f12, 0.5
syscall
  • read
li $v0, 6
syscall

(읽은 결과는 $f0에 저장될 것이다.)

coprocessor 1 이라는 특별한 프로세서를 사용한다는 점이 흥미로웠고 꽤나 유익했던 검색이었지만 죄다 영문으로 되어있어 꽤나 애를 먹었던 점에서 영어의 중요함을 깨달았다.

profile
개발자

0개의 댓글