어셈블리 언어

Assembly language
어셈블리 언어
Motorola 6800 Assembly Language.png
Motorola MC6800의 원래 어셈블리 언어(오른쪽)와 조립된 양식을 보여주는 조립업체의 일반적인 보조 출력
패러다임필수적이고 구조화되지 않은
첫 등장1949; 73년 전 (1998년)

컴퓨터 프로그래밍에서 조립 언어(또는 조립 언어)[1]는 때때로 asm으로 약칭되기도 하며, 언어의 지시와 아키텍처의 기계 코드 지시 사이에 매우 강력한 일치성이 있는 낮은 프로그래밍 언어다.[2]어셈블리 언어는 일반적으로 기계 명령(1:1)당 하나의 문구를 가지지만 상수, 주석, 조립자 지시문,[3] 예를 들어 메모리 위치, 레지스터, 매크로[4][1] 등의 기호 라벨도 일반적으로 지원된다.

조립 코드는 조립자라 불리는 유틸리티 프로그램에 의해 실행 가능한 기계 코드로 변환된다."어셈블러"라는 용어는 일반적으로 1951년 저서 "전자 디지털 컴퓨터위한 프로그램 준비"에서 Wilkes, Wheeler, Gill의 덕분으로 여겨진다.[5] 그는 이 용어를 "여러 섹션으로 구성된 다른 프로그램을 하나의 프로그램으로 조립하는 프로그램"[6]을 의미하기 위해 사용했다.변환 과정을 소스 코드 조립과 같이 조립이라고 한다.조립자가 프로그램을 처리할 때 계산 단계를 조립 시간이라고 한다.조립 언어는 상징 기계 코드라고도 불릴 수 있다.[7][8]

어셈블리는 기계 코드 지침에 따라 달라지기 때문에 각 어셈블리 언어는[nb 1] 특정 컴퓨터 아키텍처에 특정된다.[9]

때때로 동일한 아키텍처를 위한 한 개 이상의 조립자가 있으며, 때때로 조립자는 운영 체제 또는 특정 운영 체제에 특정된다.대부분의 어셈블리 언어는 운영 체제 호출을 위한 특정 구문을 제공하지 않으며, 대부분의 어셈블리[nb 2] 언어는 프로세서의 모든 실제 기능에 대한 액세스를 제공하고, 모든 시스템메커니즘이 궁극적으로 정지하는 것이기 때문에 어떤 운영 체제와 함께 보편적으로 사용될 수 있다.조립 언어와 대조적으로, 대부분의 높은 수준의 프로그래밍 언어는 일반적으로 여러 아키텍처에 걸쳐 이동 가능하지만, 해석이나 컴파일이 필요한데, 이것은 조립보다 훨씬 더 복잡한 작업이다.

어셈블리 언어 구문

조립 언어는 예를 들어 각 낮은 수준의 기계 명령 또는 opcode, 각 지시, 일반적으로 각 건축 기록부, 깃발 등을 나타내기 위해 니모닉을 사용한다.일부 연상기호는 내장되어 있고 일부 사용자는 정의되어 있을 수 있다.많은 연산이 완벽한 지침을 형성하기 위해 하나 이상의 피연산자를 필요로 한다.대부분의 조립자는 프로그램과 메모리 위치에 대해 명명된 상수, 레지스터 및 라벨을 허용하며 피연산자에 대한 식을 계산할 수 있다.따라서 프로그래머는 지루한 반복 계산에서 벗어나고 조립자 프로그램은 기계 코드보다 훨씬 읽기 쉽다.구조에 따라, 이러한 요소들은 또한 오프셋이나 다른 데이터 및 고정 어드레스를 사용하는 특정 지침이나 어드레싱 모드를 위해 결합될 수 있다.많은 조립자들은 프로그램 개발을 촉진하고, 조립 과정을 제어하며, 디버깅을 돕기 위한 추가적인 메커니즘을 제공한다.

일부는 특정 열에 특정 필드가 있는 칼럼 지향적이다; 이것은 1950년대와 1960년대 초반에 펀치 카드를 사용하는 기계들에게 매우 흔했다.일부 조립자는 자유형 구문을 가지고 있으며, 구분자로 구분된 필드(: 구두점, 공백)로 구분되어 있다.일부 조립자는 특정 열과 구분자로 구분된 다른 필드에서 라벨과 같은 혼합형이다. 이는 1960년대에 칼럼 지향 구문보다 더 보편화되었다.

IBM 시스템/360

기본적으로 System/360용 IBM 조립자는 모두 1열에 라벨을, 2-71열에 구분 기호로 구분된 필드, 72열에 연속 표시기, 73-80열에 시퀀스 번호를 가진다.라벨, opcode, 피연산자 및 주석 구분 기호는 공백이며, 개별 피연산자는 쉼표와 괄호로 구분된다.

용어.

  • 매크로 어셈블러는 (변수화된) 어셈블리 언어 텍스트를 이름으로 나타낼 수 있도록 매크로 인스톨레이션 기능을 포함하는 어셈블러로, 그 이름을 사용하여 확장된 텍스트를 다른 코드에 삽입할 수 있다.
    • 오픈 코드는 매크로 정의 외부에 있는 모든 조립자 입력을 말한다.
  • 교차 조립자(크로스 컴파일러도 참조)는 결과 코드가 실행될 시스템(대상 시스템)과는 다른 유형의 컴퓨터나 운영 체제(호스트 시스템)에서 실행되는 조립자다.교차조립은 임베디드 시스템이나 마이크로컨트롤러와 같이 소프트웨어 개발을 지원할 자원이 없는 시스템의 프로그램 개발을 촉진한다.이러한 경우, 결과 객체 코드는 읽기 전용 메모리(ROM, EPROM 등), 프로그래머(마이크로컨트롤러처럼 읽기 전용 메모리가 장치에 통합된 경우) 또는 객체 코드의 정확한 비트별 복사본 또는 해당 코드(Intel 등)의 텍스트 기반 표현을 사용하는 데이터 링크를 통해 대상 시스템으로 전송되어야 한다. 헥스 또는 모토로라 S레코드).
  • 고급조립자란 고급 제어구조(IF/TEN/ELSE, DO CASE 등)와 구조/기록, 조합, 등급, 집합 등 고급 추상 데이터 유형과 관련된 언어 추상화를 보다 자주 제공하는 프로그램이다.
  • 마이크로 조립기는 컴퓨터의 저수준 작동을 제어하기 위해 펌웨어라고 불리는 마이크로그램의 준비를 돕는 프로그램이다.
  • 메타조립자는 "조립 언어의 통사적 및 의미적 설명을 수용하고, 그 언어에 대한 조립자를 생성하는 프로그램"[10]이거나, 그러한 설명과 함께 조립자 소스 파일을 수용하고, 그 설명에 따라 소스 파일을 조립하는 프로그램이다.SDS 9 시리즈SDS 시그마 시리즈 컴퓨터용 "메타 심볼" 조립자는 메타 조립기다.[11][nb 3]Sperry Univac은 또한 UNIVAC 1100/2200 시리즈를 위한 메타 어셈블러를 제공했다.[12]
  • 인라인 조립자(또는 임베디드 조립자)는 높은 수준의 언어 프로그램에 포함된 조립자 코드다.[13]이것은 하드웨어에 직접 접근해야 하는 시스템 프로그램에서 가장 자주 사용된다.

주요개념

조립자

조립자 프로그램은 작동 및 어드레싱 모드를 위한 니모닉구문의 조합을 수치로 환산하여 객체 코드를 만든다.이 표현은 일반적으로 다른 제어 비트 및 데이터뿐만 아니라 작동 코드("opcode")를 포함한다.조립자는 또한 상수 식을 계산하고 메모리 위치 및 기타 실체에 대한 기호 이름을 결정한다.[14]심볼릭 레퍼런스의 사용은 프로그램 수정 후 지루한 계산과 수동 주소 업데이트를 절약하는 조립자의 주요 기능이다.대부분의 조립자는 또한 텍스트 대체를 수행하기 위한 매크로 시설을 포함한다. 예를 들어, 서브루틴이라 불리는 대신 인라인으로 명령의 공통적인 짧은 시퀀스를 생성하기 위함이다.

또한 일부 조립자는 명령 집합별 최적화의 간단한 유형을 수행할 수 있다.이에 대한 구체적인 예로는 다양한 공급업체의 어디에서나 볼 수 있는 x86 조립자가 있을 수 있다.점프 크기 조정이라고 불리는 이들은 대부분 요청 시 임의의 패스 수에서 점프-인스턴스 교체(짧은 점프 또는 상대 점프로 대체되는 긴 점프)를 수행할 수 있다.[14]다른 사람들은 CPU 파이프라인을 최대한 효율적으로 이용하기 위해 합리적인 명령 일정을 최적화하는 데 도움을 줄 수 있는 RISC 아키텍처의 일부 조립자와 같이 명령의 단순한 재배열이나 삽입을 할 수도 있다.[citation needed]

