맨위로가기

어셈블리어

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

어셈블리어는 컴퓨터의 중앙 처리 장치(CPU)가 직접 이해하고 실행할 수 있는 기계어를 사람이 이해하기 쉽도록 니모닉 기호를 사용하여 표현한 저수준 프로그래밍 언어이다. 1940년대 후반부터 존재해 왔으며, 초기 컴퓨터 시스템과 운영체제 개발에 널리 사용되었다. 어셈블리어는 하드웨어에 대한 직접적인 제어를 가능하게 하고, 성능 최적화에 유리하지만, 하드웨어 종속적이고 이식성이 낮다는 단점이 있다. 현재는 임베디드 시스템, 운영체제 커널, 장치 드라이버, 고성능 컴퓨팅, 게임 개발, 보안 등 특정 분야에서 활용되며, 성능 최적화, 하드웨어 직접 제어, 실시간 시스템 개발, 레거시 코드 유지보수 등의 목적으로 사용된다.

더 읽어볼만한 페이지

  • 저급 프로그래밍 언어 - 기계어
    기계어는 컴퓨터 CPU가 직접 이해하고 실행하는 이진수 형태의 명령어 집합으로, 각 프로세서는 고유한 명령어 집합을 가지며 어셈블리 언어를 통해 니모닉 코드로 표현될 수 있다.
  • 어셈블리어 - 기계어
    기계어는 컴퓨터 CPU가 직접 이해하고 실행하는 이진수 형태의 명령어 집합으로, 각 프로세서는 고유한 명령어 집합을 가지며 어셈블리 언어를 통해 니모닉 코드로 표현될 수 있다.
  • 어셈블리어 - 주소 지정 방식
  • 프로그래밍 언어 구현 - 컴파일러
    컴파일러는 고급 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 저급 언어로 변환하는 프로그램으로, 어휘 분석, 구문 분석, 의미 분석, 최적화, 코드 생성 등의 단계를 거쳐 목적 코드를 생성하며, 네이티브 컴파일러, 크로스 컴파일러 등으로 분류되어 다양한 분야에서 활용된다.
  • 프로그래밍 언어 구현 - 인터프리터
    인터프리터는 프로그래밍 언어의 소스 코드를 한 줄씩 읽어 즉시 실행하는 프로그램으로, 1950년대 초 컴퓨터 자원 제약 하에서 프로그래밍을 용이하게 하기 위해 등장했으며, 컴파일러와 달리 코드를 해석하고 실행하는 방식으로 작동하며 다양한 종류가 있다.
어셈블리어 - [IT 관련 정보]에 관한 문서
기본 정보
모토로라 MC6800 어셈블리 언어
모토로라 MC6800 어셈블리 언어의 전형적인 '보조 출력' - 어셈블러에서 원래의 어셈블리 언어(오른쪽)와 어셈블된 형태를 보여준다.
패러다임명령형, 비구조적, 종종 메타프로그래밍(매크로를 통해), 특정 어셈블러는 구조적 또는 객체 지향적이다.
발표일1947년
타이핑없음
파일 확장자.asm, .s, .S, .inc, .wla, .SRC 및 어셈블러에 따라 여러 기타 확장자
개요
분류저급 프로그래밍 언어
특징명령형 언어
비구조적 언어
메타프로그래밍 지원 (매크로 활용)
특정 어셈블러는 구조적 또는 객체 지향 프로그래밍 지원
사용 분야임베디드 시스템
장치 드라이버
운영 체제 커널
컴파일러
가상 머신
장점하드웨어 직접 제어 가능
높은 성능
작은 코드 크기
단점낮은 생산성
높은 복잡성
이식성 낮음
역사
최초 개발 시기1940년대 후반
개발 배경기계어의 단점 극복
특징
명령어CPU의 명령어 집합과 1:1 대응
어셈블러어셈블리 코드를 기계어로 번역하는 프로그램
매크로코드 재사용성을 높이는 기능
디버깅기계어 수준의 디버깅 가능
예제 코드
Hello, world! (x86 어셈블리)(코드 예시는 생략. 실제 위키 문서에 코드가 포함되어 있으나, 내용이 길어 생략함)
기타
관련 용어기계어
어셈블러
컴파일러
링커
디버거
참고 자료(참고 자료 링크는 생략. 실제 위키 문서에 링크가 포함되어 있으나, 내용이 길어 생략함)

2. 역사

어셈블리어는 프로그램 내장 방식 컴퓨터의 초기인 1940년대 후반부터 존재해 왔다. 세계 최초로 실용적으로 가동된 폰 노이만형 전자 계산기로 여겨지는 EDSAC(1949)의 ''initial orders'' (부트 로더에 해당)는 10진수 주소를 2진수로 변환하는 기능을 가졌다.[42] 1954년에는 나다니엘 로체스터가 IBM 701용 어셈블러를 작성했고, 1955년에는 Stan Poley가 IBM 650용 SOAP (Symbolic Optimal Assembly Program) 어셈블러를 개발했다.[43]

컴퓨터 역사 초기에 기계어 프로그램을 생성하는 것은 자동 프로그래밍이라고 불렸다. 도널드 길리스는 폰 노이만으로부터 어셈블러 개발을 중단하라는 말을 들었다는 일화가 있는데, 당시에는 사람이 수작업으로 할 수 있는 일을 컴퓨터로 시키는 시대가 올 것이라고 생각하지 못했기 때문이다.

역사적으로 많은 운영체제(OS)나 응용 프로그램이 어셈블리어만으로 작성되었다. ALGOL의 방언인 ESPOL로 작성된 Burroughs MCP(1961)가 등장하기 전까지 운영체제는 어셈블리어로 작성하는 것이 일반적이었다. IBM메인프레임용 소프트웨어 상당수가 어셈블리어로 작성되었으며, COBOL, FORTRAN, PL/I 등이 대체해 갔지만 1990년대에도 어셈블리어 코드 베이스를 유지하던 대기업이 많았다.

