티스토리 뷰

학교

컴퓨터구조 중간고사범위

devbelly 2021. 10. 30. 22:53

image

image

mult rs, rt / multu rs, rt / mfhi rd / mflo rd


rs 레지스터와 rt 레지스터의 곱셈을 수행한다. 연산의 결과 64비트를 저장하기 위해 hi, lo 레지스터를 사용하여 저장한다. hilo의 값을 확인하기 위해 mfhi rd, mflo rd명령어를 사용한다.

  • 곱셈의 결과는 오버플로우 체크를 하지 않는다. (프로그램에서 확인 가능)

div rs,rt / divu rs, rt


rs레지스터를 rt레지스터와 나눈다.

  • overflow와 divide-by-zero checking을 자체적으로 수행하지 않는다.
  • hi에는 remainder lo에는 quotient가 저장된다.

nor rd, rs, rt


rs 레지스터와 rt 레지스터를 or 한 후 not을 하여 rd 레지스터에 저장한다.

Example

.text
.globl main
main:
    addi $t1, $0, 0x3C00
    addi $t2, $0, 0x0DC0

    nor $t6, $t1, $t2
    nor $t7, $t1, $t1
0x3c00 0000 0000 0000 0000 0011 1100 0000 0000
0x0dc0 0000 0000 0000 0000 0000 1101 1100 0000
$t6 1111 1111 1111 1111 1100 0010 0011 1111

이러한 성질로 인하여 어셈블리에서는 not 연산을 필요로 하지 않는다. 예를 들어 $t1에 대해 not 연산이 필요하다면 아래와 같이 하면 된다.

1) nor $t6, $t1, $t1
2) nor $t6, $t1, $0

R-format

image

add rd, rs, rt / addu rd, rs, rt


rs 레지스터와 rt 레지스터를 더해 rd 레지스터에 해당 값을 저장한다. 어셈블리에서는 destination 레지스터를 먼저 적었지만 기계어에서는 0p rs rt rd shamt 32의 순서로 표현된다.

sll / srl


rt 레지스터의 값을 shamt만큼 shift를 하여 rd 레지스터에 저장한다. rs 레지스터는 0임을 주의하자.

I-format

image

ori


  • I-format
  • R[rt] = R[rs] | ZeroExtImm

andi


  • I-format
  • R[rt] = R[rs] & ZeroExtImm

addi


  • I-format
  • R[rt] = R[rs] + SignExtImm

ori, andi VS addi


프로세서의 ALU는 2개의 32비트를 입력받아 1개의 32비트 출력을 만들어 내는 장치입니다. I-format의 공간적인 한계로 인해 Imm필드는 16비트로 밖에 표현되지 못하여 ALU연산을 위해 Extension을 해야합니다. ori, andi와 같은 logical instruction은 ZeroExtension을 수행하고 addi와 같은 arithmetic instruction은 SignExtension을 하게 됩니다.

out-of-range error


어셈블리를 기계어로 바꾸는 과정에서 out-of-range error가 발생할 수 있습니다. 이때 아래의 두 원칙이 적용됩니다.

1. out-of-range error는 명령어의 종류에 따라 결정된다.

  • 명령어의 종류가 arithmetic instruction(addi,addiu)일 때, 상수 operand에 signed number가 올것을 기대하여 -32768~32767범위를 벗어나게 되면 out-of-range error가 발생

  • 명령어의 종류가 logical instruction(andi, ori)일 때, 상수 operand에 unsigned number가 올 것을 기대하여 0~65535범위를 벗어나게 되면 out-of-range error가 발생

2. 상수 operand는 10진수인지 16진수인지에 따라 signed, unsigned를 결정한다.

  • operand에 10진수를 적으면 signed number로 해석되고
  • operand에 16진수를 적으면 unsigned로 해석된다.

lui rt, imm


  • rt레지스터의 상위 16비트를 imm로 초기화한다
  • rt레지스터의 하위 16비트를 0으로 초기화한다

Pseudoinstruction , li


load immediate instruction, 기계어 명령은 아니지만 프로그래머의 편의를 위해 존재한다

  • li $10, 1 : 10번 레지스터에 1을 저장한다
  • 위 명령어는 ori $10, $0, 1로 SPIM에 load 된다.

sw rt, offset(rs) / lw rt, offset(rs)


  • rt: destination (lw) or source (sw) register number
  • rs: base register number

Initializing Data Segment


Example 1

.data
.byte 1
.byte -2
.space 3
.byte 's'
Address value
0x1001000 0x01
0x1001001 0xfe
0x1001002 0x00
0x1001003 0x00
0x1001004 0x00
0x1001005 0x73