조립자들은 1950년대부터 기계어보다 첫 단계로서, 그리고 포트란, 알골, COBOL, 리스프와 같은 고급 프로그래밍 언어 이전에 사용 가능했다.또한 조립 및 고수준 언어와 유사한 속성을 가진 여러 종류의 번역기와 반자동 코드 생성기가 있었으며, 스피드코드는 아마도 더 잘 알려진 예들 중 하나일 것이다.

특정 CPU 또는 명령 집합 아키텍처에 대해 서로 다른 구문을 가진 여러 조립자가 있을 수 있다.예를 들어 x86 패밀리 프로세서의 레지스터에 메모리 데이터를 추가하는 지침은add eax,[ebx], 원본 Intel 구문에 기록되는 반면,addl (%ebx),%eaxGNU Assembler에 의해 사용되는 AT&T 구문에.다른 모습에도 불구하고, 다른 통사적 형태는 일반적으로 동일한 숫자의 기계 코드를 생성한다.단일 조립자는 정확한 의미 해석뿐만 아니라 통사적 형태의 변화를 지원하기 위해 다른 모드를 가질 수도 있다(x86 조립 프로그래밍의 특별한 경우 FASM-syntax, TASM-syntax, 이상적인 모드 등).

패스 수

객체 파일을 생성하기 위해 필요한 소스 통과 횟수(조립자가 소스를 몇 번 읽는지)에 근거한 두 가지 유형의 조립자가 있다.

  • 원패스 조립자는 소스코드를 한 번 거친다.정의되기 전에 사용된 기호는 객체 코드 끝에 "errata"가 필요하며(또는 최소한 기호가 정의된 지점보다 이전이 아님) 링커 또는 로더에게 "뒤로"라고 말하고 아직 정의되지 않은 기호가 사용된 곳에 방치된 자리 표시자를 덮어쓰도록 지시한다.
  • 다중 패스 조립자는 첫 번째 패스에서 모든 기호와 그 값이 있는 표를 만든 다음 나중에 패스로 표를 사용하여 코드를 생성한다.

두 경우 모두 조립자는 후속 기호의 주소를 계산하기 위해 최초 통과 시 각 명령의 크기를 결정할 수 있어야 한다.즉, 나중에 정의된 피연산자를 참조하는 작업 규모가 피연산자의 유형이나 거리에 따라 달라지는 경우, 조립자는 처음 연산을 접했을 때 비관적으로 추정하며, 필요한 경우 나중의 패스나 에라타에 하나 이상의 "불연산" 지시로 채운다.핍홀 최적화가 가능한 조립자의 경우, 목표와의 정확한 거리에 맞춘 코드로 비관적 코드를 대체할 수 있도록 패스 간 주소를 다시 계산할 수 있다.

원패스 조립자를 사용한 원래 이유는 메모리 크기와 조립 속도였다 – 종종 두 번째 패스는 기호 테이블을 메모리에 저장하거나(앞으로 참조를 처리하기 위해), 프로그램 소스를 테이프에 다시 감았다가 다시 읽거나 카드 데크펀치된 종이 테이프를 다시 읽어야 한다.훨씬 더 큰 메모리(특히 디스크 저장장치)를 가진 후기 컴퓨터들은 그러한 재읽기 없이 필요한 모든 처리를 수행할 수 있는 공간을 가지고 있었다.멀티패스 조립기의 장점은 에라타가 없으면 연결 프로세스(또는 조립자가 실행 가능한 코드를 직접 생산하는 경우 프로그램 로드)가 빨라진다는 것이다.[15]

예: 다음 코드 조각에서 원패스 조립자는 역방향 참조의 주소를 결정할 수 있다.BKWD명세서를 조립할 때S2, 그러나 전방 참조의 주소를 확인할 수 없음FWD분기명세서 조립시S1; 정말,FWD정의되지 않을 수도 있다2패스 조립자는 패스 1에서 두 주소를 모두 결정하므로 패스 2에서 코드를 생성할 때 이 주소를 알 수 있다.

S1   B    FWD...FWDEQU *... BKWDEQU *... S2    B   BKWD 

고급 조립자

보다 정교한 고급 조립자는 다음과 같은 언어 추상화를 제공한다.

자세한 내용은 아래 언어 설계를 참조하십시오.

어셈블리 언어

조립 언어로 작성된 프로그램은 일련의 니모닉 프로세서 지침과 메타 상태(선언적 연산, 지시, 의사 지시, 의사 지시, 의사 조작 및 의사 조작으로 다양하게 알려져 있음), 코멘트 및 데이터로 구성된다.어셈블리 언어 지침은 일반적으로 opcode 니모닉과 피연산자 뒤에 있는 opcode mnemonic으로 구성되며, 이는 데이터, 인수 또는 매개변수의 목록일 수 있다.[17]일부 지침은 "임플라이"될 수 있다. 즉, 지침이 작동하는 데이터는 지침 자체에 의해 암묵적으로 정의된다. 즉, 그러한 지침은 피연산자를 필요로 하지 않는다.그 결과 문장은 조립자에 의해 메모리에 로드되어 실행될 수 있는 기계 언어 지침으로 번역된다.

예를 들어 아래 지침은 x86/IA-32 프로세서에 즉시 8비트 값레지스터로 이동하도록 지시한다.이 지침의 이진 코드는 10110이고, 그 다음에 사용할 3비트 식별자가 나온다.AL 레지스터의 식별자는 000이므로 다음의 기계 코드는 데이터 01100001로 AL 레지스터를 로드한다.[17]

10110000 01100001

이 2진법 컴퓨터 코드는 다음과 같이 16진법으로 표현하면 사람이 더 잘 읽을 수 있게 만들 수 있다.

B0 61

여기,B0'다음 값의 사본을 AL로 이동하며,61 값 01100001의 16진수 표시로, 10진수로 97이다.8086 계열의 조립 언어는 이와 같은 지시사항에 대해 니모닉 MOV(이동 약어)를 제공하므로, 위의 기계코드는 세미콜론 뒤에 필요한 경우 설명 코멘트로 완성하여 조립 언어로 다음과 같이 작성할 수 있다.이것은 읽고 기억하기 훨씬 쉽다.

MOV AL, 61시간       ; 97진수 AL 로드(61 16진수) 

일부 어셈블리 언어(이것을 포함)에서는 MOV와 같은 동일한 니모닉 언어를 즉시 값, 레지스터의 값 또는 레지스터의 값 또는 즉시(직접) 주소로 가리키는 메모리 위치, 데이터 로드, 복사 및 이동에 대한 관련 지침 집합에 사용할 수 있다.다른 조립자는 "등록할 메모리 이동"을 위해 L, "기억으로 레지스터 이동"을 위한 ST, "등록하기 위해 레지스터 이동"을 위한 LR, "즉시 작동자를 메모리로 이동"을 위한 MVI 등과 같은 별도의 opcode 니모닉을 사용할 수 있다.

다른 지침에 동일한 니모닉을 사용하는 경우, 이는 니모닉이 데이터를 제외한 여러 개의 다른 이진 명령 코드에 해당함을 의미한다(예:61h이 예에서), 니모닉을 따르는 피연산자에 따라.예를 들어 x86/IA-32 CPU의 경우 Intel 어셈블리 언어 구문MOV AL, AH레지스터 AH의 내용을 레지스터 AL로 이동하는 지침을 나타낸다.[nb 4] 지침의 16진법 형식은 다음과 같다.

88년 E0

첫 번째 바이트인 88h는 바이트 크기 레지스터와 다른 레지스터 또는 메모리 사이의 이동을 식별하고, 두 번째 바이트인 E0h는 두 피연산자가 모두 레지스터이고, 소스는 AH이며, 목적지는 AL임을 지정하기 위해 인코딩(비트 필드 3개 포함)된다.

동일한 니모닉이 둘 이상의 이진 명령을 나타낼 수 있는 이와 같은 경우, 조립자는 피연산자를 검사하여 어떤 명령을 생성할지 결정한다.첫 번째 예에서 피연산자는61h유효한 16진수 숫자 상수이며 유효한 레지스터 이름이 아니므로B0지침이 적용될 수 있다.두 번째 예제에서 피연산자는AH유효한 레지스터 이름이며 유효한 숫자 상수(십진수, 십진수, 팔진수 또는 이진수)가 아니므로88지침이 적용될 수 있다.