초기 마이크로컴퓨터에서도 어셈블리어가 널리 사용되었는데, 이는 리소스 제약이 크고 메모리나 디스플레이 아키텍처가 특수했기 때문이다. 마이크로컴퓨터용 고급 언어 컴파일러가 없었다는 점도 작용했다. 1980년대부터 1990년대에 걸쳐, 홈 컴퓨터 (ZX Spectrum, 코모도어 64, Amiga, Atari ST 등)에서도 어셈블리어가 자주 사용되었다. 이는 BASIC의 성능이 낮고 하드웨어의 모든 기능을 이용할 수 없는 경우가 많았기 때문이다. Amiga에는 프리웨어 어셈블리어 통합 개발 환경 [http://www.theflamearrows.info/homepage.html ASM-One assembler]가 있어, Microsoft Visual Studio에 필적하는 기능을 갖추고 있었다. Don French가 개발한 VIC-20용 어셈블러는 1,639바이트로, 세계에서 가장 작은 어셈블러라고 불린다.[44] 1980년대 비즈니스 소프트웨어에서는 스프레드시트 Lotus 1-2-3 등이 어셈블리어로 작성되었고, 한국에서는 훈민정음 등이 해당한다.[45]

1990년대에도 소비자 게임의 많은 부분이 어셈블리어로 작성되었다. 그러나 게임 내용이 복잡해지고 프로그램 규모가 커지면서 고급 언어에 의한 개발이 주류가 되었다. 플레이스테이션에서는 GCC가 공식 SDK에 포함되어 표준 개발 언어는 C 언어였다.[46][47] 세가 새턴의 최고 성능을 이끌어내려면 어셈블리어를 사용할 수밖에 없다고 말했던 업계 관계자도 있었다.[48] 그러나 패미컴 시대 이미 메탈 슬레이더 글로리나 슈퍼 패미컴의 MOTHER 2 · 심시티[49], 플레이스테이션의 크래쉬 밴디쿳에서[50] 개발 일부에 LISP가 사용되었다는 이야기도 있다.

2000년대 초, 마이크로소프트는 프로그래머블 셰이더에 대응하는 DirectX (Direct3D) 8.0을 출시했다. Direct3D 8.0에서의 셰이더 프로그램은 그래픽스 하드웨어에 의존하지 않는 중간 언어를 출력할 수 있는 어셈블리어(셰이더 어셈블러)를 사용하여 기술하는 것이었다. 초대 Xbox는 세계 최초로 프로그래머블 셰이더에 대응하는 소비자 게임기였으며, CPU상에서 실행하는 코드는 C++로, GPU 상에서 실행하는 셰이더 프로그램은 어셈블러를 사용했다. 이후 HLSL이나 Cg (C for Graphics)와 같은 고급 셰이딩 언어가 개발되어, Direct3D 9.0 이후는 셰이더 프로그램도 고급 언어를 이용하여 기술하게 되었다. Direct3D 10의 셰이더 모델 4.0 이후는, 셰이더 어셈블러가 아닌 HLSL의 사용이 필수화되었다.[52]

현재의 최적화 컴파일러는 사람이 작성한 어셈블리어 코드와 동등한 성능을 발휘한다고 말해지고 있다.[53] 예외도 있지만,[54][55][56] 최근 프로세서나 메모리 서브 시스템이 복잡해짐에 따라, 컴파일러에서도 어셈블리어에서도 효과적인 최적화가 더욱 어려워지고 있다.[57][58] C#와 같은 고급 언어가 주류가 된 후에도, 컴파일러가 출력한 어셈블리 코드를 분석하여 최적화 및 튜닝의 여지를 찾는 수법은 일반적으로 행해지고 있다.[59]

3. 어셈블리 언어의 특징

기계어는 실제로 컴퓨터의 CPU가 읽어서 실행할 수 있는 0과 1로 이루어진 명령어의 조합이다. 이러한 각 명령어에 대해 사람이 알아보기 쉬운 니모닉 기호(mnemonic symbol)를 정해 사람이 좀 더 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것이 어셈블리 언어이다.

예를 들어,

10110000 01100001

는 x86 계열 CPU의 기계어 명령이고, 이것을 어셈블리어로 옮겨쓰면 다음과 같다.



mov al, 061h



명령어 mov는 영어 move를 변형한 니모닉이며, al은 CPU안에 있는 변수를 저장하는 레지스터의 하나이다. 그리고, 061h는 16진수 61 (즉 십진수 97, 이진수 01100001)이다. 이 한 줄의 뜻은 16진수 61을 al레지스터에 넣으라는 뜻이며, 1과 0의 반복인 기계어보다 사람이 혼동없이 이해하기 한결 쉽다. 어셈블리어는 이러한 문장들로 구성된다.

어셈블리어로 작성된 프로그램은 일련의 니모닉 코드 프로세서 명령어, 메타 구문(선언적 연산, 지시문, 의사 명령어, 의사 연산 및 의사 명령어로 다양하게 알려짐), 주석 및 데이터로 구성된다. 어셈블리 언어 명령어는 일반적으로 연산 코드 니모닉 코드와 피연산자로 구성되며, 피연산자는 데이터, 인수 또는 매개변수의 목록일 수 있다. 일부 명령은 "암시적"일 수 있으며, 이는 명령이 작동하는 데이터가 명령 자체에 의해 암시적으로 정의됨을 의미한다. 이러한 명령은 피연산자를 사용하지 않는다. 결과 구문은 어셈블러에 의해 기계어 명령어로 변환되어 메모리에 로드되어 실행될 수 있다.

예를 들어, 아래 명령은 x86/IA-32 프로세서에게 즉시 8비트 값프로세서 레지스터로 이동하라고 지시한다. 이 명령의 이진 코드는 10110 다음에 사용할 레지스터에 대한 3비트 식별자가 온다. ''AL'' 레지스터에 대한 식별자는 000이므로 다음 기계어는 ''AL'' 레지스터에 데이터 01100001을 로드한다.

10110000 01100001

이 이진 컴퓨터 코드는 다음과 같이 16진법으로 표현하여 사람의 가독성을 높일 수 있다.

B0 61

여기서 B0은 "다음 값을 복사하여 ''AL''로 이동"을 의미하고, 61은 값 01100001(십진법으로 97)의 16진수 표현이다. 8086 제품군의 어셈블리 언어는 이와 같은 명령에 대한 니모닉 코드 MOV(''이동''의 약자)를 제공하므로 위의 기계어는 세미콜론 뒤에 필요한 경우 설명 주석과 함께 다음과 같이 어셈블리 언어로 작성할 수 있다. 이렇게 하면 읽고 기억하기가 훨씬 쉽다.

MOV AL, 61h ; AL에 십진법 97 (16진법 61) 로드

일부 어셈블리 언어(이 언어 포함)에서 MOV와 같은 동일한 니모닉 코드는 즉시 값, 레지스터의 값 또는 레지스터의 값 또는 즉시(a.k.a. 직접) 주소에 의해 가리켜진 메모리 위치인지 여부에 관계없이 데이터를 로드, 복사 및 이동하기 위한 관련 명령 집합에 사용될 수 있다. 다른 어셈블러는 "메모리를 레지스터로 이동", "레지스터를 메모리로 이동"에 대해 각각 L, ST, "레지스터를 레지스터로 이동"에 대해 LR, "즉시 피연산자를 메모리로 이동"에 대해 MVI 등과 같은 별도의 연산 코드 니모닉 코드를 사용할 수 있다.

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

88 E0

첫 번째 바이트, 88h는 바이트 크기 레지스터와 다른 레지스터 또는 메모리 간의 이동을 식별하고, 두 번째 바이트, E0h는 두 피연산자가 모두 레지스터이고, 소스가 ''AH''이며, 대상이 ''AL''임을 지정하도록 (3비트 필드로) 인코딩된다.

이처럼 동일한 니모닉 코드가 둘 이상의 이진 명령을 나타낼 수 있는 경우 어셈블러는 피연산자를 검사하여 생성할 명령을 결정한다. 첫 번째 예에서 피연산자 61h는 유효한 16진수 숫자 상수이며 유효한 레지스터 이름이 아니므로 B0 명령만 적용할 수 있다. 두 번째 예에서 피연산자 AH는 유효한 레지스터 이름이며 유효한 숫자 상수(16진법, 10진법, 8진법 또는 2진법)가 아니므로 88 명령만 적용할 수 있다.

어셈블리 언어는 이러한 모호함이 구문에 의해 보편적으로 적용되도록 항상 설계되었다. 예를 들어, Intel x86 어셈블리 언어에서 16진수 상수는 숫자 숫자로 시작해야 하므로 16진수 'A'(10진수 10과 같음)는 0Ah 또는 0AH로 작성해야 하며, AH로 작성하면 안 된다. 특히 레지스터 ''AH''의 이름으로 나타날 수 없도록 한다. (동일한 규칙은 또한 레지스터 ''BH'', ''CH'', ''DH''의 이름뿐만 아니라 "BEACH"와 같이 문자 ''H''로 끝나고 16진수 숫자만 포함하는 사용자가 정의한 모든 기호와의 모호성을 방지한다.)

원래 예로 돌아가서 x86 연산 코드 10110000(B0)이 8비트 값을 ''AL'' 레지스터로 복사하는 동안 10110001(B1)은 ''CL''로 이동하고 10110010(B2)은 ''DL''로 이동한다. 이에 대한 어셈블리 언어 예는 다음과 같다.



MOV AL, 1h ; 즉시 값 1로 AL 로드

MOV CL, 2h ; 즉시 값 2로 CL 로드

MOV DL, 3h ; 즉시 값 3으로 DL 로드



MOV 구문은 다음 예에서 볼 수 있듯이 더 복잡할 수도 있다.



MOV EAX, [EBX] ; EBX에 포함된 주소의 메모리에 있는 4바이트를 EAX로 이동

MOV [ESI+EAX], CL ; CL의 내용을 주소 ESI+EAX의 바이트로 이동

MOV DS, DX ; DX의 내용을 세그먼트 레지스터 DS로 이동



각 경우에 MOV 니모닉 코드는 어셈블러에 의해 연산 코드 88-8C, 8E, A0-A3, B0-BF, C6 또는 C7 중 하나로 직접 변환되며 프로그래머는 일반적으로 어떤 명령인지 알거나 기억할 필요가 없다.

어셈블리 언어를 기계어로 변환하는 것은 어셈블러의 역할이며 그 반대는 디스어셈블러를 통해 최소한 부분적으로 수행할 수 있다. 고급 프로그래밍 언어와 달리, 단순한 어셈블리 구문과 기계어 명령어 간에는 일대일 대응이 있다. 그러나 어떤 경우에는 어셈블러가 일반적으로 필요한 기능을 제공하기 위해 여러 기계어 명령어로 확장되는 "의사 명령어"(본질적으로 매크로)를 제공할 수 있다. 예를 들어, "크거나 같으면 분기" 명령어가 없는 기계의 경우, 어셈블러는 기계의 "작으면 설정" 및 "설정 명령어의 결과에 대해 0이면 분기"로 확장되는 의사 명령어를 제공할 수 있다. 대부분의 전체 기능을 갖춘 어셈블러는 또한 공급업체와 프로그래머가 더 복잡한 코드 및 데이터 시퀀스를 생성하는 데 사용하는 풍부한 매크로 언어(아래에서 논의)를 제공한다. 어셈블러 환경에서 정의된 의사 명령어 및 매크로에 대한 정보는 객체 프로그램에 없으므로 디스어셈블러는 매크로 및 의사 명령어 호출을 재구성할 수 없고 해당 추상 어셈블리 언어 엔티티에서 어셈블러가 생성한 실제 기계어 명령어만 디스어셈블할 수 있다. 마찬가지로 어셈블리 언어 소스 파일의 주석은 어셈블러에서 무시되고 생성하는 객체 코드에 영향을 미치지 않으므로 디스어셈블러는 항상 소스 주석을 복구할 수 없다.

각 컴퓨터 아키텍처에는 고유한 기계어가 있다. 컴퓨터는 지원하는 연산 수와 유형, 다양한 크기 및 레지스터 수, 저장소의 데이터 표현에서 다릅니다. 대부분의 범용 컴퓨터는 본질적으로 동일한 기능을 수행할 수 있지만, 수행하는 방식이 다르며, 해당 어셈블리 언어가 이러한 차이점을 반영한다.

단일 명령어 집합에 대해 여러 개의 니모닉 코드 또는 어셈블리 언어 구문 집합이 존재할 수 있으며, 일반적으로 다양한 어셈블러 프로그램에서 인스턴스화된다. 이러한 경우, 가장 널리 사용되는 것은 일반적으로 CPU 제조업체에서 제공하고 해당 설명서에 사용되는 것이다.

두 개의 다른 니모닉 코드 집합을 가진 CPU의 예는 Intel 8080 제품군과 Intel 8086/8088이다. Intel은 자체 어셈블리 언어 니모닉 코드에 대한 저작권을 주장했기 때문에(적어도 1970년대와 1980년대 초에 발행된 문서의 각 페이지에서) Intel 명령어 집합과 호환되는 CPU를 독립적으로 생산한 일부 회사는 자체 니모닉 코드를 발명했다. Zilog Z80 CPU는 Intel 8080A의 향상된 버전으로, 모든 8080A 명령어 외에 더 많은 명령어를 지원한다. Zilog는 새로운 명령어뿐만 아니라 모든 8080A 명령어에 대해서도 완전히 새로운 어셈블리 언어를 발명했다. 예를 들어, Intel은 다양한 데이터 전송 명령어에 대해 니모닉 코드 ''MOV'', ''MVI'', ''LDA'', ''STA'', ''LXI'', ''LDAX'', ''STAX'', ''LHLD'' 및 ''SHLD''를 사용하는 반면, Z80 어셈블리 언어는 모든 명령어에 대해 니모닉 코드 ''LD''를 사용한다. 비슷한 사례는 NEC V20 및 V30 CPU이며, 각각 Intel 8086 및 8088의 향상된 복사본이다. Zilog가 Z80을 사용한 것처럼 NEC는 Intel의 저작권 침해 혐의를 피하기 위해 모든 8086 및 8088 명령어에 대한 새로운 니모닉 코드를 발명했다. (그러한 저작권이 유효할 수 있는지 의문이 있으며, 나중에 AMD 및 Cyrix와 같은 CPU 회사는 Intel의 x86/IA-32 명령어 니모닉 코드를 허가 또는 법적 처벌 없이 정확히 재출판했습니다.) V20 및 V30을 프로그래밍한 많은 사람들이 실제로 Intel의 어셈블리 언어가 아닌 NEC의 어셈블리 언어로 작성했는지 의심스럽습니다. 동일한 명령어 집합 아키텍처에 대한 두 개의 어셈블리 언어는 동형(영어와 돼지 라틴어와 다소 비슷함)이므로 해당 제조업체의 제품과 함께 해당 제조업체의 자체 게시된 어셈블리 언어를 사용할 필요가 없다.

3. 1. 기계어와의 관계

어셈블리어는 기계어와 일대일 대응되는 저수준 프로그래밍 언어이다. 각 CPU마다 고유한 기계어를 가지며, 어셈블리어는 이 기계어 명령어에 대해 사람이 알아보기 쉬운 니모닉 기호(mnemonic symbol)를 사용하여 작성된다.[22] 예를 들어, x86 계열 CPU에서 10110000 01100001는 기계어 명령은 `mov al, 061h`와 같이 표현될 수 있다. 여기서 `mov`는 move를 의미하는 니모닉이며, `al`은 CPU 내 레지스터 중 하나를, `061h`는 16진수 61(십진수 97)을 의미한다. 이처럼 어셈블리어는 0과 1의 조합인 기계어보다 사람이 이해하기 쉽다.

어셈블리어로 작성된 코드는 어셈블러를 통해 기계어 코드로 변환된다. 어셈블러는 일련의 니모닉 코드, 메타 구문(선언적 연산, 지시문, 의사 명령어, 의사 연산 및 의사 명령), 주석 및 데이터로 구성된 어셈블리 코드를 기계어 명령어로 변환하여 메모리에 로드하고 실행할 수 있도록 한다. 어셈블리 언어 명령어는 일반적으로 연산 코드 니모닉과 피연산자로 구성되며, 피연산자는 데이터, 인수 또는 매개변수 목록일 수 있다. 일부 명령은 "암시적"일 수 있으며, 이는 명령이 작동하는 데이터가 명령 자체에 의해 암시적으로 정의됨을 의미한다.

반대로, 디스어셈블러는 기계어 코드를 어셈블리 코드로 역변환하는 역할을 수행한다. 그러나, 어셈블러가 생성하는 객체 코드에는 의사 명령어, 매크로 호출, 주석과 같은 정보는 포함되지 않기 때문에, 디스어셈블러는 이러한 정보를 완전히 복구할 수는 없다.

고급 프로그래밍 언어와 달리, 단순한 어셈블리 구문과 기계어 명령어 사이에는 일대일 대응이 존재한다. 그러나, 어떤 경우에는 어셈블러가 여러 기계어 명령어로 확장되는 "의사 명령어"(매크로)를 제공하기도 한다. 예를 들어, "크거나 같으면 분기" 명령어가 없는 기계의 경우, 어셈블러는 "작으면 설정" 및 "설정 명령어의 결과에 대해 0이면 분기"로 확장되는 의사 명령어를 제공할 수 있다.

각 컴퓨터 아키텍처는 고유한 기계어를 가지며, 어셈블리어는 이러한 차이점을 반영한다. 단일 명령어 집합에 대해 여러 개의 니모닉 또는 어셈블리 언어 구문 집합이 존재할 수 있으며, 일반적으로 다양한 어셈블러 프로그램에서 인스턴스화된다. 가장 널리 사용되는 것은 CPU 제조업체에서 제공하고 해당 설명서에 사용되는 것이다. 예를 들어, Zilog Z80 CPU는 Intel 8080A의 향상된 버전으로 모든 8080A 명령어 외에 더 많은 명령어를 지원하고 Intel과는 다른 자체 어셈블리 언어를 사용한다.

어셈블리 언어의 명령어는 일반적으로 고급 프로그래밍 언어의 명령어와 달리 매우 단순하며, 니모닉은 단일 실행 가능한 기계어 명령어(opcode)에 대한 기호 이름이다. 각 명령은 일반적으로 ''연산'' 또는 ''opcode''와 0개 이상의 ''operand''로 구성된다.

3. 2. 저수준 프로그래밍

어셈블리어는 저수준프로그래밍 언어이며, C 언어 등의 고급 언어보다 추상도가 낮다.[28] 즉, 언어 기능(구문 및 자료형)이 적다. 어셈블리어는 하드웨어에 대한 직접적인 제어를 가능하게 하며, 메모리 관리, 레지스터 사용, 명령어 수준의 최적화를 통해 프로그램의 성능을 극대화할 수 있다. 그러나 하드웨어 의존성이 높아 이식성이 낮다.

어셈블리어와 고급 언어의 주요 차이점은 다음과 같다:

표. 어셈블리어와 고급 언어
어셈블러고급 언어
레지스터-
점프 명령
제어 구조-
구조체-
함수-
주석



이러한 차이는 언어 기능의 차이일 뿐, 고급 언어에서만 가능한 기능이 어셈블리어에서 불가능하다는 의미는 아니다. 예를 들어, 어셈블리어에는 함수 구문이 없지만, 함수 프로로그와 에필로그/Function_prologue_and_epilogue영어와 같이 함수에 해당하는 패턴이 존재한다. 고급 언어는 어셈블러에서 자주 사용되는 패턴을 기능으로 통합하여 추상도를 높인 언어라고 할 수 있다.

3. 3. 문법

어셈블리 언어는 일반적으로 니모닉, 오퍼랜드, 지시어, 주석으로 구성된다. 기계어 명령어(opcode)에 대해 사람이 알아보기 쉬운 니모닉을 사용하며, 각 기계어 명령어에 대해 적어도 하나의 opcode 니모닉이 정의된다.

  • 니모닉: 처리 내용에 따라 각 기계어 명령에 부여된 문자열・명령어이다. 기계어의 오퍼코드에 해당하며, 사람이 이해하기 쉽도록 의미 있는 문자열로 표현된다. 예를 들어, X64 기계어 `0x05`는 "정수의 덧셈"을 의미하며, `ADD`라는 니모닉에 대응된다.
  • 확장 니모닉: 명령어의 특수한 용도를 지원하는 데 사용되며, 본래 명령의 명칭으로는 그 용도를 연상할 수 없을 때 사용된다. 예를 들어, 8086 CPU에서 `xchg ax,ax` 명령어는 `nop`으로 사용될 수 있다. SPARC 아키텍처에서는 확장 니모닉을 ''synthetic instructions''라고 부른다.
  • 오퍼랜드: 명령어의 대상, 즉 인자이다. 하나의 명령에서는 니모닉 다음에 0개 이상의 오퍼랜드가 기술된다. 데이터로 읽혀지는 소스와 명령 실행 결과가 저장되는 데스티네이션이 있으며, 소스에는 상수, 레지스터, 메모리 중 하나, 데스티네이션에는 레지스터 또는 메모리를 지정한다.


대부분의 명령어는 단일 값 또는 값 쌍을 참조하며, 피연산자는 즉시 값, 명령에 지정되거나 암시된 레지스터, 또는 저장소의 다른 위치에 있는 데이터의 주소일 수 있다. 이는 기본 프로세서 아키텍처에 의해 결정되며, 어셈블러는 이 아키텍처가 작동하는 방식을 반영한다.[24]

어셈블리 지시어는 의사 명령이라고도 하며, 어셈블러에게 "명령어를 어셈블하는 것 외의 작업을 수행하도록 지시"하는 명령어이다.[24] 어셈블러의 작동 방식에 영향을 미치며, 오브젝트 코드, 심볼 테이블, 리스팅 파일 및 내부 어셈블러 매개변수 값에 영향을 줄 수 있다.[25]

심볼릭 어셈블러에서는 임의의 이름(레이블 또는 심볼)과 메모리 위치를 대응시킬 수 있다. 상수나 변수에 이름을 붙여 명령어가 해당 위치를 이름으로 참조할 수 있도록 하며, 자기 문서화 코드를 촉진한다.

3. 4. 어셈블러

어셈블러(assembler)는 어셈블리어를 기계어 형태의 오브젝트 코드로 해석해 주는 컴퓨터 언어 번역 프로그램이다.[64] 어셈블러는 기본 컴퓨터 명령어들을, 컴퓨터 프로세서가 기본 연산을 수행하는데 사용할 수 있는 비트 패턴으로 변환시킨다.

어셈블러는 니모닉 기호(mnemonics)를 opcode로 변환하고 메모리 위치와 기타 존재물에 따라 식별자를 다시 분석함으로써 목적 코드를 만들어낸다.[64] 높은 수준의 어셈블러는 고급 제어 구조, 높은 수준의 프로시져/함수 선언 및 호출, 높은 수준의 자료형 추상화 같은 높은 수준의 언어 추상화 기능을 제공하기도 한다. MIPS, Sun Sparc, HP PA-RISC과 같은 RISC 기반 아키텍처를 위한 현대의 어셈블러는 함수 스케줄링 기능을 가지고 있어서 중앙처리장치의 파이프라인을 효과적으로 사용할 수 있다.

어셈블러는 소스 파일을 처리하는 데 필요한 패스 수에 따라 두 가지 유형으로 나뉜다.

  • '''원패스 어셈블러'''는 소스 코드를 한 번 처리한다. 정의되기 전에 사용된 심볼의 경우, 어셈블러는 결국 정의된 후에 에라타를 내보내어, 아직 정의되지 않은 심볼이 사용된 위치를 링커 또는 로더가 패치하도록 한다.
  • '''멀티 패스 어셈블러'''는 첫 번째 패스에서 모든 심볼과 해당 값을 테이블로 생성한 다음, 이후 패스에서 해당 테이블을 사용하여 코드를 생성한다. 멀티 패스 어셈블러의 장점은 에라타가 없으므로 링킹 프로세스 (또는 어셈블러가 실행 가능한 코드를 직접 생성하는 경우 프로그램 로드)가 더 빠르다는 것이다.


어셈블러의 종류는 다음과 같다:

  • '''매크로 어셈블러'''는 매크로 명령어 기능을 포함하는 어셈블러이다.
  • '''크로스 어셈블러''' (참조: 크로스 컴파일러)는 결과 코드가 실행될 시스템(''타겟 시스템'')과 다른 유형의 컴퓨터 또는 운영 체제(''호스트'' 시스템)에서 실행되는 어셈블러이다.
  • '''고급 어셈블러'''는 고급 언어에서 더 흔하게 사용되는 언어 추상화를 제공하는 프로그램이다.
  • '''마이크로 어셈블러'''는 컴퓨터의 하위 레벨 작동을 제어하는 마이크로 프로그램을 준비하는 데 도움이 되는 프로그램이다.
  • '''메타 어셈블러'''는 "어셈블리 언어의 구문 및 의미 설명을 받아들여 해당 언어의 어셈블러를 생성하는 프로그램"이거나, 어셈블러 소스 파일과 해당 설명을 함께 받아들여 해당 설명에 따라 소스 파일을 어셈블합니다.
  • '''인라인 어셈블러''' (또는 '''임베디드 어셈블러''')는 고급 언어 프로그램 내에 포함된 어셈블러 코드이다.[10]


어셈블리 지시어는 의사-opcode, 의사-연산 또는 의사-op라고도 불리며, 어셈블러에게 "명령어를 어셈블하는 것 외의 작업을 수행하도록 지시"하는 명령어이다. 지시어는 어셈블러의 작동 방식에 영향을 미치며 "오브젝트 코드, 심볼 테이블, 리스팅 파일 및 내부 어셈블러 매개변수 값에 영향을 미칠 수 있다".

유닉스 계열 시스템에서는 어셈블러를 as라고 부르는 것이 일반적이지만, 실체는 각 OS에 따라 다르다. GNU 어셈블러를 사용하는 경우가 많다. 같은 계열의 프로세서라도 여러 어셈블리 언어의 방언이 존재한다.

3. 5. 고급 어셈블러

고급 어셈블러는 생산성을 높이기 위해 다양한 고급 언어의 추상화 기능을 제공한다.[66] 이러한 기능에는 진보된 제어 구조, 높은 수준의 프로시저/함수 선언 및 호출, 구조체/레코드, 유니언(union), 클래스, 집합을 포함한 높은 수준의 추상 자료형, 복잡한 매크로 처리 등이 있다.[66] 또한, 클래스, 오브젝트, 추상화, 다형성, 상속과 같은 객체 지향 프로그래밍 기능도 제공한다.[66]

매크로는 1950년대 IBM 오토코더에서 유래되었으며, 어셈블리 언어에서 "매크로"라는 용어는 C 프로그래밍 언어전처리기와 같이 다른 일부 컨텍스트에서 사용되는 것보다 더 포괄적인 개념을 나타낸다.[66] 어셈블러 매크로 명령은 어셈블 시 어셈블러에 의해 해석되어 실행되는 긴 "프로그램" 자체가 될 수 있다.[66] 매크로는 '짧은' 이름을 가질 수 있지만 여러 줄 또는 실제로 많은 줄의 코드로 확장될 수 있으므로 어셈블리 언어 프로그램을 훨씬 더 짧게 보이게 하고 상위 수준 언어와 마찬가지로 소스 코드 줄 수를 줄이는 데 사용할 수 있다.[66]

매크로 어셈블러는 종종 매크로가 매개변수를 사용하도록 허용하며, 일부 어셈블러는 선택적 매개변수, 기호 변수, 조건문, 문자열 조작 및 산술 연산과 같은 고급 언어 요소를 통합하는 상당히 정교한 매크로 언어를 포함한다.[66] 매크로는 메인프레임 시대에 특정 고객을 위해 대규모 소프트웨어 시스템을 사용자 지정하는 데 사용되었으며, 고객 직원이 제조업체의 운영 체제의 특정 버전을 만들어 고용주의 요구 사항을 충족하는 데 사용되었다.[66]

매크로 처리의 강력함에도 불구하고 C, C++ 및 PL/I를 제외하고는 많은 상위 수준 언어에서 사용되지 않게 되었지만 어셈블러의 영구적인 기능으로 남아 있다.[66] 구조적 프로그래밍 요소를 제공하도록 작성된 매크로 패키지의 초기 예는 할란 밀스가 제안하고 IBM의 연방 시스템 부서에서 마빈 케슬러가 구현한 Concept-14 매크로 세트로, OS/360 어셈블러 프로그램에 IF/ELSE/ENDIF 및 유사한 제어 흐름 블록을 제공했다.[66]

4. 어셈블리 언어의 활용

저장 프로그램 방식 컴퓨터가 도입되었을 때, 프로그램은 기계어로 작성되어 펀치 페이퍼 테이프에서 컴퓨터에 로드되거나 콘솔 스위치에서 직접 메모리에 토글되었다. 캐슬린 부스는 1947년에 시작한 이론적 연구를 바탕으로 "어셈블리어를 발명한 공로"를 인정받았으며, 런던 대학교 버크벡 칼리지에서 앤드루 부스 (후에 그녀의 남편)가 존 폰 노이만과 허먼 골드스타인의 조언을 받아 ARC2 작업을 하는 동안 만들어졌다.

1948년 말, 전자 지연 저장 자동 계산기 (EDSAC)에는 어셈블러 ( "초기 명령"이라고 함)가 부트스트랩 프로그램에 통합되었다. 데이비드 휠러 (컴퓨터 과학자)가 개발한 한 글자 짜리 니모닉을 사용했는데, 그는 IEEE 컴퓨터 학회에서 최초의 "어셈블러"를 만든 사람으로 인정받고 있다. EDSAC에 대한 보고서에서는 필드를 명령어로 결합하는 과정을 "어셈블리"라는 용어로 소개했다. SOAP (기호적 최적 어셈블리 프로그램)는 1955년 스탠 폴리가 작성한 IBM 650 컴퓨터용 어셈블리어였다.

어셈블리어는 초창기 컴퓨터에서 필요했던 오류 발생 가능성이 높고 지루하며 시간이 많이 걸리는 제1세대 언어 프로그래밍의 많은 부분을 제거하여, 프로그래머가 숫자 코드 기억, 주소 계산 등과 같은 지루한 작업에서 벗어나도록 했다. 한때 모든 종류의 프로그래밍에 널리 사용되었다. 1950년대 후반에 이르러서는 프로그래밍 생산성 향상을 추구하면서 상위 수준 언어로 대체되었다.[14] 오늘날, 어셈블리어는 여전히 하드웨어를 직접 조작하거나, 특수 프로세서 명령에 접근하거나, 중요한 성능 문제를 해결하는 데 사용된다.[15] 일반적인 용도로는 장치 드라이버, 저수준 임베디드 시스템, 실시간 컴퓨팅 시스템이 있다.

==== 주요 활용 분야 ====

어셈블리어는 하드웨어를 직접 조작하고, 특수 프로세서 명령에 접근하며, 성능 문제를 해결하는 데 사용된다.[15] 주요 활용 분야는 다음과 같다.


  • 임베디드 시스템: 자원 제약적인 환경에서 하드웨어를 직접 제어하고 성능을 최적화해야 하는 경우에 사용된다. 예를 들어, 전화기 펌웨어, 자동차 연료 및 점화 시스템, 센서 등이 있다.
  • 운영체제 커널: 운영 체제 커널과 같이 하드웨어와 직접 상호작용하며, 인터럽트 처리, 시스템 호출 구현 등 저수준 기능이 필요한 경우에 사용된다.
  • 장치 드라이버: 장치 드라이버, 인터럽트 핸들러, 부트 로더, BIOS, POST 등 하드웨어 장치를 제어하고 운영체제와 통신하는 데 사용된다.[15]
  • 고성능 컴퓨팅: 극한의 성능 최적화가 필요한 과학 기술 연산, 그래픽스 처리 등에 사용된다. 예를 들어, BLAS, 이산 코사인 변환 등에 활용된다.[60]
  • 게임 개발: 컴퓨터 게임 엔진의 핵심 부분, 특정 하드웨어에 최적화된 코드 작성 등에 사용된다. 1990년대에는 세가 새턴과 같은 시스템의 성능을 극대화하고, ''모탈 컴뱃'' 및 ''NBA 잼''과 같은 TMS34010 통합 CPU/GPU를 사용하는 아케이드 하드웨어의 기본 언어로 사용되었다.
  • 보안: 암호화 알고리즘 구현, 취약점 분석, 리버스 엔지니어링 등에 사용된다. 특히 암호 알고리즘은 항상 엄격하게 동일한 시간으로 실행하여 타이밍 공격을 방지해야 한다.
  • 컴파일러 개발: 고급 언어를 기계어로 번역하는 과정에서 어셈블리 코드를 중간 단계로 활용한다. 일부 컴파일러는 완전히 컴파일하기 전에 고급 언어를 어셈블리어로 번역하여 디버깅 및 최적화 목적으로 어셈블리 코드를 볼 수 있도록 한다.
  • 시스템 프로그래밍 교육: 컴퓨터 구조 및 동작 원리 이해를 위한 학습 도구로 활용된다.
  • 기타: 실시간 시스템, 부팅 코드, 자기 수정 코드 등에도 사용된다.


어셈블리어를 사용하는 목적은 고속화, 소형화, 실시간성(시간적 정확성), 하드웨어 조작, 고급 언어 미지원 명령 사용, 동작 이해 등이다.

==== 현대적 활용 ====

어셈블리어는 고급 언어와는 달리, 다음과 같은 특수한 목적을 위해 여전히 사용되고 있다.[15]

  • 성능 최적화: 최적화 컴파일러가 고급 언어를 어셈블리 수준으로 최적화한다고 해도, 특정 알고리즘이나 하드웨어에 대한 최적화는 어셈블리어가 더 유리할 수 있다. 예를 들어, BLAS를 사용한 선형 대수, 이산 코사인 변환 (예: x264의 SIMD 어셈블리 버전), rav1e (AV1 인코더)[16] 및 dav1d (AV1 디코더)[17] 등에서 어셈블리어가 활용된다.
  • 하드웨어 직접 제어: 고급 언어에서 지원하지 않는 특수 명령어를 사용하거나,[15] 장치 드라이버인터럽트 핸들러와 같이 하드웨어를 직접 조작해야 하는 코드를 작성할 때 사용된다.
  • 실시간 시스템: 실시간 프로그램, 시뮬레이션, 항공 항법 시스템, 의료 장비와 같이 예측 가능한 실행 시간과 낮은 지연 시간을 보장해야 하는 시스템에서 활용된다. 예를 들어, 플라이 바이 와이어 시스템은 엄격한 시간 제약 내에서 원격 측정을 해석하고 적용해야 하므로, 어셈블리어를 통해 예측 불가능한 지연을 제거할 수 있다.
  • 보안: 극도로 높은 보안이 필요한 상황에서, 컴퓨터 바이러스, 부트로더 등 환경을 완전히 제어해야 할 때 어셈블리어가 사용된다.
  • 레거시 코드 유지보수: 과거 어셈블리어로 작성된 시스템을 유지보수하고 확장하는 경우에도 사용된다.[18]


이 외에도, 명령어 집합 시뮬레이터 제작, 리버스 엔지니어링, ROM 해킹 등 다양한 분야에서 어셈블리어가 활용되고 있다.

수많은 프로그램이 어셈블리어로만 작성되었다. Burroughs MCP (1961)는 운영 체제가 어셈블리어로 완전히 개발되지 않은 최초의 컴퓨터였으며, Executive Systems Problem Oriented Language (ESPOL)이라는 알골 방언으로 작성되었다. 많은 상업용 애플리케이션도 어셈블리어로 작성되었으며, 대기업에서 개발한 상당수의 IBM 메인프레임 소프트웨어가 포함되었다. COBOL, FORTRAN 및 일부 PL/I는 결국 어셈블리어를 대체했지만, 많은 대규모 조직에서는 1990년대까지 어셈블리어 응용 프로그램 인프라를 유지했다.

어셈블리어는 Apple II, Atari 8-bit 컴퓨터, ZX Spectrum, Commodore 64와 같은 8비트 홈 컴퓨터의 주요 개발 언어였다. 이러한 시스템의 인터프리트된 BASIC은 최대 실행 속도와 사용 가능한 하드웨어를 최대한 활용할 수 있는 기능을 제공하지 못했습니다. 어셈블리어는 Atari 2600 및 닌텐도 엔터테인먼트 시스템과 같은 8비트 콘솔 프로그래밍의 기본 선택이었습니다.

IBM PC 호환 시스템용 핵심 소프트웨어인 MS-DOS, 터보 파스칼, Lotus 1-2-3 스프레드시트는 어셈블리어로 작성되었다. 컴퓨터 속도가 기하급수적으로 증가하면서 어셈블리어는 지배적인 개발 언어가 아니라 '''' 렌더링과 같은 프로그램의 일부 속도를 높이는 도구가 되었다. 1990년대에는 어셈블리어는 세가 새턴과 같은 시스템의 성능을 극대화하고,, ''모탈 컴뱃'' 및 ''NBA 잼''과 같은 TMS34010 통합 CPU/GPU를 사용하는 아케이드 하드웨어의 기본 언어로 사용되었다.

저수준언어인 어셈블리어는 C 언어 등의 고급 언어와는 다른 영역에서 사용된다.

4. 1. 주요 활용 분야

어셈블리어는 하드웨어를 직접 조작하고, 특수 프로세서 명령에 접근하며, 성능 문제를 해결하는 데 사용된다.[15] 주요 활용 분야는 다음과 같다.

  • 임베디드 시스템: 자원 제약적인 환경에서 하드웨어를 직접 제어하고 성능을 최적화해야 하는 경우에 사용된다. 예를 들어, 전화기 펌웨어, 자동차 연료 및 점화 시스템, 센서 등이 있다.
  • 운영체제 커널: 운영 체제 커널과 같이 하드웨어와 직접 상호작용하며, 인터럽트 처리, 시스템 호출 구현 등 저수준 기능이 필요한 경우에 사용된다.
  • 장치 드라이버: 장치 드라이버, 인터럽트 핸들러, 부트 로더, BIOS, POST 등 하드웨어 장치를 제어하고 운영체제와 통신하는 데 사용된다.[15]
  • 고성능 컴퓨팅: 극한의 성능 최적화가 필요한 과학 기술 연산, 그래픽스 처리 등에 사용된다. 예를 들어, BLAS, 이산 코사인 변환 등에 활용된다.[60]
  • 게임 개발: 컴퓨터 게임 엔진의 핵심 부분, 특정 하드웨어에 최적화된 코드 작성 등에 사용된다. 1990년대에는 세가 새턴과 같은 시스템의 성능을 극대화하고, ''모탈 컴뱃'' 및 ''NBA 잼''과 같은 TMS34010 통합 CPU/GPU를 사용하는 아케이드 하드웨어의 기본 언어로 사용되었다.
  • 보안: 암호화 알고리즘 구현, 취약점 분석, 리버스 엔지니어링 등에 사용된다. 특히 암호 알고리즘은 항상 엄격하게 동일한 시간으로 실행하여 타이밍 공격을 방지해야 한다.
  • 컴파일러 개발: 고급 언어를 기계어로 번역하는 과정에서 어셈블리 코드를 중간 단계로 활용한다. 일부 컴파일러는 완전히 컴파일하기 전에 고급 언어를 어셈블리어로 번역하여 디버깅 및 최적화 목적으로 어셈블리 코드를 볼 수 있도록 한다.
  • 시스템 프로그래밍 교육: 컴퓨터 구조 및 동작 원리 이해를 위한 학습 도구로 활용된다.
  • 기타: 실시간 시스템, 부팅 코드, 자기 수정 코드 등에도 사용된다.


어셈블리어를 사용하는 목적은 고속화, 소형화, 실시간성(시간적 정확성), 하드웨어 조작, 고급 언어 미지원 명령 사용, 동작 이해 등이다.

4. 2. 현대적 활용

어셈블리어는 고급 언어와는 달리, 다음과 같은 특수한 목적을 위해 여전히 사용되고 있다.[15]

  • 성능 최적화: 최적화 컴파일러가 고급 언어를 어셈블리 수준으로 최적화한다고 해도, 특정 알고리즘이나 하드웨어에 대한 최적화는 어셈블리어가 더 유리할 수 있다. 예를 들어, BLAS를 사용한 선형 대수, 이산 코사인 변환 (예: x264의 SIMD 어셈블리 버전), rav1e (AV1 인코더)[16] 및 dav1d (AV1 디코더)[17] 등에서 어셈블리어가 활용된다.
  • 하드웨어 직접 제어: 고급 언어에서 지원하지 않는 특수 명령어를 사용하거나,[15] 장치 드라이버인터럽트 핸들러와 같이 하드웨어를 직접 조작해야 하는 코드를 작성할 때 사용된다.
  • 실시간 시스템: 실시간 프로그램, 시뮬레이션, 항공 항법 시스템, 의료 장비와 같이 예측 가능한 실행 시간과 낮은 지연 시간을 보장해야 하는 시스템에서 활용된다. 예를 들어, 플라이 바이 와이어 시스템은 엄격한 시간 제약 내에서 원격 측정을 해석하고 적용해야 하므로, 어셈블리어를 통해 예측 불가능한 지연을 제거할 수 있다.
  • 보안: 극도로 높은 보안이 필요한 상황에서, 컴퓨터 바이러스, 부트로더 등 환경을 완전히 제어해야 할 때 어셈블리어가 사용된다.
  • 레거시 코드 유지보수: 과거 어셈블리어로 작성된 시스템을 유지보수하고 확장하는 경우에도 사용된다.[18]


이 외에도, 명령어 집합 시뮬레이터 제작, 리버스 엔지니어링, ROM 해킹 등 다양한 분야에서 어셈블리어가 활용되고 있다.

5. 한국에서의 어셈블리 언어

5. 1. 교육

5. 2. 산업

5. 3. 한계

6. 결론

참조

[1] 서적 Undergraduate Topics in Computer Science Springer International Publishing
[2] 서적 Coding for A.R.C. https://albert.ias.e[...] Institute for Advanced Study, Princeton 2022-11-04
[3] 문서 Other than meta-assemblers
[4] 서적 Data Acquisition Techniques Using PCs Elsevier
[5] 웹사이트 Learn Assembly Language Programming with ARM https://www.freecode[...] 2022-06-21
[6] 문서 However, that does not mean that the assembler programs implementing those languages are universal.
[7] 웹사이트 linux kernel mainline 4.9 sloccount.txt https://gist.github.[...] 2022-05-04
[8] 서적 Xerox Meta-Symbol Sigma 5-9 Computers Language and Operations Reference Manual http://bitsavers.org[...] 2020-06-07
[9] 서적 Sperry Univac Computer Systems Meta-Assembler (MASM) Programmer Reference http://www.bitsavers[...] 2020-06-07
[10] 웹사이트 How to Use Inline Assembly Language in C Code https://gcc.gnu.org/[...] 2020-11-05
[11] 간행물 Improving processor efficiency by statically pipelining instructions https://www.research[...]
[12] 웹사이트 High Level Assembler Toolkit Feature Increases Programmer Productivity https://www.ibm.com/[...] IBM 1995-12-12
[13] 서적 A-Natural Language Reference Manual http://archive.org/d[...] 1980-07-15
[14] 간행물 Oct. 15, 1956: Fortran Forever Changes Computing's Fortunes https://www.wired.co[...] 2024-03-02
[15] 학술지 The Origins of Informatics 1994-03
[16] 웹사이트 rav1e/README.md at v0.6.3 https://github.com/x[...] 2023-02-21
[17] 웹사이트 README.md · 1.1.0 · VideoLAN / dav1d https://code.videola[...] 2023-02-21
[18] 웹사이트 z/OS Version 2 Release 3 DFSMS Macro Instructions for Data Sets https://www-01.ibm.c[...] IBM 2021-09-14
[19] 웹사이트 機械語とアセンブリ言語 http://www.elc.ees.s[...] 2022-12-25
[20] 서적 The C++ Programming Language Addison-Wesley 1986
[21] 서적 Intel Architecture Software Developer’s Manual, Volume 2: Instruction Set Reference http://download.inte[...] INTEL CORPORATION 2010-11-18
[22] 웹사이트 機械語とアセンブリ言語 http://www.elc.ees.s[...] 2022-12-25
[23] 웹사이트 The SPARC Architecture Manual, Version 8 http://www.sparc.com[...] SPARC, International 2012-10-27
[24] 문서 Assemblers and Loaders http://www.davidsalo[...] 1993
[25] 웹사이트 MASM: Directives & Pseudo-Opcodes http://flint.cs.yale[...] 2011-03-19
[26] 서적 Intel Architecture Software Developer’s Manual, Volume 2: Instruction Set Reference http://download.inte[...] INTEL CORPORATION 2010-11-18
[27] 웹사이트 x86 Assembly Guide http://www.cs.virgin[...] University of Virginia 2010-11-18
[28] 문서 goto文
[29] 웹사이트 assembly language: Definition and Much More from Answers.com http://www.answers.c[...] 2008-06-19
[30] 웹사이트 NESHLA: The High Level, Open Source, 6502 Assembler for the Nintendo Entertainment System http://neshla.source[...]
[31] 웹사이트 Z80 Op Codes for ZINT http://www.z80.de/z8[...]
[32] 문서 コンピュータ予約システム
[33] 문서 Dr. H.D. Mills (1970) 提案、Marvin Kessler 実装 in IBM連邦政府システム部門
[34] 웹사이트 Concept 14 Macros http://skycoast.us/p[...] MVS Software 2009-05-25
[35] 문서 Programming the IBM 1401 Prentice-Hall 1962
[36] 서적 systems programming
[37] 서적 bit 単語帳 共立出版 1990-08-15
[38] 문서 "Chapter 12 – Classes and Objects" No Starch Press
[39] 웹사이트 A Dictionary of Computing: "meta-assembler" http://www.encyclope[...]
[40] 서적 System Software: An Introduction to Systems Programming Addison Wesley
[41] 웹사이트 Which Assembler is the Best? http://webster.cs.uc[...] 2007-10-19
[42] 서적 Assemblers and Loaders http://www.davidsalo[...] 2012-01-17
[43] 웹사이트 The IBM 650 Magnetic Drum Calculator http://www.columbia.[...] 2012-01-17
[44] 웹사이트 Speaking with Don French : The Man Behind the French Silk Assembler Tools http://www.radiks.ne[...] 2008-07-25
[45] 뉴스 松 --- 事実上最初のパソコン用日本語ワープロソフト https://xtech.nikkei[...]
[46] 웹사이트 Toolchain, libraries and headers relationship - PlayStation Development Network http://www.psxdev.ne[...]
[47] 웹사이트 What were PS1 and N64 games written in? : gamedev https://www.reddit.c[...]
[48] 웹사이트 SegaBase Volume 6 - Saturn http://www.eidolons-[...] 2013-06-27
[49] PDF Lispによるリターゲッタブルコードジェネレータの実装 (PDF) https://jp.franz.com[...]
[50] 웹사이트 OOエンジニアの輪! ~ 第 21 回 川合史朗 さんの巻 ~ | オブジェクトの広場 https://www.ogis-ri.[...]
[51] 웹사이트 NVIDIA Xbox GPU Specs | TechPowerUp GPU Database https://www.techpowe[...]
[52] 웹사이트 Using Shaders in Direct3D 10 - Win32 apps | Microsoft Docs https://docs.microso[...]
[53] 웹사이트 The Linux Kernel http://tldp.org/LDP/[...] 2012-03-11
[54] 웹사이트 Writing the Fastest Code, by Hand, for Fun: A Human Computer Keeps Speeding Up Chips https://www.nytimes.[...] New York Times, John Markoff 2010-03-04
[55] 웹사이트 Bit-field-badness http://hardwarebug.o[...] hardwarebug.org 2010-03-04
[56] 웹사이트 GCC makes a mess http://hardwarebug.o[...] hardwarebug.org 2010-03-04
[57] 웹사이트 The Great Debate http://webster.cs.uc[...] 2008-07-03
[58] 웹사이트 Code sourcery fails again http://hardwarebug.o[...] hardwarebug.org 2010-03-04
[59] 뉴스 [CEDEC]「FINAL FANTASY XV」の最適化はこうして行われた - GamesIndustry.biz Japan Edition https://jp.gamesindu[...]
[60] 웹사이트 x264.git/common/x86/dct-32.asm http://git.videolan.[...] git.videolan.org 2010-09-29
[61] 웹사이트 GitHub, torvalds / linux, include/linux/export.h https://github.com/t[...] 2023-10-08
[62] 웹사이트 Foreword ("Why would anyone learn this stuff?"), ''op. cit.'' http://www.arl.wustl[...] 2010-03-05
[63] 웹사이트 Assembler language http://www-01.ibm.co[...] IBM Knowledge center
[64] PDF Assemblers and Loaders http://www.davidsalo[...]
[65] 서적 System Software: An Introduction to Systems Programming https://archive.org/[...] Addison Wesley
[66] 문서 "Chapter 12 – Classes and Objects" No Starch Press



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com