위 그림은 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, ..
MIPS에서는 1워드 = 4바이트 = 32비트를 기반으로 한다. 32비트의 워드에서는 2^32개의 서로 다른 비트 패턴을 나타낼 수 있다. 첫 번째 비트가 0이라면 양수, 1이라면 음수인 2의 보수 방식을 사용할 수 있고, 이를 사용하면 음수와 양수 모두에서 산술연산을 간단하게 처리할 수 있다. 덧셈 연산과 같은 명령어도 1워드로 나타낸다. 위는 그 예제로, 첫 번째 필드와 마지막 필드는 이 명령어가 add임을 나타내고, 2,3,4번째 필드는 각각 s1 s2 t0를 나타낸다. add 명령어와 같은 구조를 R-Type이라 하며, 6가지의 필드로 나타난다. op: 명령어의 기본 연산 opcode rs : 첫 번째 소스 레지스터의 번호 rt : 두 번째 소스 레지스터의 번호 rd : 세 번째 소스 레지스터의 ..
컴퓨터 언어는 명령어(instructions)로 구성돼있으며 각 컴퓨터는 자신만의 명령어 목록(instruction set)으로 구성돼있다. 대표적인 instruction set으로는 arm, intel x86, MIPS 등이 있다. 하드웨어의 기술은 유사한 기본 원리에 기반하고, 모든 하드웨어 기술은 몇 가지 기본 작업을 수행해야하기 때문에 각각의 instructions set은 매우 유사하다. MIPS CPU에는 32개의 레지스터가 있고, 각 레지스터의 크기는 32bit이다. 레지스터는 0~31의 이름을 가지며 각 레지스터는 고유한 이름과 용도를 지닌다. 레지스터를 통해 데이터를 메모리에서 가지고 오는 비용을 줄일 수 있지만, 레지스터의 크기는 한정돼있기에 효율적으로 사용해야한다. g+h를 t0에 저..