조립 언어는 항상 이러한 종류의 모호성이 그들의 구문에 의해 보편적으로 시행되도록 설계된다.예를 들어 Intel x86 어셈블리 언어에서 16진수 상수는 숫자부터 시작해야 16진수 'A'(십진수 10과 같음)가 다음과 같이 기록된다.0Ah또는0AH, 아니다.AH, 특히 그것이 레지스터 AH의 이름처럼 보이지 않도록 하기 위하여. (동일한 규칙은 또한 사용자 정의 기호는 물론, BH, CH, DH의 이름으로도 모호성을 방지하며, 문자 H로 끝나며, 그 밖에 "BEACH"와 같이 16진수의 문자만 포함하고 있다.)

x86 opcode 10110000 중 원래 예시로 돌아가기 (B0)은 8비트 값을 AL 레지스터 10110001에 복사한다.B1)은 CL 및 10110010으로 이동한다(B2)는 DL에 해당된다. 이들에 대한 조립 언어 예는 다음과 같다.[17]

MOV AL, 1시간        ; 즉시 값 1로 AL 로드 MOV CL, 2시간        ; 즉시 값 2로 CL 로드 MOV DL, 3시간        ; DL 로드 즉시 값 3 

MOV의 구문도 다음의 예에서 알 수 있듯이 더욱 복잡할 수 있다.[18]

MOV EAX, [EBX]   ; EBX에 포함된 주소의 메모리에 있는 4바이트를 EAX로 이동 MOV [ESI+EAX], CL ; 주소 ESI+EAX의 바이트로 CL 내용 이동 MOV DS, DX        ; DX의 내용을 세그먼트 레지스터 DS로 이동 

각각의 경우 MOV 니모닉은 조립자에 의해 opcode 88-8C, 8E, A0-A3, B0-BF, C6 또는 C7 중 하나로 직접 번역되며, 프로그래머는 보통 어느 것을 알거나 기억할 필요가 없다.[17]

조립 언어를 기계 코드로 변환하는 것은 조립자의 일이며, 그 반대는 적어도 분해자가 부분적으로 달성할 수 있다.고수준 언어와 달리, 많은 간단한 조립 문구와 기계 언어 지침 사이에는 일대일 일치성이 있다.그러나 어떤 경우에는 조립자가 일반적으로 필요한 기능을 제공하기 위해 여러 기계 언어 지침으로 확장되는 의사지시(본질적으로 매크로)를 제공할 수 있다.예를 들어, "보다 크거나 같은 경우 분지" 명령이 없는 기계의 경우, 조립자는 기계의 "보다 작을 경우 분지", "0일 경우 분지"(설정 지침 결과에 따라 분지)로 확장되는 유사 분지를 제공할 수 있다.또한 대부분의 완전한 기능을 갖춘 조립자는 공급업체와 프로그래머가 보다 복잡한 코드와 데이터 시퀀스를 생성하기 위해 사용하는 풍부한 매크로 언어(아래 설명)를 제공한다.조립자 환경에 정의된 유사 지침과 매크로에 대한 정보가 오브젝트 프로그램에 존재하지 않기 때문에, 분해자는 매크로 및 유사 계측의 개시를 재구성할 수 없고 조립자가 그러한 추상적인 조립 언어 실체로부터 생성한 실제 기계 지시사항만 분해할 수 있다.마찬가지로 어셈블리 언어 소스 파일의 코멘트는 어셈블러에 의해 무시되고 그것이 생성하는 객체 코드에 영향을 미치지 않기 때문에, 분해자는 항상 소스 코멘트를 완전히 복구할 수 없다.

각각의 컴퓨터 구조는 고유의 기계 언어를 가지고 있다.컴퓨터는 지원하는 작업 수와 유형, 레지스터 크기와 개수의 차이, 저장소의 데이터 표현 등에서 차이가 있다.대부분의 범용 컴퓨터는 본질적으로 동일한 기능을 수행할 수 있지만, 그렇게 하는 방법은 다르다; 해당 어셈블리 언어는 이러한 차이를 반영한다.

일반적으로 다른 조립자 프로그램에서 인스턴스화된 단일 명령 집합에 대해 여러 집합의 연상기호 또는 조립 언어 구문이 존재할 수 있다.이러한 경우에 가장 인기 있는 것은 보통 CPU 제조자가 공급하고 설명서에 사용하는 것이다.

서로 다른 두 세트의 니모닉을 가진 CPU의 두 가지 예로는 인텔 8080 제품군과 인텔 8086/8088이 있다.인텔이 자사의 조립 언어 니모닉(최소한 1970년대와 1980년대 초에 발행된 문서의 각 페이지에)에 대한 저작권을 주장했기 때문에, 인텔 명령어 집합과 호환되는 CPU를 독립적으로 생산한 일부 회사가 니모닉을 자체 발명했다.Zilog Z80 CPU는 Intel 8080A의 개량형으로 8080A의 모든 명령어와 더 많은 것을 지원한다; Zilog는 새로운 명령뿐만 아니라 모든 8080A 명령어에 대해서도 완전히 새로운 어셈블리 언어를 발명했다.예를 들어 인텔이 다양한 데이터 전송 지시사항에 monemonics MOV, MVI, LDA, STA, LXI, LDAX, STAX, LHLD, SHLD를 사용하는 경우 Z80 어셈블리 언어는 그 모두에 대해 m네모닉 LD를 사용한다.NEC V20V30 CPU도 비슷한 경우로, 각각 Intel 8086과 8088의 강화된 복사본이다.자일 로그는 Z80과 마찬가지로 함께, NEC모든 8086과 8088지침의 인텔의 저작권 침해의 비난을 피할 것이다.(그것은 그러한 저작권 유효할 수 있고, AMD[nb 5]과 사이릭스 같은 나중에 CPU회사도 허가를 가지고 인텔의 x86/IA-32 명령한 연상 기호 암기 법 republished 의심스럽다 n. 새로운 연상 기호 암기 법을 발명했다또는 내가egal 벌칙)실제로 V20과 V30을 프로그래밍한 많은 사람들이 실제로 Intel이 아닌 NEC의 어셈블리 언어로 작성했는지 의심스럽다; 동일한 명령 집합 아키텍처에 대한 두 개의 어셈블리 언어는 이형성이기 때문에(영어 및 Pig Latin과 유사하게), 제조자가 발행한 어셈블리 언어를 사용할 필요가 없다.e 해당 제조업체의 제품과 함께.

언어 디자인

기본요소

조립자의 저자들이 진술서를 분류하는 방식과 그들이 사용하는 명명법에는 많은 다양성이 있다.특히 기계 니모닉이나 확장 니모닉 이외의 것은 사이비 수술(시비도-op)이라고 기술하는 사람도 있다.일반적인 어셈블리 언어는 프로그램 작동을 정의하는 데 사용되는 세 가지 유형의 명령문으로 구성된다.

  • 오코드 연상기호
  • 데이터 정의
  • 조립 지시서

Opcode 니모닉 및 확장 니모닉

조립 언어의 지시사항(설명서)은 높은 수준의 언어와 달리 일반적으로 매우 간단하다.일반적으로 니모닉은 단일 실행 가능한 기계 언어 명령(opcode)의 상징적인 이름이며, 각 기계 언어 명령마다 적어도 하나의 opcode 니모닉이 정의되어 있다.각 지침은 일반적으로 작동 또는 opcode + 0 이상의 피연산자로 구성된다.대부분의 지침은 단일 값 또는 한 쌍의 값을 가리킨다.피연산자는 즉시(지시 자체에서 코드화된 값), 지시나 묵시적인 레지스터 또는 저장소의 다른 곳에 위치한 데이터 주소를 지정할 수 있다.이것은 기본 프로세서 아키텍처에 의해 결정된다: 조립자는 단지 이 아키텍처가 어떻게 작동하는지 반영할 뿐이다.확장 니모닉은 종종 특정 피연산자와 opcode의 조합을 지정하는 데 사용된다(예: 시스템/360 조립자 사용).B의 확장된 연상기호로서.BC15의 마스크로NOP("OPERATION 없음" – 한 단계 동안 아무 것도 수행하지 않음)BC0의 가면을 쓰고

확장 연상법은 종종 지시의 전문적 사용을 지원하기 위해 사용되며, 종종 지시 이름에서 명확하지 않은 목적을 위해 사용된다.예를 들어, 많은 CPU에는 명시적인 NOP 지침이 없지만 목적을 위해 사용할 수 있는 지침이 있다.8086 CPU의 명령xchg ax,ax을 위해 사용된다.nop, 와 함께.nop지시를 인코딩하는 사이비-opcode가 되는 것xchg ax,ax몇몇 분해자들은 이것을 인식하고, 그것을 해독할 것이다.xchg ax,ax로서의 가르침.nop마찬가지로, System/360System/370용 IBM 조립자는 확장된 니모닉을 사용한다.NOP그리고NOPR을 위해BC그리고BCR마스크가 전혀 없는SPARC 아키텍처의 경우, 이것들은 합성 지침으로 알려져 있다.[19]