**in c **

char arr[]={1,-2,0,0,0,'s'};

Example 2

.data 0x10020000
w1: .word 1
    .word -1
    .word 0xabcdef12
    .word 0xffff

.text
main: lui $5, 0x1002
      lui $4, 0x789a
      sw  $4, 8($5)

in c

int w1[4]={1,-1,0xabcdef12,0xffff};
int main(){
    w1[2]=0x789a0000;
}

.ascii VS .asciiz


.ascii와는 다르게 .asciiz는 추가적으로 맨 끝에 0을 저장한다.

str: .ascii "star"
str2: .asciiz "star"

in c

char str[]={'s','t','a','r'};
char str2[]={'s','t','a','r','\0'};

Big Endian vs Little Endian


  • Big Endian: 주소가 큰(big)쪽에 수의 마지막 부분을 적는다
  • Little Endian:주소가 작은(little)쪽에 수의 마지막 부분을 적는다.

Example

.data 0x10010000
.byte 1
.byte -2
.space 1
.byte 's'

Big Endian? 0x01fe0073

Little Endian? 0x7300fe01

word alignment


데이터를 저장하다가 4바이트에 해당하는 데이터를 저장할 때, 현재 비어있는 공간부터 데이터를 저장하는 것이 아니라 4의 배수에 해당하는 주소부터 새로이 데이터를 저장한다.

Example

.data 0x10010000
a:
    .byte 1
    .byte -2
w:
    .word 1

.text
.globl main
main:
    la $5, a
    la $6, w       

결과는 다음과 같이 .word 1을 저장할 때 0x10000002,0x10000003 주소를 건너뛰고 0x10000004부터 저장함을 알 수 있습니다.

  • $5: 0x10000000
  • $6: 0x10000004

Memory Operand


Example

int g,h,A[100];
g = h + A[8];
  • g in $s1, h in $s2, base address of A in $s3

jr r


rs 레지스터에 적힌 주소로 branch를 한다. 다른 unconditional branch은 J-format인 반면 jr은 R-format이다.

Example

.text 0x00400024
.globl main
main:
    nop
    la $t1, main
    jr $t1

j L1 / jal L2


L1에 해당하는 Label로 branch를 한다. J-format을 사용. jjal의 차이점은 jal은 branch를 할 때, 추가적으로 현재 PC값의 다음 값을 $31레지스터에 저장한다.

image

target은 assemble과정에서 branch할 주소를 적어야하는데 26비트 밖에 할당할 수가 없다. 따라서 BTA를 계산하기 위한 특별한 방법을 적용해 32비트로 변환을 해야한다.

Example

.text 0x00400024
.globl main
main:
    nop
    j main

beq rs, rt, L1 / bne rs, rt, L1


rs레지스터와 rt레지스터를 비교하여 같거나(beq) 다르다면(bne) L1에 해당하는 Label로 branch를 한다. 두 개의 레지스터와 branch를 위한 immediate field를 사용하므로 L-format이다.

Example

    bne $3, $4, Else # 0x00400038
    add $s0, $s1, $s2
    j Exit
Else: sub $s0, $s1, $s2
Exit: add $s0, $s0, $s0

branch할 주소를 16비트로 밖에 표현을 못하므로 BTA를 계산을 따로 해야한다. 16비트에 B가 적힌다면 BTA는 B x 4 + PC가 된다. B x 4를 한 후 32비트인 PC와 덧셈을 하기 위해 Sign Extension을 하게 된다. Example에서 현재 PC값이 0x00400038일 때, 현재 PC와 Else 명령어 사이는 3칸의 차이가 있으므로 3 x 4 + PC를 하면 Else의 주소를 얻을 수 있다. 이러한 계산이 가능한 이유는 PC와 BTA가 서로 local하기 때문이다.

slt rd, rs, rt / slti rd, rs, constant


  • slt rd, rs, rt : if(R[rs]<R[rt]) R[rd]=1 else R[rd]=0;
  • slti rd, rs, constant: if(R[rs]<constant) R[rd]=1 else R[rd]=0;

sltbne, beq와 함께 사용하기 위해서 존재한다. if (R[$s3]<R[$s4])와 같은 명령어는 아래와 같이 표현할 수 있다.

slt $1, $s3, $S4
bne $1, $0, Target

프로그래머의 편의를 위해 pseudo instruction인 blt를 제공하기도 한다. 즉, blt $s3, $s4, Target으로 표현 가능.

Addressing Mode Summary


image

1. Immediate addressing

