Computer Architecture 2

2021. 4. 2. 22:50Hi/Computer_Architecture

2.1 ) 다음 C문장을 위한 LEGv8 어셈블리 코드를 작성하라. C변수 f,g,h는 레지스터 X0, X1, X2에 있다고 가정한다. 최소 개수의 어셈블리 명령어를 사용하라.

           f = g + ( h - 5 ) ;

 

add f, h, -5

add f, f, g

//h와 -5를 더하고 이를 다시 g랑 더한다.

 

 

2.3 ) 다음 C문장에 해당하는 LEGv8 어셈블리 코드는? C변수 f, g, h, i, j는 레지스터 X0, X1, X2, X3, X4에 있다고 가정한다. 배열 A와 B의 시작 주소는 레지스터 X6과 X7에 있다고 가정한다.

B[8] = A[i - j];

 

SUB x9, x3, x4 //임의의 x9레지스터에 i-j 를 해줌

LDUR x9, [x6, x9] // A배열이 시작 주소가 x6이고, i-j가 x9에 있다. 따라서 A[i-j]를 얻음

STUR X9, [x7, #64] // B[8]에 저장.

 

 

 2.4) 아래 LEGv8 어셈블리 명령어 시퀀스에 대응하는 C문장은? 변수 f, g, h, i, j는 레지스터 x0, x1, x2, x3, x4에 있다고 가정한다. 배열 A와 B의 시작주소는 레지스터 X6과 x7에 있다고 가정한다.

 

 B[g] = A[f] + A[1+f];

 

 

2.7) 0xabcdef12를 십진수로 변환하라.

 

먼저 abcdef12를 2진수로 바꾸고 이를 10진수로 바꾸면 2882400018이 나온다.

 

 

 

2.11) 래지스터 X0과 X1이 값 0x8000000000000000과 0xD000000000000000 을 갖고있다고 가정한다.

           2.11.1) 다음 명령어를 수행한 후의 X9 값은?

                     Add X9, X0, X1

x0을 이진수로 바꾸면 1000000000000000000000000000000000000000000000000000000000000000(2)이 되고,

x1의 값을 이진수로 바꾸면 1101000000000000000000000000000000000000000000000000000000000000(2)이 된다.

이 두개를 더하면 0101000000000000000000000000000000000000000000000000000000000000이 됨으로,

X9의 값은 0x5000000000000000 이다.

 

           2.11.2) x9값이 원하던 값인가, 아니면 오버플로가 일어났는가?

          

오버플로가 일어났다.

 

           2.11.3) 레지스터 x0과 x1 값이 위와 같을 때 다음 명령어를 수행한 후의 x9 값은?

                     SUB X9, X0, X1

 

1011000000000000000000000000000000000000000000000000000000000000이 됨으로, x9의 값은 0xB000000000000000 이다.

 

           2.11.4) x9가 원하던 값인가, 아니면 오버플로가 일어났는가?

 

원하던 값이다. 오버플로가 일어나지 않았다.

 

           2.11.5) 레지스터 x0과 x1 값이 위와 같을 때 다음 명령어를 수행한 후의 x9 값은?

                     Add X9, X0, X1

                     ADD X9, X9, X0

 

0x5000000000000000 에다 x0을 더하면 x9 의 값은 0xD000000000000000이 된다.

 

           2.11.6) X9값이 원하던 값인가, 아니면 오버플로가 일어났는가?

 

오버플로가 일어났다.

 

 

 

2.13) 다음 이진수에 해당하는 어셈블리 명령어 종류와 명령어는?

           1000 1011 0000 0000 0000 0000 0000 0000(two)

 

10001011000이  add를 뜻하고 어셈블리 명령어 종류는 R 타입이다., 나머지 필드는 0이기에 피연산자들과 자리이동은 없다.

즉, 어셈블리 명령어로 표현하면 add 0, 0, 0 이다.

 

 

 

2.18) 레지스터값이 다음과 같다고 가정한다.

           X10 = 0x00000000AAAAAAAA, X11 = 0x1234567812345678

(2진수로 바꾸면 x10 = 10101010101010101010101010101010,

x11 = 1001000110100010101100111100000010010001101000101011001111000)

 

           2.18.1) 레지스터 값이 위와 같을 때 다음 명령어 시퀀스 실행 후 X12값은 얼마인가?

           LSL X12, X10, #4

           ORR X12, X12, X11

          

x10의 값을 왼쪽으로 4칸 이동하므로 10101010101010101010101010100000이 되고, 이는 0xAAAAAAAA0이다.  이를 x11과 or 연산을 하면 x12의 값은  0x1234567ABABEFEF8이 된다.

 

           2.18.2) 레지스터 값이 위와 같을 때 다음 명령어 실행 후 X12 값은 얼마인가?

           LSL X12, X11, #4

          

x11의 값을 왼쪽으로 4번 shift하면 x12의 값은 0x2345678123456780 이 된다.

 

           2.18.3) 레지스터값이 위와 같을 때 다음 명령어 시퀀스 실행 후 X12값은 얼마인가?

LSL X12, X10, #3

           ANDI X12, X12, 0xFEF

 

x10의 값을 왼쪽으로 3번 shift하면 0x555555550이 된다. 그리고 이를 0xFEF(111111101111)를 ANDI 연산을 하면 x12의 값은 0x540(010101000000)이 된다.

 

 

 

2.26) 다음 C코드를 LEGv8 코드로 변환하되 최소 개수의 명령어를 사용하라. 변수 a, b, i, j는 레지스터 x0, x1, x10, x11에 있다고 가정한다. 배열 D의 시작 주소는 레지스터 x2에 있다고 가정한다.

           for (i=0; i<a; I++)

                     for (j=0, j<b; j++)

                                D[4*j] = i + j;

 

        add X10, X10, $zero              # i = 0

        add X11, X11, $zero                # j = 0

L1 :      slt X12, X10, X0                    # i<a

        beq X12, $zero, EXIT    # if X12 == 0, Exit

        add X11, $zero, $zero # j=0

         addi X10, X10, $1                 # i ++

L2 :      slt X13, X11, X1                 # j<b

          beq X13, $zero, L1,               # if $t3 == 0, goto L1

          add X14, X0, X11                          # $t4 = i+j

          muli X15, X11, $4                         # $t5 = $t1 * 4

           sll X15, X15,$2                   # $t5 << 2

          add X15, X15, X2                          # D + $t5

          sw X14, X15(X2)                   # store word $t4 in addr $t5(D)

          addi X10, X11, $1                 # j ++

           j L2                             # goto L2

EXIT :

 

728x90

'Hi > Computer_Architecture' 카테고리의 다른 글

Computer Architecture 4  (3) 2021.04.02
Computer Architecture 3  (0) 2021.04.02
Computer Architecture 1  (6) 2021.04.02