또한 일부 조립자는 두 개 이상의 기계 지침을 생성하는 간단한 내장 매크로 지침을 지원한다.예를 들어, 일부 Z80 조립자와 함께 이 지침은ld hl,bc생성되는 것으로 인식됨ld l,c그 뒤를 이어ld h,b.[20] 이것들은 때때로 사이비-옵코드라고 알려져 있다.

니모닉은 임의의 기호다. 1985년 IEEE는 모든 조립자가 사용하는 균일한 니모닉 세트를 위해 표준 694를 발행했다.그 이후 그 기준은 철회되었다.

데이터 지시사항

데이터와 변수를 보유하기 위한 데이터 요소를 정의하는 데 사용되는 지침이 있다.그들은 데이터의 유형, 길이 및 정렬을 정의한다.또한 이 지침은 데이터를 외부 프로그램(별도로 조립된 프로그램)에 사용할 수 있는지 또는 데이터 섹션이 정의된 프로그램에만 사용할 수 있는지 여부를 정의할 수 있다.어떤 조립자들은 이것을 사이비 오프로 분류한다.

조립 지시서

의사-옵코드, 의사-작동 또는 의사-작동이라고도 불리는 조립 지시어는 조립자에게 "조립 지시 이외의 작업을 수행하도록 지시"[14]하는 명령이다.지시문은 조립자의 작동 방식에 영향을 미치며 "물체 코드, 기호 표, 목록 파일 및 내부 조립자 매개변수 값에 영향을 미칠 수 있다"고 한다.때때로 의사-opcode라는 용어는 데이터를 생성하는 것과 같이 객체 코드를 생성하는 지시어를 위해 사용된다.[21]

사이비 ops의 이름은 기계 명령과 구별하기 위해 점으로 시작하는 경우가 많다.사이비-ops는 프로그램의 조립을 프로그래머가 입력하는 파라미터에 의존하게 만들 수 있으므로, 하나의 프로그램이 다른 방식으로, 아마도 다른 어플리케이션에 대해 조립될 수 있다.또는, 사이비-op은 읽기 쉽고 유지보수가 쉽도록 프로그램의 발표를 조작하는 데 사용될 수 있다.의사-ops의 또 다른 일반적인 용도는 런타임 데이터를 위해 저장 영역을 예약하고 선택적으로 그 내용을 알려진 값으로 초기화하는 것이다.

심볼 조립자는 프로그래머가 임의의 이름(라벨 또는 기호)을 메모리 위치 및 다양한 상수와 연결할 수 있도록 한다.일반적으로 모든 상수 및 변수에 이름이 부여되어 지침이 이름별로 해당 위치를 참조할 수 있으므로 자체 문서 코드를 홍보할 수 있다.실행 가능한 코드에서, 각 서브루틴의 이름은 그것의 진입점과 연관되어 있기 때문에 서브루틴에 대한 모든 호출은 그것의 이름을 사용할 수 있다.서브루틴 내부에는 GOTO 목적지에 라벨이 부여된다.일부 조립자는 보통 기호와는 어휘적으로 구별되는 지역 기호(예: "10$"를 GOTO 목적지로 사용)를 지원한다.

NASM과 같은 일부 조립자는 프로그래머가 서로 다른 네임스페이스를 관리할 수 있도록 하고, 데이터 구조 내에서 오프셋을 자동으로 계산하며, 조립자에 의해 수행된 리터럴 값이나 간단한 계산 결과를 참조하는 라벨을 할당한다.라벨은 다시 연결 가능한 주소를 가진 상수와 변수를 초기화하는 데도 사용될 수 있다.

대부분의 다른 컴퓨터 언어와 마찬가지로 어셈블리 언어도 어셈블리 중 무시되는 프로그램 소스 코드에 주석을 추가할 수 있다.조립 언어 프로그램에서 신중한 논평은 필수적이다. 왜냐하면 일련의 이진 기계 명령의 의미와 목적은 결정하기 어려울 수 있기 때문이다.컴파일러 또는 분해자가 생성하는 "원시(원시)" 조립 언어는 변경해야 할 때 읽기가 상당히 어렵다.

매크로스

많은 조립자는 미리 정의된 매크로를 지원하며, 다른 조립자는 변수와 상수가 내장된 텍스트 라인의 시퀀스를 포함하는 프로그래머 정의(그리고 반복적으로 다시 정의 가능) 매크로를 지원한다.매크로 정의는 일반적으로[nb 6] 조립자 문(예: 지시문, 기호 기계 지침 및 조립자 문용 템플릿)을 혼합한 것이다.이 텍스트 라인의 순서는 opcode 또는 지시문을 포함할 수 있다.일단 매크로가 정의되면 그 이름을 니모닉 대신 사용할 수 있다.조립자가 그러한 문장을 처리할 때, 그것은 그 매크로와 관련된 텍스트 라인으로 문을 대체한 다음, 마치 소스 코드 파일에 존재하는 것처럼 처리한다(일부 조립자에서는 대체 텍스트에 존재하는 매크로의 확장을 포함한다).이러한 의미에서 매크로는 1950년대의 IBM 오토코더에 기인한다.[22][nb 7]

매크로 조립자는 일반적으로 매크로 정의, 변수 정의, 산술, 논리 또는 문자열 식 결과에 대한 변수 설정, 반복, 조건부 코드 생성 등의 지시사항을 가진다.그러한 지침의 일부는 매크로 정의 내에서, 예를 들어 HLASM에서는 MEXIT, 즉 개방 코드(외부 매크로 정의), 예를 들어 HLASM에서는 AIFCopy가 허용될 수 있다.

조립 언어에서, "매크로"라는 용어는 그것이 C 프로그래밍 언어의 전처리장치와 같은 다른 맥락에서 하는 것보다 더 포괄적인 개념을 나타낸다. 여기서 그것의 #define 지시어는 일반적으로 짧은 단일 라인 매크로를 만드는 데 사용된다.PL/I 및 일부 다른 언어의 매크로와 같은 조립자 매크로 지침은 조립자 스스로 장황한 "프로그램"이 될 수 있으며, 조립 중 조립자에 의한 해석에 의해 실행될 수 있다.

매크로는 '짧은' 이름을 가질 수 있지만 몇 개 또는 실제로 많은 코드 행으로 확장될 수 있기 때문에, 그것들은 조립 언어 프로그램이 훨씬 더 짧은 것처럼 보이도록 하는데 사용될 수 있고, 더 높은 수준의 언어와 같이 소스코드의 행을 더 적게 필요로 한다.그것들은 또한 조립 프로그램에 더 높은 수준의 구조를 추가하는 데 사용될 수 있고 선택적으로 매개 변수 및 기타 유사한 기능을 통해 내장된 디버깅 코드를 도입할 수 있다.

매크로 조립자는 종종 매크로가 매개 변수를 취하도록 허용한다.어떤 조립자는 선택적 파라미터, 기호 변수, 조건, 문자열 조작, 산술 연산과 같은 고급 언어 요소를 통합하고, 주어진 매크로 실행 중에 모두 사용할 수 있으며, 매크로가 컨텍스트나 정보 교환을 저장할 수 있도록 하는 상당히 정교한 매크로 언어를 포함한다.따라서 매크로에서는 매크로 인수에 기초하여 수많은 어셈블리 언어 명령이나 데이터 정의를 생성할 수 있다.예를 들어, 이것은 기록형 데이터 구조나 "연속되지 않은" 루프를 생성하는 데 사용될 수도 있고, 복잡한 매개변수에 기초하여 전체 알고리즘을 생성할 수도 있다.예를 들어, "정렬" 매크로는 규격을 해석하는 일반 절차에 필요한 런타임 테스트를 필요로 하지 않고 복잡한 정렬 키의 사양을 승인하고 특정 키에 대해 조작된 코드를 생성할 수 있다.그러한 프로그래머들이 컴퓨터의 최저 수준의 개념적 요소들을 가지고 작업하지 않기 때문에, 그러한 매크로 제품군을 사용하여 크게 확장된 조립 언어를 사용하는 조직은 더 높은 수준의 언어로 작업하고 있는 것으로 간주될 수 있다.이 점을 밑줄친다면, 매크로는 가상 머신의 조립 언어인 SIL(Globstol Implementation Language)에 쓰여진 GROPTOL4(1967년)의 초기 가상 머신을 구현하는 데 사용되었다.대상 기계는 매크로 조립자를 사용하여 이를 네이티브 코드로 변환할 것이다.[23]이것은 그 당시 높은 수준의 휴대성을 허용했다.

