Integer 덧셈 오버 플로우가 발생하는 경우 두 개의 양수를 덧셈하는 경우 (sign비트 값이 1이 되어서 음수가 되어버림) 두새의 음수를 덧셈하는 경우 (sign비트 값이 0이 되어서 양수가 되어버림) Integer 뺄셈 오버 플로우가 발생하는 경우 양수와 음수를 뺄셈 하는 경우 음수와 양수를 뺄셈하는 경우 오버플로우를 처리하는 방식은 언어마다 다 다름 C언어에서는 오버플로우를 무시. 프로그래머가 이를 책임져야 함 하지만 다른 언어에서는 오버플로우가 발생하면 exception을 발생시킴 Arithmetic for Multimedia SIMD (Single-instruction, multiple-data) 그래픽이나 media processing 연산은 주로 8비트나 16비트 연산을 사용 만약 64비..
내가 듣는 강의에서는 Linking부터 로드까지 간단하게 설명했지만... 자세하게 들여다 보면 정말정말 복잡한 과정이다. 과정을 자세히 알고 싶다면 이 링크를 타고 보면 된다. 정말 상세하게 정리해두셨다. https://it-eldorado.tistory.com/49#comment9843287 [CSAPP] Linking ※ 링킹은 워낙 복잡한 과정이어서 CSAPP 서적에서도 아주 세부적인 내용까지는 설명하지 않고 있다. 그래서 분명 필자처럼 책을 다 읽고도 찝찝한 감정이 사라지지 않는 사람들이 있을 것이다. it-eldorado.tistory.com Object Module 생성 어셈블러는 프로그램을 기계 명령어로 변환. 코드를 가지고 프로그램을 만들기 위해 Object Module을 생성한다. Obj..
32비트 상수 대부분의 상수는 16비트 정도면 충분하지만, 32비트가 필요한 상수가 필요할 때가 있음. 따라서 32비트 상수를 만들때는 아래의 명령어를 사용하여 만듬. lui rt, constant 32비트가 있을때 상위 16비트에 상수를 집어 넣는 명령어 하지만 기존 상수 연산은 최대 16비트의 상수만 연산이 가능하다. 상수 연산 명령어 구조 따라서 32비트 상수를 계산하기 위해서는 다른 방식으로 계산해야 된다. Branch Addressing 대표적인 브랜치 명령어 beq $t0, $zero, L1 # t0이 $zero와 같다면 L1으로 이동 명령어의 구조는 상수연산 명령어 구조를 공유 (위 사진과 동일) 대부분의 브랜치 타겟 (위 코드로 예시를 들명 L1에 해당)은 해당 브랜치 근처에 있음. PC ..
Program counter (명령어 포인터): 다음에 실행될 명령어의 주소를 가진 레지스터 프로시저(함수)를 실행하는 6단계 (중요) caller: 함수를 부르는 함수 callee: 불려지는 함수 Caller가 Callee가 접근 할 수 있는 곳에 파라미터를 배치. MIPS에서는 $a0 ~ $a3(32bit)까지가 파라미터(arguments) 레지스터 Caller가 Callee에게 컨트롤을 넘김 (Callee가 실행 됨) Callee가 실행되기 위해 필요한 스토리지 공간(메모리)을 할당 받음. 보통은 스택 공간에 할당 Callee가 작업을 수행 Callee가 Caller가 접근 할 수 있는 곳에 result를 배치. MIPS에서는 $v0 ~ $v1까지가 value 레지스터 Caller가 Callee에게..
Instruction Set 컴퓨터의 명령어 집합 (The repaertoire of instructions of a computer) ISA : Instruction Set Architecture 하드웨어와 로우레벨 소프트웨어(OS) 사이의 추상화 인터페이스. 모든 정보들은 명령어들을 명령어들을 통해 프로세스에게로 전달 됨. 어떤 레지스터를 사용할지, 어떤 명령어를 사용할지, 어떤 메모리를 사용할지, I/O등등이 모두 명령어를 통해 전달이 됨. ABI: Application Binary Interface 프로그래머가 사용하는 사용자 영역의 명령어 집합 (The user portion of the instruction set)과 OS 인터페이스를 합친 것. 다시말하면 어떤 프로그램이 어떤 컴퓨터에서 실행..
스택: FILO 형태로 데이터를 액세스 하는 데이터 구조. 프로세서의 word 단위로 액세스 된다. 스택포인터 스택포인터는 메모리 영역중 스택의 마지막 값의 위치를 가리키는 레지스터다. 인터럽트나 서브루틴, 함수가 호출될때 - 임시적으로 값을 저장할 필요가 있을때 주로 사용된다. 함수가 호출되어 스택 영역에 해당 함수를 실행하기 위한 영역을 할당 할 때, 스택 포인터를 할당할 크기만큼 빼서 스택 영역을 할당한다. 이때 스택 포인터의 값을 빼는 이유는 스택의 첫 주소는 메모리의 높은 주소에 위치 하고 있으며, push할때마다 데이터를 낮은 주소쪽으로 적재 해야 하기에 스택 포인트를 빼는(할당 하는) 것.