Computer Science/컴퓨터 구조

[컴퓨터 구조] for Wide Immediate Operands : lui

바보1 2022. 10. 21. 14:00

 

 


앞의 글을 읽으시면 이해에 도움이 됩니다.

 

2022.10.01 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Type of Instruction (명령어의 타입)

 

[컴퓨터 구조] Type of Instruction (명령어의 타입)

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.10.01 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] RISC-V 명령어 작동 과정 (RISC-V Instruction Operation Process) [컴퓨터 구조] RISC-V 명령어 작동..

hi-guten-tag.tistory.com

2022.10.21 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Procedure call, jal, jalr (프로시저 콜을 위한 명령어들)

 

[컴퓨터 구조] Procedure call, jal, jalr (프로시저 콜을 위한 명령어들)

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.10.01 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Type of Instruction (명령어의 타입) [컴퓨터 구조] Type of Instruction (명령어의 타입) 앞의 글을..

hi-guten-tag.tistory.com


1. lui

 

 

우리는 지금 32bit architecture기 때문에, 하나의 register의 크기는 32bit입니다

그렇다면 unsigned라는 가정하에 2321를 표현하려면 어떻게 해야 할까요?

 

아무리 생각해도 addi 말고는 답이 없어 보이네요..

다만 문제점은 addi는 imm에 해당하는 bit가 12개기 때문에,

덧셈을 위해서는 addi를 계속해서 더함으로써 32bit 숫자를 표현해야겠네요

아무리 생각해도 비효율적인 것 같습니다.

 

그렇기 때문에 RISC-V에서는 lui(load upper immediate. U-type) 명령어를 제공합니다.

lui는 opcode : 7bit, rd : 5bit를 제외하고 남은 20bit를 immediate를 위해 사용합니다.

 

또한 이 명령어는 imme에 해당하는 20bit를 상위 20bit에 위치시킵니다.

rd의 31번째부터 12번째까지 위치시킵니다.

그리고 최종적으로 남은 12bit는 0으로 채웁니다.

 

그렇게 된다면 이제 addi로 덧셈만 해주면 쉽게 32bit 숫자를 표현할 수 있겠네요!

 

이를 그림으로 보면 아래와 같습니다.

만들고 싶은 숫자

위의 숫자를 만들어봅시다. 음. . .. . 3,998,976이라네요. 정확한지는 잘 모르겠는데 아무튼 확실한 건2111 보다는 큰 것 같습니다.

 

lui를 사용해서 상위 20bit에 숫자를 입력한다.
최종적으로 addi를 통해 원하는 숫자를 만든다.

쉽게 이해되시죠?

 

사실 addi 말고도 ori 명령어도 가능합니다.

 

해당 명령어 덕분에 레지스터 주소나 값이 길어도 처리할 수 있게 되었습니다.

 

그렇다면 주소는 어떻게 해결할까요?


2. 32-bit address

 

 

 

운영체제를 하시면 알겠지만, 32bit architecture에서 cpu가 볼 수 있는 메모리는 최대 4GB입니다.

 

그런데 앞 글에서 다룬 jal과 jalr을 이용해서 32bit의 공간을 왔다 갔다 할 수 있을까요?

jal은 opcode, register을 제외하고 남은 20bit를 이용해서 움직이는데, 끝에 0이 함축되어 있기 때문에 사실상 21bit를 사용하므로 최대 PC 기준으로 ±218 word를 볼 수 있습니다.

jalr은 opcode, register, imm을 제외하고 남은 12bit를 이용해서 움직이는데, 위와 마찬가지로 사실상 13bit를 사용합니다.

 

확실히 ±218 범위의 word로 4GB를 보기엔 턱 없이 부족하네요.

 

그렇기 때문에 여기서도 lui 명령어를 사용합니다.

 

lui를 통해 상위 20bit에 address를 저장하고, jalr을 통해 하위 12bit를 더하고 jump를 합니다.

 

따라서 전체 메모리를 참조할 수 있습니다.

 

간단하죠?

 

그렇기 때문에 jalr이 필요한 것입니다.

 

 

 

다음 글에서는 Procedure Call에 대해 더욱 자세히 적도록 하겠습니다.

(stack pointer, frame pointer, caller saved reg, callee saved reg)

 

2022.10.22 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Procedure Call

 

[컴퓨터 구조] Procedure Call

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.10.21 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Procedure call, jal, jalr (프로시저 콜을 위한 명령어들) [컴퓨터 구조] Procedure call, jal, jalr (..

hi-guten-tag.tistory.com

 

감사합니다.

 

지적 환영합니다.