기본 개념

개요

1장 : 어셈블리 언어에 대한 간단한 소개와 데이터 표현 방식에 대해 알아보겠다.




어셈블리 언어의 소개


어셈블리 언어는 가장 오래된 프로래밍 언어이고 모든 언어 중에서 고유의 기계어에 가장 가깝게 닮은 언어이며 하드웨어에 직접 접근이 가능하다.

Assembly language is the oldest programming language, and of all languages, bears the closest resemblance to native machine language.

어셈블리 언어가 무엇이냐, 왜 배워야하냐 라고 묻는다면 위의 문장이 답이 될 것이다.

컴퓨터가 처리하는 방식은 0과 1로만 이루어져있다는 것은 불변의 법칙이다.

흔히 얘기하는 코드의 정확한 정의는 의미있는 0과 1의 나열이라고 할 수 있다.

그러한 코드를 작성하는 것을 코딩이라고 칭한다.

어셈블리 언어는 기계어와 일대일 대응관계를 갖는다. 그러나 C++ 또는 JAVA와 같은 고수준의 언어는 어셈블리/기계어와 일대다 대응관계를 갖는다.

아래의 예시를 통해 이해를 쉽게 할 수 있다.

1
2
int y;
int x = (y + 4) * 3;
1
2
3
4
5
mov   eax, y       ;01~~~  / int y
add   eax, 4       ;10~~~  / y + 4
mov   ebx, 3       ;00~~~  / tmp = 3
imul  ebx          ;10~~~  / (y + 4) * tmp
mov   x, eax       ;11~~~  / x = (y + 4) * 3

0과 1로 이루어진 기계어에 가장 가깝게 닮은 언어인 어셈블리 언어는 모든 컴퓨터 사이언스 지식의 기초라고 해도 과언이 아닐 것이라 생각된다.

어셈블리를 공부하기 위해 알고 있으면 좋은 지식

  • 어셈블러 : 어셈블리언어 -> 기계어
  • 링커 : 어셈블러가 생성한 파일 -> 실행 파일
  • 디버거 : 프로그램 실행//레지스터와 메모리 체크
  • 16비트 실제 주소 모드 : MS-DOS와 MS-Windows Console Window에서 실행되는 모드
  • 32비트 보호 모드 : 32비트 버전의 MS-Windows에서 실행되는 모드
  • 레지스터: 연산의 중간 결과를 저장하는 저장공간, cpu에 있다.




가상기계


가상기계는 컴퓨터의 하드웨어를 소프트웨어적으로 만든 가상의 컴퓨터라고 말할 수 있다.

위의 말 때문에 가상 기계는 컴퓨터 하드웨어와 소프트웨어가 어떻게 관련이 되어있는지 알아볼 때 효과적일 수 있다.

가상기계는 여러개의 계층을 만드는데 사용자가 명령을 내리면 계층들 간의 해독(decode)변환(translation)이 일어나면서 가장 로우 레벨인 하드웨어에서 실행이 되도록 한다.




데이터 표현


컴퓨터는 0과 1로 표현을 한다고 하였다.

정확히 말하면 이 0과 1자체는 데이터라고 볼 수 없다. 0과 1은 전하 충전 상태를 의미하는데 전기가 들어온다면 1 없다면 0이다.

이러한 전하 충전 상태가 계속 되어 의미있는 0과 1의 집합 형태가 메모리에 저장이 되었을 때 데이터라고 말할 수 있다.

0과 1은 흔히들 말하는 2진수이다. 컴퓨터에서는 2진수 한자리를 비트라고 부른다.



2진수의 값이 많이 커질 경우 사람이 읽기에 굉장히 불편해진다. 이를 해결하기 위해 16진수를 사용한다.

16진수 한자리는 2진수 4자리가 매핑된다고 생각하면된다.

x86 컴퓨터에서 모든 데이터에 대한 기본 저장공간 단위는 바이트(byte)이다. 다른 저장공간 크기로 워드 , 더블워드, 쿼드워드가 있다.



우리가 사용하는 일반적인 정수를 컴퓨터는 어떻게 처리하는지에 대해 알아보았다.

정수는 음수도 포함한다. 컴퓨터가 음수를 표현하는 방법은 양수와는 다르다.

2의 보수 표현법을 사용하는데 2의 보수를 만드는 방법은 모든 비트들을 반전시키고 1을 더하면 된다.

여담으로 16진수를 쉽게 반전시키는 방법은 각 자리 숫자를 15에서 빼면 된다.

이쯤되면 의문 하나가 들 수도 있다. 컴퓨터는 2진 데이터만 처리한다고 하였는데 우리가 입력하는 것이 숫자만 있지는 않다.

당장 이 글도 문자로 이루어져있는데 문자는 어떻게 처리할까?

바로 아스키(ASCII)코드를 이용하여 표현한다. 아스키 코드는 바이트의 하위 7비트만을 사용하며 아스키 문자를 입력하면 해당하는 정수로 매핑시켜서 처리한다.

C언어에서 char형으로 입력을 해도 컴퓨터가 처리하는 것은 문자에 해당하는 정수로 바꾸어서 처리를 한 후 돌려주기 전에 해당하는 문자로 다시 변환하여 돌려준다.




부울 연산


부울 대수는 참과 거짓값에 대한 연산의 집합을 정의한다.

부울 수식

  • NOT : ㄱ 또는 ~ 또는 ‘로 표기한다.
  • AND : ^ 또는 •로 표기한다.
  • OR : ∨ 또는 +로 표기한다.

NOT은 보수화/ AND는 둘다 1이면 1/ OR는 둘중에 하나라도 1이면 1



3줄 요약

1. 기대가 됩니다.

2. 1장을 읽어보는 것은 어셈블리의 맛보기로 괜찮은 것 같다.

3. 뭔가 로우레벨로 들어가니 굉장히 어려워질 것 같다.