위 회로는 브랜치 분기 명령어에서 사용되는 회로다. 이는 두 가지 출력으로 나뉘는데, 예를 들어 beq $t1 8($t2)가 입력됐다고 가정하자. 첫번째 출력은 대상 주소 출력이다. 상대 주소인 8은 Sign-extend 회로로 16bit에서 32bit로 변환된다. 그 후 Shift left 2 회로로 4가 곱해져 워드 단위의 상대 주소가 된다. Adder(가산기)로써 PC+4와 합쳐져 대상 주소가 출력된다. 두번째 출력은 조건문에 따른 출력이다. Read register에 $t1과 $t2가 입력되고, Read data로 출력된다. 출력된 값은 ALU에 입력되어 subtract 연산을 수행한다. 만약 zero flag가 활성화된다면 둘은 같은 것이므로 대상 주소에 위치한 명령어가 수행된다. 1) inst..
컴퓨터사이언스
Datapath Elements(데이터 경로 요소)에는 Instruction memory, Program counter, Adder가 있다. Instruction memory(명령어 메모리): 프로그램의 명령어를 저장하는 메모리로, 주소(입력)이 주어지면, 해당하는 명령어(출력)을 공급 Program counter: 현재 명령어의 주소를 보유하는 레지스터 Adder(덧셈기): 다음 명령어의 주소를 위해 PC를 증가시키는 논리 회로로, 산술 논리 장치(ALU)에서 수행되는 산술/비트 연산에서 구성됨 프로세서는 PC의 주소를 명령어 메모리(Instruction memory)에 입력함으로 해당 명령어(Instruction)를 가져온다. 다음 명령어를 실행하기 위해서는 PC를 증가시켜야하는데, 명령어 하나의 크..
위 그림은 MIPS의 구조를 요약한 것이다. Processor에서부터 하나씩 뜯어보자. 이 부분은 Registers가 입력을 받고, 출력을 하며, 결과값을 입력받기까지 하는 부분이다. R-type의 경우 필드가 3개기에 입력 addr이 3개이다. 예를 들어, add dst src1 src2 라고 하면 각각 dst addr, src1 addr, src2 addr로 들어간다. 각각 5bit의 wide를 차지한다. src1 data와 src2 data는 src1 addr와 src2 addr의 데이터를 출력해준다. write data로 들어온 입력은 dst addr의 데이터에 입력된다. Program Counter의 출력은 현재 명령어의 위치이다. 위 그림에서는 PC의 출력값을 Adder의 첫 번째 입력으로 주..
$t0에 4000000을 넣을 때 어떻게 넣으면 될까? addi를 사용하기엔 넣을 수 있는 값이 16bit이므로 400만을 나타낼 수 없다. 이 때, lui와 ori를 사용할 수 있다. Load Upper Immediate $t0 = 255
함수 안에서 변수를 선언하면 해당 변수는 레지스터에 저장하기에 용량이 크면 스택에 저장된다. 이때 스택에 저장된 변수는 프로시저 프레임으로 세분화된다. 프로시저 프레임은 프로시저가 호출될 때 생성되고 프로시저가 종료될 때 삭제된다. 프로시저 프레임에는 프로시저가 호출될 때 저장해야하는 값들을 포함한다. 인자 레지스터 $a, 반환주소레지스터 $ra, 저장된 레지스터 $s, 지역변수가 이에 포함된다. 따라서 프로시저 내부에서 변수를 사용하면 해당 변수는 프로시저 프레임 내에 저장된다. 프로시저가 종료될 때 그 프레임이 삭제되고 해당 변수도 함께 삭제된다. 프로시저 프레임을 사용해서 프로시저에서 지역 변수와 레지스터를 관리할 수 있다. 이는 메모리 공간을 효율적으로 활용할 수 있게 해주고 스택을 사용해서 함수..
모든 프로시저가 다른 프로시저를 호출하지 않는 리프 프로시저는 아니다. main()이 func_A()를 호출하고, func_A()가 func_B()를 호출한다고 가정하자. 그러면 func_A()가 호출될 때 $ra에는 main()으로 돌아갈 때 필요한 주소가 들어가 있을 것이다. 그러나 func_B()가 호출될 때 main()으로 돌아갈 때 필요한 주소를 잃게 된다. 따라서 $ra 또한 스택에 push 해서 저장해두어야 한다. 위와 같은 코드를 어셈블리로 변환한다고 가정하자. 위와 같은 코드가 된다. main함수에서는 n($a0)을 사용하고 있었고, fact(3)을 호출했다 가정하자. 우선 스택에는 main함수를 가리키는 $ra와 3을 갖고 있는 n($a0)를 저장하게 된다. 다음 slti 명령어와 be..
함수(프로시저)는 프로그램을 이해하기 쉽고 코드를 재사용할 수 있도록 만들어준다. 함수 호출 과정에서는 호출자와 호출 대상간의 관계가 형성된다. 호출자는 함수를 호출하는 프로그램, 호출 대상은 함수를 실행하는 프로시저이다. 호출 대상이 다른 함수를 호출하면 호출 대상은 호출자가 된다. 1) 호출자는 매개변수를 호출 대상이 접근할 수 있는 장소에 둔다. 2) 제어가 호출 대상으로 전달된다. 3) 호출 대상은 프로시저에게 필요한 저장 공간 자원을 할당한다. 4) 호출 대상은 필요한 작업을 수행한다. 5) 호출 대상은 결과 값을 호출자가 접근할 수 있는 장소에 놓는다. 6) 제어가 호출자로 반환된다. 1~3번은 함수 호출, 4번은 함수 실행, 5~6번은 함수 반환을 뜻한다. 함수 관련 레지스터는 다음과 같다...
MIPS에서 shift 연산은 sll, srl 연산으로 할 수 있다. sll(shift left logical)은 왼쪽 쉬프트 연산, srl(shift right logical)은 오른쪽 쉬프트 연산을 수행한다. rs에 0이 들어가고 첫 번째 인자는 rt, 두 번째 인자는 rd에 들어간다. LEFT SHIFT $t0 = $s0 > 1 srl $t0, $s0, 1 AND $t0 = $t1 & $t2 and $t0, $t1, $t2 AND immediate $t0 = $t1 & 8 andi $t0, $t1, 8 OR $t0 = $t1 | $t2 or $t0, $t1, $t2 OR immediate $t0 = $t1 | 8 ori $t0, $t1, 8 NOR $t0 = ~($t1 | $t2) nor $t0, ..