코드네임 :

🖥️컴퓨터구조 과제3 📚 본문

⚙️Computer System/컴퓨터구조

🖥️컴퓨터구조 과제3 📚

비엔 Vien 2024. 4. 30. 11:04

과제 1. Assembly to C

 

clear1:

    li x5,0  // i = 0  

loop:

    slli x6,x5,2  // x6 = i * 4 (배열 offset)

    add x7,x10,x6  // x7 = address of array[i] ( x7 = array[i] )

    sw x0,0(x7)  // array[i] = 0

    addi x5,x5,1 // i += 1 (i++)

    blt x5,x11,loop // i < x11(size) branch to loop 

 

⬇️

 

clear1(int array[], int size){
    int i;
    for (int i = 0; i < size; i +=1) {
        array[i] =0;
}

 

 

 

 

 

과제 2.  Machine to Assembly

# 16진수는 10부터 a

# 야 16진수에서 2진수 변환 각각 자릿수마다 계산하면 됨 (ex. 0 -> 0000/ A(10) -> 1010 )

 

0: 017b1663   // 0000 0001 0111 1011 0001 0110 0110 0011 (SB format)

                       //  imm12(1)  imm10-5(6)  rs2(5)  rs1(5)  func3  imm4-1(4) imm11  opcode(7)

                       //         0         000000      10111   10110        001     0110          0

                       //  func : bne

                       //  rs1 : 10110 = 16 + 4 + 2 = x22

                       //  rs2 : 10111 = 16 + 4 + 2 + 1 = x23

                       //  imm : 000000000110 = 4 + 2 = 6

                       // bne x22, x23, 6

 

4: 015a09b3   // 0000 0001 0101 1010 0000 1001 1011 0011 (R format)

                       // func7         rs2      rs1  func3  rd    opcode

                       // 0000000 10101 10100 000 10011

                       //  func3 000 : add or sub -> func7 0000000 : add

                       // rd : 10011 = 16 + 2 + 1 = x19

                       // rs1 : 10100 = 16 + 4 = x20

                       // rs2 : 10101 = 16 + 4 + 1 = x21

                       // add x19, x20, x21

 

8: 00000463  // 0000 0000 0000 0000 0000 0100 0110 0011 (SB format)

                         // imm12(1) imm10-5(6) rs2(5) rs1(5) func3 imm4-1(4) imm11 opcode

                         //     0          000000     00000  00000 000    0100            0

                         // func : beq
                         // rs1 : 0 = x0

                         // rs2 : 0 = x0

                         // imm : 0100  = 8

                         // beq x0, x0, 8

 

0000000c <Else>:  // 0000 0000 0000 0000 0000 0000 0000 1100 ( ??? )

// Else 주소가 c

 

c: 415a09b3  // 0100 0001 0101 1010 0000 1001 1011 0011 ( R format )

                       // func7         rs2      rs1  func3  rd    opcode

                       // 0100000 10101 10100 000 10011

                       //  func3 000 : add or sub -> func7 0100000 : sub

                       // rd : 10011 : 16 + 2 + 1 = x19

                       // rs1 : 10100 = 16 + 4  = x20

                       // rs2 : 10101 = 16 + 4 + 1  = x21

                       // sub x19, x20, x21

 

00000010 <Exit>: // 0000 0000 0000 0000 0000 0000 0001 0000 ( ??? )

// Exit 주소 10

 

10: 01300533  // 0000 0001 0011 0000 0000 0101 0011 0011 ( R format ) 

                       // func7         rs2      rs1  func3  rd    opcode

                       // 0000000 10011 00000 000 01010

                       //  func3 000 : add or sub -> func7 0000000 : add

                       // rd : 01010 = 8 + 2 = x10

                       // rs1 : 00000 = 0

                       // rs2 : 10011 = 16 + 2 + 1 = x19

                       // add x10, 0, x19

 

즉,

0: bne x22, x23, 6

2: add x19, x20, x21

4: beq x0, x0, 8

<Else>: 

c: sub x19, x20, x21

<Exit>:

10: add x10, 0, x19 

 

⬇️

    bne x22, x23, Else
    add x19, x20, x21
    beq x0, x0, Exit
<Else>: 
    sub x19, x20, x21
<Exit>:
    add x10, 0, x19

 

 

 

 

 

과제 3. RISC-V 레지스터를 128개로 늘리고, 명령어는 현재보다 4배 많게 확장하려고 한다.

# 기존 32개 에서 128개로 늘어난다면,  (2^5 to 2^7)

 

(1)   이렇게 확장한다면, R-타입 명령어의 각각의 비트 필드 크기에 어떤 영향을 미치게 되는가?

>> 레지스터가 128개로 늘어났기에 5비트를 사용하던 rd, rs1, rs2 필드는 5비트에서 7비트로 확장된다.

>> 명령어도 현재보다 4배 많게 확장되었기에 func7 과 func3 필드도 확장될 수 있다.

 

(2)   이렇게 확장한다면, I-타입 명령어의 각각의 비트 필드 크기에 어떤 영향을 미치게 되는가?

>> 레지스터가 128개로 늘어났기에 5비트를 사용하던 rd, rs1 필드는 5비트에서 7비트로 확장된다.

>> immediate 필드는 기존 12비트가 유지되거나 부호에 따라 연장될수 있다.

>> 명령어도 현재보다 4배 많게 확장되었기에 func3 필드가 확장될 수 있다.

 

(3)   제안한 두가지 확장으로 인하여, RISC-V 어셈블리 프로그램 중 일부는 길이가 길어졌다고 한다. 이유는 무엇이었을까? 

>> 레지스터가 128개로 늘어났기 떄문에, 각 레지스터를 인코딩하기 위한 비트가 늘어났기 때문이다. 

>> 명령어의 개수가 4배로 확장되었기 때문이다. (이전에 없던 연산 과정 추가될수 있음)

 

(4)   제안한 두가지 확장으로 인하여, RISC-V 어셈블리 프로그램 중 일부는 길이가 짧아졌다고 한다. 이유는 무엇이었을까? 

>> 사용할 수 있는 레지스터가 더 많아졌기에 효율적인 데이터 처리가 가능해져 load나 store 명령어 사용이 줄어들어 오히려 짧아질 수 있다.

>> 새로운명령어가추가되었다면기존에여려명령어를써야했던연산과정을짧게줄일수도있을것이다