본문 바로가기
BackEnd/Computer Architecture

1.2.6 어셈블리어로 긴 수치와 주소를 쓰는 법

by 12312121 2022. 3. 2.

32비트 크기의 상수를 만드는 법
RISC-V는 한 명령어당 최대 32비트까지만 쓸 수 있게 설계 되어있고 그 중 상수를 표현하는 파트인 immediate는 12비트까지만 쓸 수 있다
이것을 극복해서 32비트 꽉 채워서 상수를 만드는 방법은 두 이진수 문장을 합치는 것이다. 아래가 예시다.

목표
x19에
00000000000000000000000000000000
00000000001111010000010100000000 넣기

1단계
lui는 상수를 기존 11 ~ 0비트가 아니라 레지스터의 31~12비트에 넣는 함수이다
그리고, 넣을 0000 0000 0011 1101 0000은 십진수 976과 같아서 lui x19, 976를 쓴다. 따라서 현재 x19 =
00000000000000000000000000000000
00000000001111010000000000000000

2단계
그리고 아직 안넣은
00000000000000000000000000000000
00000000000000000000010100000000
은 십진수1280과 같아서
addi x19, x19, 1280를 하면 끝난다


분기 명령에서의 주소지정
bge 같은 조건부 분기는 조건, 저장, 분기를 다 담당해서 주소 값을 담당하는 immediate는 12비트만 받아서 13비트 이상의 주소로는 가지 못한다

하지만  jal 같은 무조건 분기는 분기만 해서 immediat가 20비트를 받아서 20비트만큼의 주소로 갈 수 있다

하지만 그러면 프로그램에서 사용하는 모든 주소가 20비트로 제한된다. 그래서  PC-상대주소지정방식을 쓴다. 이것은 주소를 하나 하나 다 가지고 다니지 않고 그냥 주소가 필요할때만 현재 주소가 담긴 레지스터에서 해당 주소까지의 거리(=변위)만큼 빼거나 더해서 구한다, 일종의 점프이다

 

하지만 그 점프 시의 최대 거리도 19비트가 한계다.

 

하지만 맨처음에 말한 lui, addi를 써서 32비트짜리 상수를 만드는 법을 쓴다면 32비트까지 점프할 수 있다.

댓글