Assembly Language (어셈블리어)¶
1세대 programming code인 machine code의 뒤를 이어 등장한 2세대 programming code임.
- 1949년 EDSAC에서 사용된 Initial Orders 가 컴퓨터용 최초의 어셈블리 언어로 간주되며, 이는 최초로
machine code
명령어를 사람이 읽을 수 있는 형태로 표현하여 프로그래밍을 단순화하였음. - 이후 1951년 Symbolic Assembly Program (SAP)이 IBM 701 컴퓨터용으로 개발되었고 이는 최초의 상용 어셈블러로 알려짐.
특징¶
Machine code
와 1:1로 대응하는 Mnemonic 언어임.
- Machine code의 bit pattern 들의 조합 대신 간단한 영어단어에 해당하는 mnemonics를 사용.
- address에 label을 붙여서 보다 기억하기 쉽고 효율적인 프로그래밍이 가능해짐.
- comment가 가능해짐 (가독성 대폭 향상됨)
기억하기 쉽도록 machine code 의 instructor에 상징적인 기호 (영어단어로 생각하면 쉬움)를 할당한 것임.
다음과 같은 대응이 이루어짐.
기계어
Assembly code
- 위는 x86 Assembly code이며,
- AX (Accumulator register)의 하위 8비트인
al
에 - 16진수로 표현된
61
(=97)을 복사하라는 명령어.
매우 실행 속도가 빠르며, 약간의 호환성(메인 프레임과 유닉스 간)을 가짐.
Assembler 란?¶
Assembly code 로 작성된 source code를 읽어들여서 해당하는 machine code code (binary code)를 생성해주는 프로그램.
- Assembly code에서 사용된 symbol과 label을 실제 binary pattern으로 바꾸어줌.
최초의 assembler는 machine code로 작성되었음. 해당 assembler를 이용하여 assembly code로 좀 더 나은 assembler를 만들고, 이 assembler를 이용하여 assembly code로 좀 더 나은 assembler를 만드는 식으로 개선이 이루어짐.
이같은 개선을 bootstrap (or boot)이라고도 한다. 좀더 자세한 건 다음 URL 참고 : Bootstrap
사용분야¶
80196과 같은 Micro-controller 혹은 firmware 프로그래밍에서 꽤 자주 사용됨.
Examples¶
Hello World를 출력하는 C 소스코드 에 대응하는 Assembly code program.
_main:
push ebp
mov ebp, esp
push sHelloWorld ; 명령어와 주석을 조합할 수 있습니다.
call print_string ; print_string 프로시저를 호출합니다.
mov eax, 0
; 빈 줄에도 주석을 달 수 있습니다.
; 프로세스가 0 이외의 값을 반환하면
; 정상적으로 종료되지 않은 것으로
; 간주하기 때문에, 반환 값을 언제나
; 0으로 맞춰주어야 합니다.
end1: mov esp, ebp ; 구문의 모든 요소를 적용한 명령입니다.
end2: pop ebp
end3: ret ; 프로시저를 반환합니다.
end4: ; _main의 경우 프로그램이 종료됩니다.
Fibonacci sequence에 해당하는 Assembly code program.
load #0
store first
load #1
store second
again:
load first
add second
store next
load second
store first
load next
store second
cmp #200 ;200까지만 계산.
ble again ; 작거나 같은 경우 agina label로 jump
first: bss 1 ; memory 할당.
second: bss 1
next: bss 1