매크로는 메인프레임 시대의 특정 고객에 대한 대규모 소프트웨어 시스템을 커스터마이징하는 데 사용되었고, 고객 담당자가 특정 버전의 제조업체 운영 체제를 만들어 고용주의 요구를 충족시키는 데 사용하기도 했다.예를 들어, IBM의 대화 모니터 시스템/가상 머신(VM/CMS) 및 IBM의 "실시간 트랜잭션 처리" 추가 기능, 고객 정보 제어 시스템 CICS, 그리고 1970년대에 시작되었지만 여전히 많은 대형 컴퓨터 예약 시스템을 운영하는 항공사/금융 시스템인 ACP/TPF와 함께 작업하는 시스템 프로그래머에 의해 수행되었다.(CRS) 및 신용카드 시스템.

조립자에게 임의 코드를 생성하도록 지시하는 조립 시간 운영자에게 지시하는 COBOL 코드 라인이 포함된 순수한 매크로 조립자 프로그램을 사용하여 COBOL에서 프로그램 버전을 생성하는 등 완전히 다른 언어로 작성된 코드를 생성하는 조립자의 매크로 처리 능력만을 사용할 수도 있다.IBM OS/360은 매크로를 사용하여 시스템 생성을 수행한다.사용자는 일련의 조립자 매크로를 코딩하여 옵션을 지정한다.이러한 매크로를 조립하면 작업 제어 언어유틸리티 제어 문구를 포함하여 시스템을 구축하기 위한 작업 스트림이 생성된다.

1960년대에 실현된 바와 같이, 「매크로 프로세싱」의 개념은 「조립」의 개념과는 무관하며, 전자는 객체 코드를 생성하는 것보다 현대적인 용어로 워드 프로세싱, 텍스트 프로세싱이 더 많기 때문이다.매크로 프로세싱의 개념은 변수를 설정하기 위해 "프로세서 명령서"를 지원하고 그 값에 대한 조건부 테스트를 하는 C 프로그래밍 언어에 나타나며 나타난다.조립자 내부의 특정 매크로 프로세서와 달리, C 전처리는 루프 또는 "이동" 기능이 부족하기 때문에 튜링-완전하지 않으며, 후자는 프로그램을 루프할 수 있다.

매크로 처리의 힘에도 불구하고, 조립자의 다년생으로 남아 있는 가운데, 많은 고급 언어(주요 예외는 C, C++, PL/I)에서 불용화되었다.

매크로 매개변수 대체는 엄격히 이름에 의해 이루어진다. 매크로 처리 시 매개변수 값은 그 이름을 텍스트로 대체한다.그 결과 가장 유명한 버그 종류는 매크로 작성자가 이름을 기대했을 때 단순한 이름이 아닌 표현인 파라미터를 사용한 것이다.매크로에서:

foo: 매크로 로드 a*b

발신자가 변수의 이름을 제공하고, "글로벌" 변수 또는 상수 b를 사용하여 "a"를 곱하는 것이 의도였다.매개 변수를 사용하여 foo를 호출하는 경우a-c, 매크로 확장load a-c*b일어나다가능한 모호성을 방지하기 위해 매크로 프로세서 사용자는 매크로 정의 내에서 형식 매개변수를 괄호화하거나 호출자가 입력 매개변수를 괄호화 할 수 있다.[24]

구조화 프로그래밍 지원

실행 흐름을 인코딩하는 구조화된 프로그래밍 요소를 제공하는 매크로 패키지가 작성되었다.이 접근방식의 초기 예는 원래 할란 밀스가 제안했던 개념-14 매크로 세트(1970년 3월)이며 IBM의 연방 시스템 부서의 [25]마빈 케슬러가 구현한 것으로, 이 매크로 세트에서는 IF/ELSE/ENDIF 및 OS/360 조립자 프로그램에 대해 유사한 제어 흐름 블록을 제공했다.이는 조립 언어의 스파게티 코드를 유발하는 주요 요인 중 하나인 조립 코드의 GOTO 작업 사용을 줄이거나 제거하는 방법이었다.이러한 접근방식은 1980년대 초반(대규모 조립언어 사용 후기)에 널리 받아들여졌다.IBM의 High Level Assembler Toolkit에는[26] 이러한 매크로 패키지가 포함되어 있다.

호기심 많은 디자인은 8080/Z80을 위한 "스트림 지향적인" 조립자, 화이트스미스사의 프로세서[citation needed](유닉스 유사 이드리스 운영체제의 개발자, 최초의 상용 C 컴파일러라고 보고된 것)이다.이 언어는 opcode, 레지스터, 메모리 레퍼런스 등의 원시 기계 요소와 함께 작동했기 때문에 조립자로 분류되었지만, 실행 순서를 나타내기 위해 표현 구문을 통합했다.괄호 및 기타 특수 기호는 블록 지향 구조 프로그래밍 구조와 함께 생성된 명령의 순서를 제어했다.A-natural은 핸드코딩이 아닌 C 컴파일러의 오브젝트 언어로 제작되었지만, 그것의 논리적 구문은 일부 팬들을 얻었다.

대규모 조립 언어 개발의 쇠퇴 이후 보다 정교한 조립자에 대한 분명한 수요는 거의 없었다.[27]그럼에도 불구하고, 그것들은 여전히 개발되고 적용되고 있으며, 대상 시스템의 구조에 있어서의 자원 제약이나 특성으로 인해 상위 언어의 효과적인 이용을 방해하는 경우에 적용되고 있다.[28]

강력한 매크로 엔진을 가진 조립자는 Masm32 패키지와 함께 제공되는 스위치 매크로와 같은 매크로를 통한 구조화된 프로그래밍을 허용한다(이 코드는 완전한 프로그램이다).

포함시키다 \masm32\포함시키다\masm32rt.inc. ; Masm32 라이브러리 사용  .code 데모마인:   반복 20  바꾸다 rv(난도질하다, 9) ; 0에서 8 사이의 숫자 생성  영화를 찍다 ecx, 7  케이스 0   인쇄하다 "사례 0"  케이스 ecx    ; 대부분의 다른 프로그래밍 언어와 대조적으로,   인쇄하다 "케이스 7"  ; Masm32 스위치는 "변수 케이스"를 허용한다.  케이스 1 .. 3   .if 이삭스==1    인쇄하다 "사례 1"   .elseif 이삭스==2    인쇄하다 "사례 2"   .cs    인쇄하다 "사례 1~3: 기타"   .endif  케이스 4, 6, 8   인쇄하다 "4번 케이스, 6번 케이스 또는 8번 케이스  체납   영화를 찍다 이벡스, 19       ; 별 20개 인쇄   .repeat    인쇄하다 "*"    을 결정하다 이벡스   .Will SIgn?   ; 기호 플래그가 설정될 때까지 반복  끝이 나다  인쇄하다 chr$(13, 10)   ENDM   퇴장하다 종지부를 찍다 반신반의하다 

어셈블리 언어 사용

역사적 관점

저장 프로그램 컴퓨터가 도입되었을 당시에는 어셈블리 언어를 사용할 수 없었다.캐슬린 부스는 1947년 런던 버크벡에서 수학자 존 폰 노이만, 물리학자 허먼 골드스틴과 함께 ARC2를 연구하면서 이론적인 연구를 바탕으로 "조립 언어를 창안한 공로를 인정받고 있다"[29][30]고 말했다.[30][31]

1948년 말, EDSAC(Electronic Delay Storage Automatic Calculator)는 자사의 부트스트랩 프로그램에 조립자(이름 "초기 주문서")를 통합했다.IEEE 컴퓨터 소사이어티가 최초의 "조립자"[14][32][33]를 만든 사람으로 인정받는 데이비드 휠러가 개발한 한 글자 연상학을 사용했다.EDSAC에 관한 보고서에서는 분야를 명령어로 결합하는 과정에 대해 "조립"이라는 용어를 도입했다.[34]SOAP(Symbolic Optimal Assembly Program)는 1955년 스탠 폴리에 의해 작성된 IBM 650 컴퓨터의 조립 언어였다.[35]

조립 언어는 초기 컴퓨터에 필요한 오류 발생 가능성이 높고 지루하며 시간이 많이 걸리는 1세대 프로그래밍을 많이 제거하여 프로그래머들이 숫자 코드를 기억하고 주소를 계산하는 것과 같은 테디움에서 벗어나게 한다.그것들은 한때 모든 종류의 프로그래밍에 널리 사용되었다.그러나, 1950년대 후반까지,[citation needed] 그들의 사용은 프로그램 생산성의 향상을 찾는 데 있어서 상위 언어에 의해 대체되었다.오늘날 조립 언어는 직접 하드웨어 조작, 전문 프로세서 지침 액세스 또는 중요한 성능 문제를 해결하기 위해 여전히 사용된다.[36]대표적인 용도는 장치 드라이버, 저수준 임베디드 시스템실시간 시스템이다 현재 사용법 참조).

