본문 바로가기

시스템SW8

[2.6] MIPS Instruction Set Architecture VI - 언어와 MIPS 어셈블리언어 C언어가 MIPS 어셈블리언어로 어떻게 변환되는지 알아본다. 컴파일러에 의해 고급 언어로 작성된 C코드가 MIPS의 어셈블리언어로 바뀐다. 예전에는 어셈블리언어로 프로그램을 작성하는 경우도 있었다. 운영체제와 관련된 작업 중 속도가 중요한 경우는 그렇게 했다. 하지만 어셈블리의 비효율성 등을 극복하기 위해 고급언어인 C언어를 만들어낸 것이다. 이제 C언어를 어셈블리언어로 바꾸는 몇 가지 예시에 대해 알아보자. 배열의 경우 시작 위치만을 저장하고, 이후 원하는 배열의 원소에 접근하기 위해 인덱스 값만큼 떨어진 주소를 찾아간다. 정수의 크기는 4byte이므로 어셈블리어의 첫 두 줄에서 i*4를 진행한다. 이때, 곱셈보다 덧셈의 처리 속도가 훨씬 빠르므로 덧셈 두 번을 한다. 2022. 10. 13.
[2.5] MIPS Instruction Set Architecture V - 연산별 비트 구조 MIPS의 각 연산 과정에서 나타나는 비트 구조를 복습한다. (Recap) MIPS의 기계어는 32bit를 가진다. 기계어의 field는 opcode 영역(6bits)과 피연산자 영역(5bits+5bits+5bits+5bits+6bits)으로 나눌 수 있다. 레지스터 3개를 사용하는 instruction의 경우, 11bit가 남아돈다. 반면, memory addressing을 해야 하는 연산의 경우, 메모리의 주소를 표현하는 데만 32bit가 필요하기 때문에 opcode를 제외한 MIPS instruction field 영역으로는 표현하기에 부족하다. 따라서 레지스터와 메모리 주소를 혼합해서 사용한다든지의 방법으로 한정적으로 메모리를 표현해야 한다. 피연산자의 조합에 따라 instruction field.. 2022. 10. 13.
[2.4] MIPS Instruction Set Architecture IV - branch & jump 연산 MIPS의 Branch & Jump 연산과 비트 구조가 각 연산에서 어떻게 나타나는지 알아본다. Conditional branch instructions branch on equal: register 2개 + 16bit immediate 두 레지스터 값이 같으면 branch immediate값은 다음 수행해야 할 위치로부터 얼만큼 떨어진 instruction인지를 나타낸다. 이를 주소 값으로 따지면 기계어 하나의 크기가 4byte이므로 다음에 실행했어야 한 명령어의 주소로부터 {4*(immediate)}byte만큼 떨어진 주소를 가리키라는 것이다. 왜 굳이 이렇게 하는가? -> 32bit로 크기가 한정된 기계어 내에서 정보를 최대한 효과적으로 표현하기 위함이다. branch on not equal: re.. 2022. 10. 12.
[2.3] MIPS Instruction Set Architecture III - 논리연산 & Data Transfer 연산 MIPS의 논리 연산과 메모리에 접근하는 Data Transfer 연산에 대해 알아본다. 논리 연산 C언어에서 3 & 1 연산을 하면 결과는 1이 나온다. 이유는 C와 같은 고급 언어에서는 0이 아닌 모든 수를 참으로 가정하기 때문에 참 & 참 = 참이므로 결과가 1(참)이 나오는 것이다. 하지만 기계어에서 진행되는 bit 단위 연산에서 3 & 1 을 수행하면 0011 & 0001 = 0001 이다. 예시가 좀 별론데...어쨌든 무슨 의미인지 알겠죠? ㅎ 논리 연산에서도 산술 연산과 마찬가지로 immediate 값(16bit)을 사용할 수 있다. 레지스터에는 32bit 값을 저장할 수 있는데, immediate에는 16bit 값을 저장한다. and immediate에서는 32bit의 레지스터 값과 16b.. 2022. 10. 12.
[2.2] MIPS Instruction Set Architecture II - 비트 포맷 및 산술 연산 MIPS의 비트 포맷과 네 가지의 연산 종류 중 산술 연산에 대해 알아본다. (Recap)MIPS에서는 모든 instruction이 32bit로 구성된다. 그런데 메모리 주소 공간도 32bit이니까, 메모리를 instruction에 사용하기엔 공간이 부족한 것 아닌가? -> 맞다. Instruction을 나타내는 32bit 중 처음 6bit(opcode: 연산의 종류를 나타냄)를 제외한 모든 공간을 다 쓴다고 해도 26bit밖에 사용할 수 없으므로, 전체 메모리 주소를 나타내기에 부족하다. 따라서 메모리 주소를 직접 나타내야 하는 연산의 경우 26bit만을 사용하는 방법이 있다. 이 경우 전체 메모리 위치를 다 나타내진 못한다. 메모리 주소를 직접 적는 대신 레지스터에 넣어두고 그 레지스터를 기계어의 피.. 2022. 10. 12.
[2.1] MIPS Instruction Set Architecture - 레지스터 및 메모리 모델 ISA의 대표적인 기계어 집합인 MIPS의 원리와 연산 수행에 대해 알아본다. (Recap)컴퓨터마다 CPU에서 사용되는 기계어 집합이 다르다. (Instruction Set Architecture의 종류는 여러가지다.) ISA의 종류: IBM System/360, IA-32(x86), IA-64, MIPS, SPARC, Alpha, PA-RISC MIPS Register & Memory Model MIPS 레지스터 모델 피연산자 값을 저장할 범용 레지스터의 개수: 32개($0-$31) 레지스터 하나의 크기는 4 byte이다. 따라서 범용 레지스터는 (4 byte)*32(개) 만큼의 공간이 필요하다. 32개의 레지스터를 구분하기 위해서는 5bit가 필요하다(2^5 =32이므로) 범용 레지스터 외에도 몇 .. 2022. 10. 12.
[3.2] Procedure Call in MIPS II 이전 글에서도 쓴 사진이지만 추가적인 설명을 위해 다시 살펴보자. 지역변수의 경우 함수가 호출될 때 메모리의 Stack에 변수 공간이 생기며, 함수가 리턴되면 지역변수에 해당하는 공간이 사라진다. 또 하나의 함수에서 다른 함수를 호출할 때 전달하는 argument나 호출한 함수가 끝났을 때 되돌아와야하는 위치 등도 Stack에 저장된다. 이제 어떤 함수 C가 다음과 같이 정의되었다고 가정해보자. int procedure_B(int x) { static int c=0; c++; return(x+c); } void C(int z) { int *p = malloc(sizeof(int)); *p = procedure_B(3); printf("%d", *p); } 함수 C에서 만든 포인터의 *p의 공간은 함수 C.. 2022. 10. 2.
[3.1] Procedure Call in MIPS I (프로그램의 메모리 주소 공간 구조) 오른쪽(고급 언어로 작성된 프로그램)을 컴파일하면 실행 파일이 만들어지고 고급 언어가 기계어로 바뀐다. 실행 파일은 메모리에 올라가서 실행된다. (알다시피 메모리에는 주소가 byte단위로 매겨진다.) 위 사진 왼쪽에 쓰여있는 논리 주소란, 실제 하드웨어 상에서의 물리적 주소가 아닌, 각 프로그램이 실행될 때마다 생기는 상대적인 주소를 말한다. 논리 주소의 크기는 ISA에 따라 결정된다. MIPS에서는 32bit 주소 체계를 가지기 때문에 0~(2^32)-1, 총 4GB의 메모리 주소가 매겨진다. 정리하자면 MIPS 아키텍쳐에서는 어떤 프로그램을 쓰든 컴파일이 되었을 때 메모리 상에 0번지부터 (2^32)-1번지까지의 논리 주소가 생성된다. 논리 주소 내의 공간은 Code, Data, Stack으로 나뉜다.. 2022. 10. 2.