기계어와 어셈블리

기계어와 어셈블리

Terms

기계어(Machine Language) : 프로세서와 레지스터들을 이용해서 메모리를 조작할 수 있도록 미리 정의된 규칙

어셈블리(Assembly) : 기계어와 일대일 대응이 되는 저급 프로그래밍 언어. 2진 코드는 사람이 읽기 어려워서 연상 기호(mnemonic symbol)를 정해 사람이 좀 더 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것.

메모리 : 메모리는 컴퓨터에서 데이터와 명령어를 저장하는 하드웨어 장치들을 대략적으로 통칭하는 용어. 프로그래머 관점에서는 word라 불리는 정해진 폭의 셀들이 연속적으로 배열되어 있고, 각각에 유일한 주소(Address)가 있는 구조다.

프로세서 : 보통 중앙 처리 장치(Central Processing Unit, CPU)라고 불리는 프로세서는 특정한 기초 연산들을 수행하는 장치다. 이 연산에는 산술 및 논리 연산, 메모리 접근 연산, 그리고 제어(또는 분기) 연산이 포함된다. 이 연산의 피연산자들은 선택된 메모리 위치와 레지스터에 있는 2진 값이다. 마찬가지로 연산의 결괏값은 선택된 메모리 주소나 레지스터에 저장된다.

레지스터 : 메모리 접근 연산은 상대적으로 느리며, 긴 명령어가 필요하다. 이런 이유로, 대부분의 프로세서는 값을 하나 저장할 수 있는 레지스터를 여러 개 두고 있다. 레지스터는 프로세서의 바로 옆에 위치해서, 프로세서가 명령어와 데이터를 빠르게 조작할 수 있도록 로컬 고속 메모리 역할을 한다.

명령

메모리 접근

메모리 접근 명령은 두 부류로 나뉜다. 먼저 앞에서 봤듯이 산술 및 논리 명령은 레지스터 외에도 특정 메모리 주소에 접근할 수 있다. 두 번째로 어느 컴퓨터에나 있는 load와 store 명령으로, 레지스터와 메모리 사이에 데이터를 이동시키는 명령이 있다. 이 메모리 접근 명령은 몇 가지 종류의 주소 지정 모드(Addressing Mode)를 사용한다.

직접 주소 지정 방식(Direct Addressing) : 메모리에 접근하는 가장 일반적인 방법은 다음 예처럼 특정 주소를 직접 쓰거나, 그 주소를 나타내는 기호를 활용하는 것이다.

LOAD R1, 67   // R1 <- Memory[67]

// if bar = 67
LOAD R1, bar  // R1 <- Memory[67]

즉시 주소 지정 방식(Immediate Addressing) : 이 주소 지정 방식은 명령어 코드에 있는 상수를 불러오는데 쓰인다. 즉, 명령어에 있는 숫자 필드를 주소로 취급하지 않고, 그 값 자체를 다음과 같이 레지스터로 로드한다.

LOAD R1, 67     // R1 <- 67

간접 주소 지정 방식(Indirect Addressing) : 이 주소 지정 방식에서는 명령어에 메모리 주소가 하드코딩 되지 않는다. 그 대신 필요한 주소 값을 저장하고 있는 메모리 위치를 참조하는 명령어를 사용한다. 이 주소 지정 방식은 포인터(Pointer)를 다루는 데 쓰인다.

// x=foo[j]의 번역
ADD R1, foo, j  // R1 <- foo + j
LOAD* R2, R1    // R2 <- Memory[R1]
STR R2, x       // x <- R2
제어 흐름 (Flow of Control)

프로그램에서는 보통 명령 하나씩 순서대로 실행되지만, 다음번 명령 말고 갑자기 다른 위치로 분기해서 실행되기도 한다. 분기(Branching)에는 반복(Repetition), 조건 실행(Conditional Execution), 서브투린 호출(Subroutine Calling, 다른 코드 세그먼트의 첫 번째 명령으로 점프) 등의 몇 가지 종류가 있다. 모든 기계어들은 이런 프로그래밍 구조를 지원하기 위해 프로그램 내에 선택된 주소로 조건별 또는 무조건별로 점프하는 기능을 두고 있다. 어셈블리 언어는 레이블 문법을 통해 프로그램 내에 특정 위치에 기호를 지정해 줄 수 있다.