역사적으로, 수많은 프로그램들이 전적으로 어셈블리 언어로 작성되었다.버러우스 MCP(1961년)는 운영체제가 완전히 조립 언어로 개발되지 않은 최초의 컴퓨터였다. 이 컴퓨터는 알골 방언인 ESPOL(Envious Systems Problem Oriented Language)으로 쓰여졌다.대기업이 작성한 IBM 메인프레임 소프트웨어를 포함한 많은 상업용 애플리케이션도 어셈블리 언어로 작성되었다.COBOL, FORTRAN 및 일부 PL/I는 1990년대까지 조립 언어 애플리케이션 인프라를 유지했지만 결국 이 작업의 상당 부분을 대체했다.

대부분의 초기 마이크로컴퓨터는 대부분의 운영 체제와 대형 응용프로그램을 포함하여 손으로 코딩된 조립 언어에 의존했다.왜냐하면 이러한 시스템들은 심각한 자원 제약이 있었고, 독특한 메모리와 디스플레이 아키텍처를 강요했으며, 제한된 버기 시스템 서비스를 제공했기 때문이다.아마도 더 중요한 것은 마이크로 컴퓨터 사용에 적합한 1급 고급 언어 컴파일러의 부족일 것이다.1세대 마이크로컴퓨터 프로그래머들은 취미 생활자, "와이어와 플라이어" 태도를 유지했다는 심리적 요인 또한 작용했을 수 있다.

좀 더 상업적인 맥락에서 조립 언어를 사용하는 가장 큰 이유는 최소한의 팽창(크기), 최소한의 오버헤드, 더 큰 속도, 그리고 신뢰성이었다.

이때부터 대규모 조립 언어 프로그램의 대표적인 예로는 IBM PC DOS 운영 체제, Turbo Pascal 컴파일러 및 스프레드시트 프로그램 Lotus 1-2-3과 같은 초기 응용 프로그램이 있다.조립 언어는 게임을 개발하고 프로그래밍하는 것으로 악명 높은 콘솔인 세가 새턴에서 최고의 성능을 얻기 위해 사용되었다.[37]1993년 아케이드 게임 NBA 잼도 그 예다.

어셈블리 언어는 1980년대와 1990년대의 많은 인기 있는 가정용 컴퓨터(MSX, 싱클레어 ZX 스펙트럼, 코모도어 64, 아미가, 아타리 ST 등)의 주요 발전 언어였다.이는 이러한 시스템의 BASIC 사투리를 해석하면 실행 속도가 불충분할 뿐 아니라 이러한 시스템에서 사용 가능한 하드웨어를 최대한 활용할 수 있는 설비가 불충분했기 때문에 상당부분이 그러했다.일부 시스템은 고도로 발전된 디버깅과 매크로 설비를 갖춘 통합 개발 환경(IDE)까지 갖추고 있다.Radio Shack TRS-80에 사용할 수 있는 일부 컴파일러와 그 후속작들은 인라인 어셈블리 소스를 높은 수준의 프로그램 설명서와 결합할 수 있는 능력을 가지고 있었다.컴파일 즉시 내장 조립자가 인라인 머신 코드를 생성했다.

현재 사용량

수준 높은 언어에 비해 어셈블리 언어의 유용성과 성능에 대한 논쟁은 항상[38] 있어왔다.

어셈블리 언어가 중요한 곳에 특정한 틈새 사용을 가지고 있지만(아래 참조), 최적화를 위한 다른 도구가 있다.[39]

2017년 7월 현재 프로그래밍 언어 인기의 TIOBE 지수는 어셈블리 언어를 11로, 예를 들어 비주얼 베이직보다 앞선다.[40]조립자는 속도를 최적화하거나 크기를 최적화하는데 사용될 수 있다.속도 최적화의 경우, 현대의 최적화 컴파일러는 찾을 수 있는 반례에도 불구하고 높은 수준의 언어를 수기 조립체만큼 빨리 실행할 수 있는 코드로 렌더링한다고 주장한다[41].[42][43][44]현대 프로세서와 메모리 하위 시스템의 복잡성으로 인해 어셈블리 프로그래머뿐만 아니라 컴파일러에게도 효과적인 최적화가 점점 더 어려워지고 있다.[45][46]더욱이 프로세서 성능이 향상된다는 것은 대부분의 CPU가 대부분의 시간을 유휴 상태로 두고 캐시 누락, I/O 작업 및 페이징과 같은 예측 가능한 병목 현상으로 인해 지연이 발생한다는 것을 의미한다.[47]이것은 많은 프로그래머들에게 원시 코드 실행 속도를 문제 삼지 않게 만들었다.

개발자가 조립 언어를 사용할 수 있는 몇 가지 상황이 있다.

  • 아타리 2600, 코모도어 64, 그래핀 계산기 등 고급 언어 옵션이 제한된 구형 프로세서[clarification needed] 장착된 시스템의 코드 작성.[48]1970년대와 1980년대의 이러한 컴퓨터들을 위한 프로그램들은 종종 데모센이나 리트로깅 하위 문화의 맥락에서 쓰여진다.
  • 예를 들어 장치 드라이버인터럽트 핸들러에서 하드웨어와 직접 상호 작용해야 하는 코드.
  • 임베디드 프로세서나 DSP에서, 고반복 인터럽트는 초당 1000회 또는 10000회 발생하는 인터럽트와 같이 인터럽트당 사이클의 최단 횟수가 필요하다.
  • 컴파일러에서 구현되지 않은 프로세서별 지침을 사용해야 하는 프로그램.일반적인 예는 바이트의 패리티나 추가의 4비트 캐리어에 대한 쿼리뿐만 아니라 많은 암호화 알고리즘의 핵심에 있는 비트 회전 명령이다.
  • 높은 수준의 언어와 연관된 런타임 구성요소 또는 라이브러리에 의지하지 않고 실행해야 하는 소형 크기의 독립 실행형 실행 파일이 필요하다.예를 들어 전화, 자동차 연료 및 점화 시스템, 에어컨 제어 시스템, 보안 시스템 및 센서의 펌웨어가 포함된다.
  • 높은 수준의 언어로 달성하기 어려운 최적화 기회를 제공하는 조립 언어가 있는 성능에 민감한 내부 루프가 있는 프로그램.예를 들어, BLAS[42][49] 또는 이산 코사인 변환을 사용한 선형 대수학([50]: x264의 SIMD 어셈블리 버전)
  • C와 같은 상위 언어의 프로그램에 대해 벡터화된 함수를 생성하는 프로그램.상위 언어에서 이것은 때때로 SIMD 니모닉에 직접 매핑되는 컴파일러 내적 함수에 의해 지원되지만, 그럼에도 불구하고 주어진 벡터 프로세서에 특정한 일대일 어셈블리 변환을 초래한다.
  • 시뮬레이션, 비행 항법 시스템 및 의료 장비와 같은 실시간 프로그램.예를 들어, 플라이 바이 와이어 시스템에서 원격 측정은 엄격한 시간 제약 내에서 해석되고 실행되어야 한다.이러한 시스템은 (일부) 해석 언어, 자동 가비지 수집, 호출 작업 또는 선제적 멀티태스킹에 의해 생성될 수 있는 예측할 수 없는 지연의 원인을 제거해야 한다.그러나 일부 상위 언어에는 이러한 지연을 도입할 수 있는 런타임 구성요소 및 운영 체제 인터페이스가 통합되어 있다.그러한 시스템에 대한 조립 언어 또는 하위 수준 언어를 선택하면 프로그래머들이 처리 세부사항에 대한 가시성과 제어력을 높일 수 있다.
  • 항상 같은 시간을 엄격하게 적용하여 타이밍 공격을 방지해야 하는 암호화 알고리즘.
  • IBM 메인프레임 컴퓨터를 위해 작성된 레거시 코드 수정 [51][52]및 확장
  • 아무것도 당연하게 여겨질 수 없는 극도로 높은 보안 상황에서 환경에 대한 완전한 통제가 요구되는 상황.
  • 컴퓨터 바이러스, 부트 로더, 특정 장치 드라이버 또는 하드웨어 또는 로우 레벨 운영 체제에 매우 가까운 기타 항목.
  • 추가 오버헤드가 최소로 유지되는 경우 모니터링, 추적 및 디버깅을 위한 명령 집합 시뮬레이터.
  • 교차 컴파일러를 사용할 수 없는 새 프로세서 또는 전문 프로세서에서 고급 언어가 존재하지 않는 상황.
  • 다음과 같은 프로그램 파일 역설계 및 수정:
    • 예를 들어, 소스코드를 사용할 수 없거나 분실된 프로그램을 재생성하려고 하거나 독점 소프트웨어의 복사 방지를 크래킹하는 경우 등, 원래 높은 수준의 언어로 작성되었을 수도 있고 그렇지 않았을 수도 있는 기존 이진 파일.
    • 비디오 게임(ROM 해킹이라고도 함)은 여러 가지 방법을 통해 가능하다.가장 널리 사용되는 방법은 조립 언어 수준에서 프로그램 코드를 변경하는 것이다.

