이번엔 어셈블리 언어가 고급 언어와 어떤 근본적인 차이점을 가지는지 소개한다. 우선 데이터 전송 명령어들에 대해 알아보자. 피연산자 타입 이전에 기본적인 명령어 형식은 다음과 같이 소개했다 [label :] mnemonic [operands][ ; comment] 여기에 명령어의 개수에 따라 mnemonic [destination], [source-1], [source-2] 등으로 하나씩 추가했다. 이 상태에서 더 추가적인 유연성을 주기 위해 다음과 같은 피연산자들을 사용한다. (표 참고) 즉시값(immediate) - 숫자 수식을 사용한다. 값은 명령어로 인코딩된다. 레지스터 - CPU에 있는 명명된 레지스터를 사용한다. 레지스터 이름은 숫자로 변환되고 명령어로 인코딩된다. 메모리 - 메모리 위치를 참..
이번엔 어셈블리 언어를 기초부터 차근차근 알아가는 챕터이다. 진짜 완전 기초부터 시작하는 느낌이었다. 우선 정수 상수부터 알아보자. 정수 상수는 선택사항인 부호, 한 자리 이상의 숫자와 선택사항인 접미 문자로 구성된다. [ { + | - } ] digits [radix] 여기서 대괄호 안의 구성요소는 선택사항이며 중괄호 안의 구성요소는 포함된 요소 중 하나를 선택하는 것이다. 요소들은 |문자로 구분된다. 이탤릭체로 된 구성요소는 정의와 설명이 알려진 아이템이다. radix는 진수라고 부르며 16진수는 뒤에 h를, 8진수는 q/o, 10진수는 d, 2진수는 b를 붙인다. [부호화 실수에 r, 10진수에 t, 2진수에 y를 붙이기도 한다.] 이것은 어셈블리 언어의 산술 연산자 우선순위이다. 우리가 알고있던 ..
위 이미지는 가상 마이크로컴퓨터의 기본적인 설계도이다. 여기서 계산과 논리 연산이 이루어지는 중앙 처리 장치CPU는 레지스터라고 하는 몇몇 장치들을 포함하고 있다. 먼저 clock을 살펴보면 다른 시스템 구성요소를 cpu의 내부와 동기화시키는 기능을 한다. 제어장치 CU는(control unit) 기계 명령어를 실행하는 데 수반되는 단계들의 순서를 조정한다. 산술 논리 장치 ALU는(arithmetic logic unit) 덧셈, 뺄셈, AND, OR, NOT 과 같은 연산을 수행한다. 다음으로 메모리 저장 장치는 컴퓨터 프로그램이 실행되는 동안 명령어와 데이터를 저장하는 곳이다. 이곳은 CPU에서 데이터에 대한 요청을 받으면 RAM과 상호작용한다. 주로 메모리에 있는 프로그램이 CPU에 복사되어 실행된..
C++에는 int같은 data type 말고도 복잡한 계산과 코드를 우아하게 해결해주는 여러가지 복합 유형 compound type이 있다. 일단 그 중 하나인 l-value와 r-value에 대해 먼저 알아보자. lvalue는 식별 가능한 개체나 함수로 평가되는 표현식이다. (내 신원을 확인할 수 있는 Identify한 걸로 자신이 ID를 가졌다고 이해함) int main() { int x{}; const double d{}; int y { x }; // x is a modifiable lvalue expression const double e { d }; // d is a non-modifiable lvalue expression return 0; } lvalue는 수정가능한 lvalue, const..
함수 오버로드를 사용 하면 동일한 이름을 가진 함수를 여러개 만들 수 있다. 대신 동일한 이름의 함수가 서로 다른 매개변수 타입을 가져야 한다.(또는 함수를 다르게 구별할 수 있는 경우. 그냥 컴파일러가 구별만 할 수 있으면 됨) 동일한 범위 내에서 이름을 공유하는 각 함수를 오버로드된 함수 라고 한다. (그냥 오버로드라 부르기도 함) 우리는 이러한 오버로드를 사용으로 기억해야 하는 함수 이름의 수를 줄임으로서 프로그램의 복잡함을 줄일 수 있다. int add(int x, int y) // integer version { return x + y; } double add(double x, double y) // floating point version { return x + y; } int main() {..
C++는 광범위한 아키텍처에서 이식 가능하고 성능이 뛰어나도록 설계되었기 때문에언어 설계자는 특정 CPU가 우리가 사용하는 CPU의 자연 데이터 크기보다 좁은(작은 크기. 앞으로는 비트의 수, 너비로 표현) 값을 효율적으로 조작할 수 있다고 생각하지 않았다. 그래서 C++은 numeric promotion (숫자 승격)을 지원한다. 이것은 특정 좁은 숫자 타입을 효율적으로 처리할 수 있고, 오버플로 가능성이 적은 더 넓은 숫자 타입으로 변환하는 것이다. 승격이 된다고 해서 값이 변하는 것은 아니다. 변환된 값은 항상 source값과 동일하여 보존된다. 그냥 타입만 달라질 뿐이다. 이러한 숫자 승격 규칙은 integral promotions및 floating point promotions 의 두 가지 하위..