프로그래밍 언어에 관해 이야기할 때 가장 먼저 떠오르는 것은 C, C++, Java, Python 등과 같은 언어입니다. 그러나 이러한 언어는 실제 작업을 숨깁니다. 즉, 사용자로부터 많은 것을 추상화합니다. 그러나 컴퓨터 하드웨어 간의 프로그래밍이나 상호 작용 뒤에 있는 기본 개념에 실제로 존재하는 언어가 있습니다.
어셈블리 언어란 무엇입니까?
어셈블리어 컴퓨터 하드웨어와 직접 통신하는 데 도움이 되는 저수준 언어입니다. 이는 프로세서가 수행해야 하는 작업을 나타내기 위해 니모닉을 사용합니다. 다음과 같은 고급 언어 사이의 중간 언어입니다. C++ 그리고 바이너리 언어. 16진수와 2진수 값을 사용하며 사람이 읽을 수 있습니다.
어셈블리 언어의 진화?
어셈블리 언어는 컴퓨터 하드웨어의 발전과 프로그래머의 요구 사항의 변화와 함께 발전해 왔습니다. 각 세대를 자세히 살펴보면 다음과 같습니다.
1세대(1940-1950):
- 컴퓨터는 진공관에 의존했고 프로그래밍은 이진 명령어를 사용하여 기계어로 직접 이루어졌습니다.
- 어셈블리 언어는 기계 명령어를 표현하기 위해 니모닉 코드를 사용하여 읽을 수 있는 추상화로 나타났습니다.
2세대(1950-1960):
- 트랜지스터 기반 컴퓨터는 진공관을 대체하여 향상된 일관성과 성능을 제공합니다.
- 이러한 새로운 기계의 복잡한 명령어 세트를 처리하기 위해 어셈블리 언어가 더욱 복잡해졌습니다. 동시에 다음과 같은 고급 프로그래밍 언어도 가능합니다. 포트란 그리고 코볼 고급 추상화 제공
3세대(1960-1970):
- 집적회로가 표준이 되면서 성능은 떨어지지만 강력한 컴퓨터가 탄생했습니다.
- 어셈블리 언어는 더욱 발전하여 매크로 및 기호 레이블과 같은 기능을 도입하여 프로그래머 생산성과 코드 가독성을 높였습니다.
4세대(1970-1980):
- 마이크로프로세서의 시작은 컴퓨팅을 변화시켜 IBM PC 및 Apple II와 같은 마이크로컴퓨터 시스템의 길을 열었습니다.
- 마이크로컴퓨터용 어셈블리 언어는 구문 강조 및 자동 들여쓰기 기능을 통해 사용자 접근성을 향상하도록 재설계되어 더 많은 프로그래머 그룹의 포용성을 높였습니다.
5세대(1980-현재):
- 이 시대는 여러 계산 작업을 동시에 실행하는 것이 특징입니다. 이 방법은 다음과 같이 알려져 있습니다. 병렬 처리 시스템 정교한 소프트웨어 시스템의 성장
- 복잡한 시스템의 코드 성능과 생산성 향상에 초점을 맞춘 최첨단 디버깅 방법과 도구의 배포를 통해 어셈블리 언어는 프로그래머의 요구를 충족하기 위해 계속해서 발전했습니다.
어셈블리 언어는 어떻게 작동하나요?
어셈블리 언어에는 프로세서가 수행해야 하는 작업을 지정하는 니모닉 코드가 포함되어 있습니다. 프로그래머가 작성한 니모닉 코드를 기계어(바이너리 언어)로 변환하여 실행했습니다. 어셈블러는 어셈블리 코드를 기계어로 변환하는 데 사용됩니다. 해당 기계어 코드는 실행을 위해 실행 파일에 저장됩니다.
이를 통해 프로그래머는 레지스터, 메모리 위치, 하드웨어와 같은 하드웨어와 직접 통신할 수 있습니다. 입출력 장치 아니면 다른 어떤 하드웨어 구성 요소. 프로그래머가 하드웨어 구성 요소를 직접 제어하고 효율적인 방식으로 리소스를 관리하는 데 도움이 될 수 있습니다.
어셈블리 언어를 실행하는 방법은 무엇입니까?
- 어셈블리 코드 작성 : 장치에서 텍스트 편집기를 열고 니모닉 코드를 작성한 후 어셈블러에 따라 적절한 확장자로 파일을 저장합니다. 확장은 다음과 같습니다. .asm , .에스 , .asm 엑스.
- 코드 조립 : 다음을 사용하여 코드를 기계어로 변환합니다. 어셈블러 .
- 객체 파일 생성 : 코드에 해당하는 개체 파일을 생성합니다. 확장자는 . 객체 .
- 실행 파일 연결 및 생성 : 우리의 어셈블리 언어에는 여러 소스 코드가 포함될 수 있습니다. 그리고 실행 가능하게 만들려면 라이브러리에 연결해야 합니다. 이 목적을 위해 lk와 같은 링커를 사용할 수 있습니다.
- 프로그램 실행 : 실행 파일을 생성한 후 평소대로 실행할 수 있습니다. 프로그램을 실행하는 방법은 소프트웨어에 따라 다릅니다.
어셈블리 언어의 구성요소
- 레지스터: 레지스터는 프로세서 내부에 위치한 빠른 메모리 위치입니다. 도움이 되는 것 가다 산술 연산을 수행하고 데이터를 임시 저장합니다. 예: Ax(어큐뮬레이터), Bx, Cx.
- 명령: 명령이라고 알려진 어셈블리 코드의 명령은 어셈블러에게 수행할 작업을 알려줍니다. 어셈블리 언어 명령어는 일반적으로 추가를 위한 ADD, 데이터 이동을 위한 MOV와 같이 어휘를 단순하게 만들기 위해 자체 설명적 약어를 사용합니다.
- 지침: 지침은 LOAD, ADDITION, MOVE와 같은 특정 작업을 수행하기 위해 프로세서에 제공하는 니모닉 코드입니다. 예: 추가
- 라벨: 어셈블리 코드에서 특정 위치나 주소를 나타내기 위해 부여된 기호 이름/식별자입니다. 예: FIRST는 코드 실행 부분의 시작을 나타냅니다.
- 니모닉: 니모닉은 어셈블리 언어 명령어의 약어 또는 기계 기능에 부여된 이름입니다. 어셈블리의 각 니모닉은 특정 기계 명령에 해당합니다. Add는 이러한 기계 명령 중 하나를 보여줍니다. CMP, Mul 및 Lea도 추가 사례에 속합니다.
- 매크로: 매크로는 일단 정의하면 호출을 통해 프로그램의 어느 곳에서나 사용할 수 있는 프로그램 코드입니다. 그리고 어셈블러와 컴파일러가 내장되어 있는 경우도 많습니다. %macro 지시문을 사용하여 정의해야 합니다. 예: %macro ADD_TWO_NUMBERS 2
eax를 추가하세요, % 1
eax를 추가하세요, %2
%end매크로 - 피연산자: 이는 특정 작업을 수행하라는 지시를 통해 제공되는 데이터 또는 값입니다. 예: ADD R1,R2에서 ; R1과 R2는 피연산자입니다.
- 연산코드: 이는 수행해야 하는 작업을 프로세서에 지정하는 니모닉 코드입니다. 예: ADD는 추가를 의미합니다.
16진수 체계 16개의 기호를 사용하여 다양한 숫자를 나타내는 데 사용되는 숫자 체계입니다. 0~9자리 숫자와 A~F 알파벳과 16진수 체계입니다. 10진수는 0부터 9까지이고 16진수는 동일합니다.
10진수를 16진수로 표
소수 | 마녀 | 소수 | 마녀 | 소수 | 마녀 | 소수 | 마녀 |
---|---|---|---|---|---|---|---|
0 | 0 | 10 | ㅏ | 이십 | 14 | 30 | 1E |
1 | 1 | 열하나 | 비 | 이십 일 알파 베타 가지치기 예 | 열 다섯 | 31 | 1층 |
2 | 2 | 12 | 씨 | 22 | 16 | 32 | 이십 |
삼 | 삼 | 13 | 디 | 23 | 17 | 33 | 이십 일 |
4 | 4 | 14 | 그리고 | 24 | 18 | 3. 4 | 22 |
5 | 5 | 열 다섯 | 에프 | 25 | 19 | 35 | 23 |
6 | 6 | 16 | 10 | 26 | 1A | 36 | 24 |
7 123movies와 유사한 영화 웹사이트 | 7 | 17 | 열하나 | 27 | 1B | 37 | 25 |
8 | 8 | 18 | 12 | 28 | 1C | 38 | 26 |
9 | 9 | 19 | 13 | 29 | 1D | 39 | 27 |
16진수는 2진수 시스템, 10진수 시스템, 8진수 시스템과 같은 다른 형식으로 쉽게 변환될 수 있으며 그 반대도 마찬가지입니다. 이 문서에서는 16진수를 10진수로 또는 그 반대로 변환하는 데 중점을 둡니다.
10진수를 16진수로 변환:
1단계: 십진수 값 N을 입력합니다.
2단계: N을 16으로 나누고 나머지를 저장합니다.
3단계: 다시 2단계에서 얻은 16으로 몫을 나누고 나머지를 저장합니다.
3단계: 몫이 0이 될 때까지 3단계를 반복합니다.
4단계: 나머지를 역순으로 쓰면 이것이 숫자의 16진수 값이 됩니다.
예: 450진수 값을 16진수로 변환합니다.
1단계: N = 450.
2단계: 450/16은 Q = 28, R = 2를 제공합니다.
3단계: 28/16은 Q = 1, R = 12 = C를 제공합니다.
4단계: 1/16은 Q = 0, R = 1입니다.
5단계: 450의 16진수는 1C2입니다.
16진수를 10진수로 변환
16진수를 10진수로 변환하려면 각 숫자에 오른쪽부터 시작하여 해당 위치의 거듭제곱에 16을 곱하고 가장 오른쪽 숫자의 위치는 0이 된 다음 그 결과를 더합니다.
예: 변환(A7B) 16 십진수로.
(A7B)16= A × 162+7×161+B×160
⇒ (A7B)16= 10 × 256 + 7 × 16 + 11 × 1 (기호 A와 B를 십진수로 변환; A = 10, B = 11)
⇒ (A7B)16= 2560 + 112 + 11
⇒ (A7B)16= 2683
따라서 (A7B)의 십진수는 다음과 같습니다.16이다 (2683)10.
어셈블리 언어의 장점
- 하드웨어에 대한 정확한 제어를 제공하므로 코드 최적화가 향상됩니다.
- 레지스터와 같은 하드웨어 구성 요소에 직접 액세스할 수 있으므로 하드웨어 문제에 대한 맞춤형 솔루션이 가능합니다.
- 낮은 수준의 제어, 최적화된 코드, 리소스 인식, 사용자 정의 등으로 효율적인 리소스 활용
- 프로그래밍에 이상적입니다. 마이크로컨트롤러 , 센서 및 기타 하드웨어 구성 요소.
- 보안 취약점을 찾기 위한 보안 연구, 시스템 보안을 위한 리버스 엔지니어링 소프트웨어에 사용됩니다.
- 만드는데 매우 필수적입니다. 운영체제 , 핵심 그리고 장치 컨트롤러 기능을 위해서는 하드웨어 상호 작용이 필요합니다.
어셈블리 언어의 단점
- 특히 초보자에게 언어를 배우기에는 복잡하고 매우 어렵습니다.
- 기계 의존도가 높습니다. 그래서 휴대성이 제한됩니다.
- 특히 대규모 프로젝트의 경우 코드를 유지 관리하는 것이 정말 어렵습니다.
- 이해하기 어렵고 코드 길이도 길기 때문에 시간이 많이 걸립니다.
- 디버깅 프로그래머에게는 매우 어려운 일입니다.
어셈블리 언어에 대해 자주 묻는 질문 – FAQ
어셈블리 언어는 어디에 사용되나요?
- 운영 체제 개발
- 장치 드라이버 생성
- 임베디드 시스템 프로그래밍
- 실시간 애플리케이션
- 보안 연구
어셈블리 언어와 고급 언어의 차이점은 무엇입니까?
어셈블리 언어는 니모닉 코드이며 CPU의 명령어 세트와 밀접한 관련이 있습니다. HLL에는 추상화가 있습니다.
어셈블리 프로그래밍을 하려면 어떤 CPU 아키텍처를 배워야 합니까?
8085 및 8086 마이크로 프로세서 아키텍처는 개념을 이해하는 데 훨씬 더 좋습니다.
현대 컴퓨팅에서 어셈블리 언어가 여전히 관련이 있습니까?
예. 어셈블리 언어는 여전히 관련성이 있습니다.