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라는 가정하에 \(2^{32}-1\)를 표현하려면 어떻게 해야 할까요?

 

아무리 생각해도 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이라네요. 정확한지는 잘 모르겠는데 아무튼 확실한 건\(2^{11}-1\) 보다는 큰 것 같습니다.

 

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

쉽게 이해되시죠?

 

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

 

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

 

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


2. 32-bit address

 

 

 

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

 

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

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

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

 

확실히 \(\pm2^{18}\) 범위의 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

 

감사합니다.

 

지적 환영합니다.