반응형
Addressing Modes
Operand(피연산자)의 주소를 나타내는 방법에는 총 아래의 5가지가 있습니다.
- Register only
- Immediate
- Base Addressing
- PC-Relative
- Oseudo Direct
1. Register Only
- Operands found in register
- ex) add $s0, $t2, #t3
- ex) sub $t8, $s1, $0
2. Immediate
- 16-bit immediate used as an operand
- ex) addi $s4, $t5, -73
- ex) ori $t3, $t7, 0xFF
3. Base Addressing
- base address + sign-extended immediate
- ex) lw $s4, 72($0) ⇒ address : $0 + 72
- ex) sw $t2, -25($t1) ⇒ address : $t1 - 25
4. PC-Relative Addressing
- jump시 상대적 거리를 통해 target address를 계산하는 방법이다.
- beq → 여기서 branch가 taken되면 이동하는 주소는 어떻게 계산?
- PC가 다음 instruction 주소 값(0x14)을 갖고 있음, 만약 branch가 taken된다면 jump하고 주소를 계산한다.
- 계산 방식은 아래와 같다.
taget address = 다음 주소 + instruction 개수 * 4
MIPS Assembly Code
0xA4 beq $t0, $0, else
0xA8 addi $v0, $0, 1
0xAC addi $sp, $sp, 8
0xBO jr $ra
0xB4 else: addi $a0, $a0, −1
0xB8 jal factorial
5. Pseudo-direct Addressing
- target address를 직접 명시하는 방법이다.
- 주소값은 항상 4의 배수이므로, 이를 4로 나누어(끝 2자리 자름) 26-bit address로 바꿔 넣는다.
How to Compile & Run a Program
source code에서 complie하면 assembley code가 만들어지고, 이것을 assembler을 통해 Object file을 생성한 후, Linker를 통해 executable binary file을 만듭니다. 마지막으로 loader을 통해 memory에 올려서 실행하면 Program이 마침내 실행하여 Process가 됩니다.
Memory에 저장되는 것
- Instructions (also called text)
- Data - Global/Static : program 시작 전 할당 // Dynamic : program과 함께 할당(stack,heap)
stack가 heap은 서로 반대 방향으로 grow하면서 동적으로 할당됩니다.
Example - Assembly
1. C 언어
int f, g, y; // global variables
int main(void)
{
f = 2;
g = 3;
y = sum(f, g);
return y;
}
int sum(int a, int b) {
return (a + b);
}
2. MIPS Assembly Code
.data
f:
g:
y:
.text
main:
addi $sp, $sp, −4 # make stack frame
sw $ra, 0($sp) # store $ra on stack
addi $a0, $0, 2 # $a0 = 2
sw $a0, f # f = 2
addi $a1, $0, 3 # $a1 = 3
sw $a1, g # g = 3
jal sum # call sum function
sw $v0, y # y = sum(f, g)
Iw $ra, 0($sp) # restore $ra from stack
addi $sp, $sp, 4 # restore stack pointer
jr $ra # return to operating system
sum:
add $v0, $a0, $a1 # $v0 = a+b
jr $ra # return to caller
Example - Executable file
실행 정보에는 text와 data과 함께 meta 정보를 담은 header가 들어있습니다.
Example - In memory
실행 파일을 loader가 메모리에 올리면 위와 같습니다.
5. Odds & Ends
해당 section에서는 다음 주제를 다룹니다.
- Pseudoinstructions
- Exceptions
- Sigend and unsigned instructions
- Floating-point instructions
Pseudoinstructions
편의를 위해 만든 것으로 자동으로 assembler가 assembly code로 변환시켜 준다.
Exceptions
- hardware에 의한 interrupt나 software에 의한 trap에 의해서 발생한다.
- Unscheduled function은 exception handler를 호출한다.
Exception Registers
- Cause : exception의 원인을 기록
- EPC : exception이 발생한 PC를 기록
- Cause와 EPC는 special register라서 번호가 없다.
- mfc0 사용 ⇒ copy후 사용해야 한다. // mfc0 $t0, EPC
Exception Flow
- Processor가 Cause와 EPC를 저장한다.
- Process가 exception handler로 jump한다.
- exception handler 내부
- stack에 register 저장
- Cause register를 read : mfc- $t0, Cause
- exception을 handling
- Restore register
- Return to program : mfc0 $k0, EPC → jr $k0
Signed $ Unsigned Instructions
덧셈, 뺄셈
- Signed : add, addi, sub ⇒ overflow 발생 가능
- Unsigned : addu, addiu, subu ⇒ overflow 발생 x
addiu는 sign-extend이다.
곱셈, 나눗셈
- Signed : mult, div
- Unsigned : multu, divu
Set Less Than
- Signed : slt, slti
- Unsigned : sltu, sltiu
sltiu는 sign-extend이다.
Loads
- Signed : register load시 Sign-extends to create 32-bit value
- Load halfword : lh
- Load byte : lb
- Unsigned : Zero-extends to create 32-bit value
- Load halfword unsigned : lhu
- Load byte : lbu
Floating-Point Instructions
- 32개의 32-bit floating-point registers : $f0 ~ $f31
- Double-precisiong value→ 2개의 floating point register를 묶어서 표현
F-Type Instruction Format
- OP code = 17 (010001)
- cop = 16 (single-precision), 17(double-precision)
- fs, ft : source operand
- fd : destination operand
Floating-Point Branches
- Set/Clear condition flag : fpcond
- Equality : c.seq.s, c.seq.d
- Less than : c.lt.s, c.lt.d
- less than or equal : c.le.s, c.le.d
- Conditional brancj
- bclf : fpcond == false일 때 branch
- bclt : fpcond == true일 때 brabch
- Loads and stores
- lwcl : lwcl $ft1, 42($s1)
- swcl : swcl $fs2, 17($sp)
반응형
'Computer Science > Computer Architecture' 카테고리의 다른 글
[컴퓨터 구조] Ch8. Memory and I/O Systems(1) - Cache (0) | 2022.12.07 |
---|---|
[컴퓨터 구조] Ch7. Microarchitecture (0) | 2022.11.19 |
[컴퓨터 구조] Ch6. Architecture (2) - Programming (0) | 2022.10.09 |
[컴퓨터 구조] Ch6. Architecture (1) - Assembly Language, Machine Language (1) | 2022.10.08 |
[컴퓨터 구조] Ch5. Digital Building Blocks (3) - Memory Arrays, Logic Arrays - ROM, DRAM, SRAM 중점으로 (0) | 2022.09.25 |