어셈블리 언어는 여전히 대부분의 컴퓨터 과학전자 공학 프로그램에서 가르치고 있다.오늘날에는 비록 소수의 프로그래머들이 정기적으로 조립 언어를 도구로 사용하지만, 기본적인 개념은 여전히 중요하다.이진 산술, 메모리 할당, 스택 처리, 문자 집합 인코딩, 인터럽트 처리, 컴파일러 설계와 같은 기본적인 주제들은 컴퓨터가 하드웨어 수준에서 어떻게 작동하는지 파악하지 않고는 상세하게 연구하기 어려울 것이다.컴퓨터의 행동은 그것의 명령 집합에 의해 근본적으로 정의되기 때문에, 그러한 개념을 배우는 논리적인 방법은 조립 언어를 공부하는 것이다.대부분의 현대 컴퓨터들은 유사한 명령어 세트를 가지고 있다.따라서 단일 어셈블리 언어를 공부하는 것으로는 다음을 배우기에 충분하다.I) 기본 개념, II) 조립 언어의 사용이 적절할 수 있는 상황을 인식하는 것, III) 고수준 언어로부터 얼마나 효율적인 실행 코드가 생성될 수 있는지를 확인하는 것.[16]

일반적인 애플리케이션

  • 어셈블리 언어는 일반적으로 시스템의 부팅 코드, 즉 운영 체제를 부팅하기 전에 시스템 하드웨어를 초기화하고 테스트하는 로우 레벨 코드에 사용되며 ROM에 저장되는 경우가 많다(IBM 호환 PC 시스템 및 CP/M의 BIOS가 예시).
  • 조립 언어는 예를 들어 운영 체제 커널과 같은 낮은 수준의 코드에 자주 사용되는데, 이 커널은 기존의 시스템 호출의 가용성에 의존할 수 없으며 실제로 시스템이 실행될 특정 프로세서 아키텍처에 대해 이를 구현해야 한다.
  • 일부 컴파일러는 완전 컴파일 전에 높은 수준의 언어를 먼저 어셈블리로 변환하여 어셈블리 코드를 디버깅 및 최적화 목적으로 볼 수 있게 한다.
  • 파스칼이나 C와 같이 비교적 낮은 수준의 언어에 대한 컴파일러는 프로그래머가 직접 소스코드(인라인 어셈블리)에 어셈블리 언어를 내장할 수 있게 한다.그런 다음 이러한 설비를 사용하는 프로그램은 각 하드웨어 플랫폼에 서로 다른 어셈블리 언어를 사용하여 추상화를 구축할 수 있다.그러면 시스템의 휴대용 코드는 균일한 인터페이스를 통해 이러한 프로세서별 구성품을 사용할 수 있다.
  • 조립언어는 역공학에서 유용하다.많은 프로그램들은 분해자가 조립 언어로 번역하기 쉽지만 디컴파일러를 통해 더 높은 수준의 언어로 번역하기 어려운 기계코드 형태로만 배포된다.인터랙티브 디스어셈블러와 같은 도구는 그러한 목적을 위해 해체를 광범위하게 사용한다.이 기술은 해커들이 상용 소프트웨어를 파괴하기 위해, 경쟁업체들로부터 유사한 결과를 얻는 소프트웨어를 생산하기 위해 사용한다.
  • 조립 언어는 특히 처리 능력이 제한된 초기 개인용 컴퓨터 및 RAM에서 실행 속도를 높이기 위해 사용된다.
  • 조립자는 다른 코드에서 사용할 포맷된 코드의 소스 코드에서 높은 수준의 언어 오버헤드 없이 데이터 블록을 생성하는 데 사용할 수 있다.[53][54]

참고 항목

메모들

  1. ^ 메타 어셈블리 제외
  2. ^ 그러나 그렇다고 해서 그러한 언어를 구현하는 조립자 프로그램이 보편적이라는 뜻은 아니다.
  3. ^ 메타어셈블러로 활용돼 사용자가 최소한의 노력으로 자신만의 프로그래밍 언어를 설계하고 해당 언어에 대한 프로세서를 생성할 수 있다.
  4. ^ 이것은 동일한 방식으로 작동하는 이 지침의 두 가지 중복된 형태 중 하나이다.1970년대 후반/80년대 초반의 8086과 그 밖의 여러 CPU는 엔지니어들이 중복 코드를 가진 CPU를 설계하는 것이 (제한된 크기의 실리콘 칩에 적합하도록) 제거하는 것보다 더 간단했기 때문에 명령 집합에 중복이 있다(관리 조건 참조).각 조립자는 일반적으로 2개 이상의 중복 명령어 인코딩 중 하나만 생성하지만, 분해자는 보통 이들 중 하나를 인식한다.
  5. ^ AMD는 2차 소스 Intel 8086, 8088 및 80286 CPU와 8080A 및/또는 8085A CPU를 Intel의 라이센스에 따라 제조했지만, 80386부터 인텔은 x86 CPU 설계를 누구와도 공유하기를 거부했다.AMD는 이에 대해 계약 위반으로 고소했으며, AMD는 인텔의 도움이나 승인 없이 32비트 및 64비트 x86 제품군 CPU를 설계, 제조 및 판매했다.
  6. ^ 7070년 오토코더에서 매크로 정의는 조립자가 호출하는 7070 매크로 제너레이터 프로그램이다. 오토코더는 매크로 제너레이터가 사용할 수 있는 특별한 매크로를 제공한다.
  7. ^ "매크로 지침을 코딩할 때 1401 Autocoder를 사용하는 것과 관련하여 다음과 같은 사소한 제한이나 제한이 적용되고 있다."