instruction의 operand가 instruction에 직접 적혀 있는 것을 의미합니다. 예를 들어 addi $t0, $t1, 1에서 1은 Immediate addressing을 사용하고 있습니다.

2. Register addressing

operand가 register에 적혀 있는 것을 의미합니다. 예를 들어 addi $t0, $t1, 1에서 $t0은 register addressing을 사용하고 있습니다.

3. Base addressing

Target address가 Memory에 적혀 있는 것을 의미합니다. 해당 Memory의 주소를 계산하기 위해 base register이 가리키는 주소와 offset을 더해 Memory address를 구합니다. 예를 들어 sw $t1, 0($t2)은 operand에 t1값을 저장하기 위해 주소를 구해야 하는데, base register와 offset을 통해 해당 주소에 접근을 합니다.

4. PC-relative addressing

Target address가 Memory에 적혀 있는 것을 의미합니다. Base register을 직접 지정해준 base addressing 와는 달리 PC값을 통해 Target address에 접근합니다. beq, bne instruction이 이에 해당합니다.

5. Pseudodirect addressing

Target address가 거의 instruction에 적혀 있는 것을 의미합니다. 32비트의 주소를 완성하기 위해 address에 x4를 한 후, 상위 4비트를 PC값의 상위 4비트로 초기화합니다. J-format instruction에서 주로 사용합니다.

Procedure and Stack


Procedure은 함수를 의미합니다. 함수의 호출은 다음 단계를 따릅니다.

1) Register에 Parameter을 세팅한다. 주로 $a0-$a3 사용 (부족하면 Stack 사용)
2) Procedure로 Branch한다
3) Procedure을 위한 저장공간을 확보합니다.
4) Procedure 수행
5) 결과를 Register에 저장합니다. 주로 $v0-$v1 사용
6) Caller로 Branch합니다

System Call

OS에 구현된 function을 호출하는 것을 의미합니다. 인자 전달을 위해 $a0-$a3을 사용하고 함수의 행동을 정의하기 위해 $v0 레지스터를 사용합니다. 아래는 $v0에 따른 Syscall의 행동들을 정의한 것입니다.

image

Memory Layout

image

1. Reserved

0~0x0040 0000에 해당하는 영역. 비어있는 채로 둔다.

2. Text

Text Segment에 해당하는 부분을 의미한다. 프로그램 수행 코드가 담겨 있다

3. Static data

Data Segment중 하나. global 변수들을 저장한다. 이를 위해 $gp를 사용

4. Dynamic data

Data Segment중 하나. Heap이라고 부르며 새로 할당한 변수들을 저장하는 공간이다.

5. Stack

Data Segment 중 하나. local variable을 저장한다. 이를 위해 $sp 사용.

❗️ recursive procedure은 PDF 참고

https://www.youtube.com/watch?v=OL3qD2c0Db4

Translation and Startup


image

프로그램이 메모리에 로드되기 위해서는 아래의 과정을 따른다.

1) compiler가 user code를 assembly로 바꾼다
2) assembler가 assembly를 object module로 바꾼다. machine language에 해당한다.
3) 여러 object module과 미리 컴파일된 library를 Linker을 통해 Executable로 바꾼다. 이때 Executable은 secondary storage에 저장된다.
4) secondary storage에 저장된 executable을 Loader을 통해 memory에 load하여 프로그램을 수행한다.

Object Module

Object Module이 제공하는 정보는 다음과 같다.

  • Object file header: Object file의 다른 부분에 대한 정보(size, position)을 저장
  • Text segment: user가 작성한 code에 대한 부분
  • Static data segment: 프로그램이 수행되면서 계속 access 할수 있는 global variable을 저장한다.
  • Relocation information: executable이 메모리에 로드되어 수행될 때, 실제로 어디에 로드 되는지 알 수 없으므로 해당 위치에 따라 달라지는 정보를 저장
  • Symbol table: label의 주소를 저장

Object file Example

image

  • 빨간색 네모는 object file header로 object file에 대한 정보들을 저장하고 있다.
  • Relocation information은 Text Segment중 Relocation이 필요한 주소를 저장하게 된다. lw0($gp)가 실제로 가리키는 주소를 Link 과정에는 알 수 없으므로 Relocation information에 저장을 하고, jal 또한 Text Segment의 B 레이블로 branch를 해야하지만 실제로 가리키는 주소를 Link 과정에는 알 수 없으므로 Relocation information에 저장하게 된다.

Executable file Example

image

Relocation information을 통해 주소들이 계산 되었음을 알 수 있습니다. (lw, jal)

Load Program

