본문 바로가기

전자공학

어셈블리어(assembly language)

728x90
반응형

요약

 



기계어(machine language)를 사람이 쓰는 언어와  1:1매치하는 것








 정의상 가정

 기계어(machine language)

 내용상 가정

 

 공식

 기계어(machine language)를 사람이 쓰는 언어와  1:1매치하는 것

 단위

 

 응용

 


파란 박스의 글자를 클릭하시면 가정과 응용으로 넘어 가실 수 있습니다!!




앞서 기계는 신호를 전위의 차이인 bit로만 인식할 수 있기 때문에

기계에 명령을 내릴 때는 bit의 조합으로만 명령을 내려야 한다고 했습니다.


즉 기계에게 어떤 두 숫자의 덧샘을 시킨다고 할때 몇번 몇번 스위치는 내리고 나머지 스위치는 올린 뒤 신호를 보내는 것입니다.

이러한 방법은 엄청나게 지루하고 직관적이지 않기 때문에 이러한 기계어(machine language)를 사람이 쓰는 언어와  1:1매치하는 것을 고안했습니다.


이것이 어셈블리어(assembly language)입니다.

이 어셈블리 언어를 기계어와 매치시켜주는 것을 어셈블러(assembler)라고 합니다.


MIPS라는 어셈블리어를 예로 어셈블리어가 도데체 어떻게 정의했는지 보겠습니다.


사용자는 숫자 b와 c를 더하고 싶습니다.


그렇다면

숫자 b와 c를 표현한 bit값들을 저장한 소자와

더한 값을 저장할 소자가 필요하겠죠?


A, B, C라는 레지스터가 있다고 가정해 봅시다.

(이때 레지스터(register)는 어떤 bit값을 저장하는 소자로 링크를 타고 들어가시면 더 자세히 알 수 있습니다.(추후 추가))

그렇다면 B와 C에 저장된 값을 더해 A에 저장하는 명령을 내리면 숫자 b와 c를 더한값을 A에서 볼수있습니다.


이러한 명령을 어셈블리어(MIPS)로

add A, B, C

라고 할 수 있습니다.


전혀 새로운 언어 아니냐고요?

아닙니다. 이것은 정확하게 bit의 조합입니다.


다음 그림을 보면 A, B, C와 add는 각각 어느 bit의 조합과 1:1 매치가됩니다.

즉 약속해둔것입니다. 

add일 때는 앞 6bit를 000000으로 뒤 11bit를 00000100000로 만들고

A, B, C의 레지스터 주소(레지스터의 이름)을 B, C, A순서로 넣으라는 것입니다,

변환도 아닙니다.

그냥 "add A, B, C"는 00000010001100100100000000100000랑 똑같은 말입니다. 

단지 회로 설계할때 어떤 machine language를 적용할지 약속해두고,

각 명령어 별로 어셈블리어를 약속해두어

더하기 add일때는 앞 6bit를 000000으로 뒤 11bit를 00000100000로 만들고

빼기 sub일때는 앞 6bit를 000000으로 뒤 11bit를 00000100010로 한 것입니다.


따라서 명령어도 적습니다.

mips의 전체적인 명령어를 보고 싶으시다면

google에 "MIPS Instruction Reference"를 검색하시거나

http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html 에 들어가시면 알 수 있습니다.


더 자세한 mips에 대한 설명은 응용링크를 눌러주세요!(추후추가)


한번 응용해볼까요?


C언어로

f=(g+h)-(i+j);

라는 코드는 어떻게 기계까지 갈까요?


바로 컴파일러가 어셈블리어로 변환하여


add t0, g, h

add t1, i, j

sub f, t0, t1


(t0, t1은 레지스터입니다!(잠시 저장해준다는 개념입니다.))


이라고 어셈블리어가 되고


이는 

00000010001100100100000000100000

00000010010101000100100000100000

00000001010100011001000000100010

라고 기계한테 명령을 보내는 겁니다!!

(레지스터값은 마음대로 했습니다!)



예시



그럼 과연 어떤 식으로 작동하는지 MIPS에서 제공하는 processor의 예를 하나 보겠습니다.

(이 사진은 Computer Organization and Design, David A, Patterson, John L. Hennessy, 5th edition에 Chapter 4에 수록되어있는 사진입니다.)

이게 한 processor, 즉 한 기계의 구성도 입니다.

왼쪽에서 부터 오른쪽으로 쭉 오는데요.

명령어를 입력하게 되면 명령어 한줄 한줄마다 순서대로 고유한 번호가 붙습니다.

명령어 주소라고도 하는데요, 이 명령어 주소값을 PC라고 합니다.

이 PC값이 위에 add 소자로 byte단위인 4씩 더해져서 한번 오른쪽으로 쭉 갈때마다 더해지게 됩니다.

PC값이 증가한다는것은 다음 주소인 코드를 동작시킨다는 거겠습니다!

PC값이 PC오른쪽 Instruction memory로 들어가면 그 주소에 맞는 명령어(Instruction)을 호출하게 됩니다.

명령어(Instruction)가 위에서 보았던 00000001010100011001000000100010 와 같은 어셈블리어를 기계어로 변환한 bit값입니다.

이 명령어에서 이것이 add인지 sub인지 무슨 명령을 하는건지 판별하기 위해 control로 보내지고

control에서는 이 명령에 맞는 제어를 합니다.(파란색 선은 모두 제어선 입니다.)

또 Registers라는 메모리에 명령어가 보내져서 명령어  00000001010100011001000000100010에서 레지스터 주소를 빼오고 레지스터에 저장된 값을 꺼내옵니다. 

명령어에 따라 ALU에서 덧셈, 뺄샘, or, and등의 소자로 할 수 있는 연산을 하게 됩니다.

(sign-extend는 sing/unsing에 따라 상수를 늘리는 것이고, 각각의 MUX는 어떤 값을 선택할지 제어선에 따라 선택하게 됩니다.)

그뒤 메모리에 값을 저장해야 한다면 Data Memory에 저장하고 레지스터에 저장해야 한다면 Registers에 저장합니다.

마지막으로 다시 가장 왼쪽으로 돌아와서 PC값으로 줄 주소값을 ALU에서 계산한 값으로 할지(점프할때 씁니다.), Add에서 계산한 값으로 할지(그냥 바로 다음코드로 넘어갈때 씁니다.) MUX에서 결정합니다.

중간 중간 네모 기둥들은 파이프라인을 위해 쓰는데 이것은 응용에서 다루겠습니다. (추후추가)


반응형

'전자공학' 카테고리의 다른 글

고급 언어 (high-level language)  (0) 2017.02.23
컴파일러(compiler)  (0) 2017.02.18
기계어(machine language)  (2) 2017.02.07
bit  (0) 2017.02.05
[sci-hub](2022년10월기준)논문 열람 팁!/ 논문 찾는 사이트(주소수정)  (8) 2016.12.07