참조

  1. ^ a b "Assembler language". High Level Assembler for z/OS & z/VM & z/VSE Language Reference Version 1 Release 6. IBM. 2014 [1990]. SC26-4940-06.
  2. ^ Saxon, James A.; Plette, William S. (1962). Programming the IBM 1401, a self-instructional programmed manual. Englewood Cliffs, New Jersey, USA: Prentice-Hall. LCCN 62-20615. (NB. 용어 어셈블리 프로그램 사용)
  3. ^ Kornelis, A. F. (2010) [2003]. "High Level Assembler – Opcodes overview, Assembler Directives". Archived from the original on 2020-03-24. Retrieved 2020-03-24.
  4. ^ "Macro instructions". High Level Assembler for z/OS & z/VM & z/VSE Language Reference Version 1 Release 6. IBM. 2014 [1990]. SC26-4940-06.
  5. ^ Wilkes, Maurice Vincent; Wheeler, David John; Gill, Stanley J. (1951). The preparation of programs for an electronic digital computer (Reprint 1982 ed.). Tomash Publishers. ISBN 978-0-93822803-5. OCLC 313593586.
  6. ^ Fairhead, Harry (2017-11-16). "History of Computer Languages - The Classical Decade, 1950s". I Programmer. Archived from the original on 2020-01-02. Retrieved 2020-03-06.
  7. ^ "Assembly: Review" (PDF). Computer Science and Engineering. College of Engineering, Ohio State University. 2016. Archived (PDF) from the original on 2020-03-24. Retrieved 2020-03-24.
  8. ^ Archer, Benjamin (November 2016). Assembly Language For Students. North Charleston, South Carolina, USA: CreateSpace Independent Publishing. ISBN 978-1-5403-7071-6. Assembly language may also be called symbolic machine code.
  9. ^ "How do assembly languages depend on operating systems?". Stack Exchange. Stack Exchange Inc. 2011-07-28. Archived from the original on 2020-03-24. Retrieved 2020-03-24. (NB. 시스템 호출은 MVSVSE 대 VM/CMS의 경우, 운영 체제에 따라 2진/실행 가능한 형식도 다를 수 있음)
  10. ^ Daintith, John, ed. (2019). "meta-assembler". A Dictionary of Computing. Archived from the original on 2020-03-24. Retrieved 2020-03-24.
  11. ^ Xerox Data Systems (Oct 1975). Xerox Meta-Symbol Sigma 5-9 Computers Language and Operations Reference Manual (PDF). p. vi. Retrieved 2020-06-07.
  12. ^ Sperry Univac Computer Systems (1977). Sperry Univac Computer Systems Meta-Assembler (MASM) Programmer Reference (PDF). Retrieved 2020-06-07.
  13. ^ "How to Use Inline Assembly Language in C Code". gnu.org. Retrieved 2020-11-05.
  14. ^ a b c d 살로몬, 데이비드[1992년](2월 1993년).캘리포니아 주립 대학교 Northridge, 캘리포니아, 미국. Chivers, 이언 D.(교육.)에 쓰여진.Assemblers과 Loaders(PDF).엘리스 Horwood 시리즈 컴퓨터는, 또 그들의 응용 프로그램(1판).Chicester, 웨스트 서식스 주, 영국:엘리스 Horwood 리미티드/사이먼&슈스터 국제 그룹이다.를 대신하여 서명함. 7, 237–238.아이 에스비엔 0-13-052564-2.그 2020-03-23에 원래에서Archived(PDF)..(xiv+294+4 페이지)2008-10-01 Retrieved
  15. ^ Beck, Leland L. (1996). "2". System Software: An Introduction to Systems Programming. Addison Wesley.
  16. ^ a b Hyde, Randall (September 2003) [1996-09-30]. "Foreword ("Why would anyone learn this stuff?") / Chapter 12 – Classes and Objects". The Art of Assembly Language (2 ed.). No Starch Press. ISBN 1-886411-97-2. Archived from the original on 2010-05-06. Retrieved 2020-06-22. 에라타: [1](928쪽) [2][3]
  17. ^ a b c d Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference (PDF). Vol. 2. Intel Corporation. 1999. Archived from the original (PDF) on 2009-06-11. Retrieved 2010-11-18.
  18. ^ Ferrari, Adam; Batson, Alan; Lack, Mike; Jones, Anita (2018-11-19) [Spring 2006]. Evans, David (ed.). "x86 Assembly Guide". Computer Science CS216: Program and Data Representation. University of Virginia. Archived from the original on 2020-03-24. Retrieved 2010-11-18.
  19. ^ "The SPARC Architecture Manual, Version 8" (PDF). SPARC International. 1992. Archived from the original (PDF) on 2011-12-10. Retrieved 2011-12-10.
  20. ^ Moxham, James (1996). "ZINT Z80 Interpreter". Z80 Op Codes for ZINT. Archived from the original on 2020-03-24. Retrieved 2013-07-21.
  21. ^ Hyde, Randall. "Chapter 8. MASM: Directives & Pseudo-Opcodes" (PDF). The Art of Computer Programming. Archived (PDF) from the original on 2020-03-24. Retrieved 2011-03-19.
  22. ^ Users of 1401 Autocoder. Archived from the original on 2020-03-24. Retrieved 2020-03-24.
  23. ^ Griswold, Ralph E. (1972). "Chapter 1". The Macro Implementation of SNOBOL4. San Francisco, California, USA: W. H. Freeman and Company. ISBN 0-7167-0447-1.
  24. ^ "Macros (C/C++), MSDN Library for Visual Studio 2008". Microsoft Corp. 2012-11-16. Archived from the original on 2020-03-24. Retrieved 2010-06-22.
  25. ^ Kessler, Marvin M. (1970-12-18). "*Concept* Report 14 - Implementation of Macros To Permit Structured Programming in OS/360". MVS Software: Concept 14 Macros. Gaithersburg, Maryland, USA: International Business Machines Corporation. Archived from the original on 2020-03-24. Retrieved 2009-05-25.
  26. ^ "High Level Assembler Toolkit Feature Increases Programmer Productivity". IBM. 1995-12-12. Announcement Letter Number: A95-1432.
  27. ^ "assembly language: Definition and Much More from Answers.com". answers.com. Archived from the original on 2009-06-08. Retrieved 2008-06-19.
  28. ^ Provinciano, Brian (2005-04-17). "NESHLA: The High Level, Open Source, 6502 Assembler for the Nintendo Entertainment System". Archived from the original on 2020-03-24. Retrieved 2020-03-24.
  29. ^ Dufresne, Steven (2018-08-21). "Kathleen Booth: Assembling Early Computers While Inventing Assembly". Archived from the original on 2020-03-24. Retrieved 2019-02-10.
  30. ^ a b Booth, Andrew Donald; Britten, Kathleen Hylda Valerie (September 1947) [August 1947]. General considerations in the design of an all purpose electronic digital computer (PDF) (2 ed.). The Institute for Advanced Study, Princeton, New Jersey, USA: Birkbeck College, London. Archived (PDF) from the original on 2020-03-24. Retrieved 2019-02-10. The non-original ideas, contained in the following text, have been derived from a number of sources, ... It is felt, however, that acknowledgement should be made to Prof. John von Neumann and to Dr. Herman Goldstein for many fruitful discussions ...
  31. ^ Campbell-Kelly, Martin (April 1982). "The Development of Computer Programming in Britain (1945 to 1955)". IEEE Annals of the History of Computing. 4 (2): 121–139. doi:10.1109/MAHC.1982.10016. S2CID 14861159.
  32. ^ Campbell-Kelly, Martin (1980). "Programming the EDSAC". IEEE Annals of the History of Computing. 2 (1): 7–36. doi:10.1109/MAHC.1980.10009.
  33. ^ "1985 Computer Pioneer Award 'For assembly language programming' David Wheeler".
  34. ^ Wilkes, Maurice Vincent (1949). "The EDSAC – an Electronic Calculating Machine". Journal of Scientific Instruments. 26 (12): 385–391. Bibcode:1949JScI...26..385W. doi:10.1088/0950-7671/26/12/301.
  35. ^ da Cruz, Frank (2019-05-17). "The IBM 650 Magnetic Drum Calculator". Computing History - A Chronology of Computing. Columbia University. Archived from the original on 2020-02-15. Retrieved 2012-01-17.
  36. ^ Collen, Morris F. (March–April 1994). "The Origins of Informatics". Journal of the American Medical Informatics Association. 1 (2): 96–97. doi:10.1136/jamia.1994.95236152.
  37. ^ Pettus, Sam (2008-01-10). "SegaBase Volume 6 - Saturn". Archived from the original on 2008-07-13. Retrieved 2008-07-25.
  38. ^ Kauler, Barry (1997-01-09). Windows Assembly Language and Systems Programming: 16- and 32-Bit Low-Level Programming for the PC and Windows. CRC Press. ISBN 978-1-48227572-8. Retrieved 2020-03-24. Always the debate rages about the applicability of assembly language in our modern programming world.
  39. ^ Hsieh, Paul (2020-03-24) [2016, 1996]. "Programming Optimization". Archived from the original on 2020-03-24. Retrieved 2020-03-24. ... design changes tend to affect performance more than ... one should not skip straight to assembly language until ...
  40. ^ "TIOBE Index". TIOBE Software. Archived from the original on 2020-03-24. Retrieved 2020-03-24.
  41. ^ Rusling, David A. (1999) [1996]. "Chapter 2 Software Basics". The Linux Kernel. Archived from the original on 2020-03-24. Retrieved 2012-03-11.
  42. ^ a b Markoff, John Gregory (2005-11-28). "Writing the Fastest Code, by Hand, for Fun: A Human Computer Keeps Speeding Up Chips". The New York Times. Seattle, Washington, USA. Archived from the original on 2020-03-23. Retrieved 2010-03-04.
  43. ^ "Bit-field-badness". hardwarebug.org. 2010-01-30. Archived from the original on 2010-02-05. Retrieved 2010-03-04.
  44. ^ "GCC makes a mess". hardwarebug.org. 2009-05-13. Archived from the original on 2010-03-16. Retrieved 2010-03-04.
  45. ^ Hyde, Randall. "The Great Debate". Archived from the original on 2008-06-16. Retrieved 2008-07-03.
  46. ^ "Code sourcery fails again". hardwarebug.org. 2010-01-30. Archived from the original on 2010-04-02. Retrieved 2010-03-04.
  47. ^ Click, Cliff; Goetz, Brian. "A Crash Course in Modern Hardware". Archived from the original on 2020-03-24. Retrieved 2014-05-01.
  48. ^ "68K Programming in Fargo II". Archived from the original on 2008-07-02. Retrieved 2008-07-03.
  49. ^ "BLAS Benchmark-August2008". eigen.tuxfamily.org. 2008-08-01. Archived from the original on 2020-03-24. Retrieved 2010-03-04.
  50. ^ "x264.git/common/x86/dct-32.asm". git.videolan.org. 2010-09-29. Archived from the original on 2012-03-04. Retrieved 2010-09-29.
  51. ^ Bosworth, Edward (2016). "Chapter 1 – Why Study Assembly Language". www.edwardbosworth.com. Archived from the original on 2020-03-24. Retrieved 2016-06-01.
  52. ^ "z/OS Version 2 Release 3 DFSMS Macro Instructions for Data Sets" (PDF). IBM. 2019-02-15. Archived (PDF) from the original on 2021-06-25. Retrieved 2021-09-14.
  53. ^ Paul, Matthias R. (2001) [1996], "Specification and reference documentation for NECPINW", NECPINW.CPI - DOS code page switching driver for NEC Pinwriters (2.08 ed.), FILESPEC.TXT, NECPINW.ASM, EUROFONT.INC from NECPI208.ZIP, archived from the original on 2017-09-10, retrieved 2013-04-22
  54. ^ Paul, Matthias R. (2002-05-13). "[fd-dev] mkeyb". freedos-dev. Archived from the original on 2018-09-10. Retrieved 2018-09-10.

추가 읽기

외부 링크