왜 어셈블리 언어가 필요한가?
실제로 우리에게 필요한 언어는 "기계 언어"또는 "기계 코드"라고합니다. 다음과 같이 보입니다 :
0010000100100011
이것은 컴퓨터에서 직접 말할 수있는 유일한 언어입니다. CPU가 말하는 언어입니다 (기술적으로는 다른 유형의 CPU가 다른 버전을 말합니다). 또한보고 이해하려고 노력합니다.
다행히 이진의 각 섹션은 특정 의미에 해당합니다. 여러 섹션으로 나뉩니다.
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
이 값은 다음에 해당합니다.
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
따라서이 작업은 레지스터 1과 2에 숫자를 추가하고 해당 값을 레지스터 3에 넣습니다. 문자 그대로이 값을 CPU에 넣고 "go"라고하면 두 개의 숫자가 추가됩니다. "빼기"연산은 여기서 0010 대신 0011 또는 다른 것일 수 있습니다. 어떤 값을 사용하든 CPU는 빼기를 수행합니다.
따라서 프로그램은 다음과 같이 보일 수 있습니다 (설명하기 위해이 특정 버전의 기계 코드를 구성했기 때문에 이해하지 마십시오).
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
이거 읽다 보니? 명확히. 그러나 우리는 CPU에 필요합니다 . 모든 머신 코드가 특정 액션에 해당하는 경우, 간단한 "영어"속기를 만들고 프로그램이 수행하는 작업을 이해하면 실제 바이너리 머신 코드로 변환하여 CPU에 실행합니다.
위의 원래 명령은 다음과 같습니다.
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
이 영어 버전은 기계어 코드와 정확히 일치합니다 . 따라서이 "영어"줄을 작성할 때, 우리는 실제로 더 친숙하고 이해하기 쉬운 기계 코드를 작성합니다.
글쎄, 이것은 어셈블리 언어입니다. 이것이 존재하는 이유와 원래 만들어진 이유입니다.
왜 우리가 지금 필요한지 이해하려면 위의 답변을 읽으십시오. 그러나 이것이 이해해야 할 핵심은 이것입니다. 고급 언어에는 단일 표현이 없으며 기계 코드입니다. 예를 들어 C, Python 또는 기타
z = x + y
이것은 x
레지스터 1에 y
있고 레지스터 2에 있고 레지스터 3에 있다고 가정하면 위에서 추가 한 것처럼 들립니다. z
그러나이 줄은 어떻습니까?
z = x * 2 + (y / 6) * p + q - r
이 라인을 16 비트 바이너리로 표현 하고 CPU에 "go"라고 말하십시오. 당신은 할 수 없습니다. 기계 코드에는 더하기, 빼기 및 한 번에 4 개 또는 5 개의 변수가있는 다른 것을 수행하기위한 단일 작업 명령이 없습니다. 따라서 먼저 일련 의 기계 코드 로 변환해야합니다 . 고급 언어를 "컴파일"또는 "해석"할 때 수행하는 작업입니다.
글쎄, 우리는 그렇게 할 프로그램이 있는데, 왜 지금 집회가 필요한가? 프로그램이 예상보다 느리게 실행되고 있으며 그 이유를 알고 싶다고 말하십시오. 이 행의 기계 언어 "출력"을 보면 다음과 같이 보일 수 있습니다.
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
한 줄의 파이썬을 끝내기 위해. 그래서 당신은 정말로 그것을 디버깅하고 싶습니까?!?!?! 아니요 . 오히려 컴파일러는 실제로 쉽게 이해할 수있는 형식 으로 해당 기계 코드에 정확히 해당하는 어셈블리 언어 버전 인 출력을 친절하게 제공하도록 요청합니다 . 그런 다음 컴파일러가 멍청한 짓인지 알아 내고 고칠 수 있습니다.
(@Raphael의 조언에 대한 추가 참고 사항 : 실제로 3 진 (기본 3) 또는 10 진수 코드 또는 ASCII와 같은 이진 코드 이외의 작업을 수행하는 CPU를 실제로 구성 할 수 있습니다. 실제로는 실제로 이진을 고수했습니다.)