Executable file에는 memory address가 적혀있지만 실제 Loader가 메모리에 어느 부분에 로드할지는 알 수가 없다. 하지만 virtual memory를 사용하면 processor마다 각자의 address를 갖기 때문에 Executable에서 사용한 address를 그대로 사용할 수 있습니다. 즉 Relocation이 필요하지 않게 됩니다.

Static Link는 Executable에 Library Routine을 포함하는 것을 의미합니다. 이에 따라 단점이 존재하게 됩니다.

  • Executable의 size가 커질 수 있다.
  • Library가 업데이트 되면 다시 Link하는 과정이 필요하다.

Dynamic Link를 사용하면 위 문제점들을 해결할 수 있습니다.

image

Combinational Elements


현재의 입력만으로 출력을 만들어 낸다.

image

ALU는 다양한 연산을 사용할 수 있다. 연산의 종류를 결정하기 위해 control input을 사용한다.

이와 비슷하게 MUX 또한 출력을 결정하기 위해 control input을 사용한다.

State(Sequential) elements


현재의 입력과 이전의 입력으로 출력을 만들어 낸다

Register

clock signal에서 rising edge일때 input 데이터를 output에 저장한다. 걸리는 시간을 gate delay라고 한다. input이 변하더라도 clock signal이 rising edge가 아니라면 출력에 기록하지 않는다. write control이 표시되어 있지 않으면 항상 1이다.

Register with write control

clock signal이 rising edge일때 write control을 확인하여 input 데이터를 output에 저장한다. write control이 1일때 데이터를 저장한다.

image

이를 확장해 32bit register을 만들 수 있다.

image

Instruction memory

32비트의 주소를 읽어와 해당 주소에 적힌 instruction을 출력으로 보낸다. 매 cycle마다 출력으로 instruction을 보낸다. rising edge마다 값을 보내는 것이 아님에 유의하자. Control signal은 생략되어있다.

image

Data memory

Memwrite, Memread 에 따라 메모리에 데이터를 쓰거나 출력을 하게 된다. 둘 다 동시에 1이 될 수 는 없으나 0은 가능하다.

  • Memwrite가 1이라면 주소를 읽어와서 해당 주소에 Write data를 쓰게 된다.
  • Memread가 1이라면 읽어온 주소에 저장된 값을 출력으로 보낸다.

image

Register File

32비트 register가 32개 모여있는 것을 Register file이라고 한다.

  • Regwrite의 값이 1일 때만 레지스터에 값을 기록한다.
  • Regread는 항상 1이여서 clock cycle마다 값을 읽어 출력한다.

image

Control signal


Control signal은 조합회로로 만들 수 있다. instruction의 특정 필드를 input으로 하면 output을 얻을 수 있다. i-format, j-format은 opcode만 전달하고 r-format은 추가적으로 funct 값도 input으로 전달한다.

image

Example 1

image

1) instruction memory에서 instruction을 읽어온다.
2) $8, $9가 Read register에 쓰인다.
3) add 이므로 rd에 값이 쓰여야한다. RegDst가 1이 된다.
4) add이므로 두 개의 레지스터를 ALU에 전달해야한다. ALU의 두 번째 operand는 register의 두번째 read data이므로 ALUSrc는 0이 된다.
5) Register file의 Write data에 ALU result가 쓰여야 하므로 RegtoMem의 값이 0이된다.

Example 2

image

  1. Read register에 rs필드를 읽어온다.
  2. rt필드에 저장이 되어야하므로 RegDst 값은 0이 된다.
  3. 주소를 계산해야하므로 ALU의 두 번째 operand는 imm 필드가 되어야한다. ALUSrc는 1이 된다.
  4. Memory에서 읽어온 값을 Register file의 Write data에 기록해야하므로 MemtoReg는 1이 된다.
  5. 주소계산을 위해 add를 사용해야므로 ALU control는 add를 의미하는 0010을 출력해야한다.
  6. lw에서 ALUop값으로 00을 전달하고 이를 통해 0010을 만들어 낸다.

Example 3

image

  1. 두 개의 레지스터 값을 비교해야하므로 Read register 1,2 값을 읽는다.
  2. ALU의 두 번째 operand는 레지스터로부터 오기 때문에 ALUSrc의 값은 0이 된다.
  3. 출력되는 Zero control signal에 따라 PC값을 결정한다.
  4. branch instruction을 보고 적절한 ALUop값을 전달한다.

'학교' 카테고리의 다른 글

컴퓨터구조 ANSWER1  (0) 2021.10.30
컴퓨터구조 TEST1  (0) 2021.10.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함