어셈블리어란? 기계어에 가까운 저급언어로 기계어와 1대1 대응이 되는 프로그래밍 언어다.
기계어는 1과 0으로만 이루어진 2진수 형태의 언어다.
고급 프로그래밍 언어로 쓰인 원시코드(source code)는 컴파일하여 목적 코드(기계어)로 번역해주어야만 컴퓨터가 인식하고 해당 연산을 수행한다.
** 컴파일러는 보조기억장치에 저장되어 있는 원시코드를 한꺼번에 목적코드로 번역하여 주기억장치에 적재한다.
아래와 같이 고급언어로 프로그래밍을 진행했을 땐 번역시 컴파일 과정을 거치지만 저급 언어, 즉 어셈블리어를 이용하여 프로그래밍을 진행했을 땐 어셈블 과정을 거치게 된다.
어셈블리어는 컴퓨터 각 장치들의 구체적 동작을 제어하며 기계어 하나에 하나의 니모닉 명령어를 사용한다.
** 니모닉 명령어 : 기계어와 대응되는 명령 기호들 ---- ex) ADD, MOV, SUB
주로 시스템프로그래밍에 사용되며 하드웨어 이해에 적합하다.
어셈블리어 문장 작성 방식에는 두 가지가 있다.
어셈블리 지시어
어셈블리 명령어
기계어로 번역되지 않고, 기계에 의해 실행되지도 않음
ex ) 변수 정의용 기호 DW, DQ, DD .. etc
기계어로 번역되어 기계에 의해 실행된다.
ex ) ADD, MOV .. ect
다음은 숫자를 표현하는 방식이다.
다음은 상수를 정의할 때 재정의가 불가한 케이스와 가능한 케이스를 구분한 예시이다.
보다시피 레이블 상수를 정의하는 방법에는 2가지가 있다.
EQU
= ( 등호 사용 )
변수를 정의하는 방법에는 5가지가 있다.
(레이블 이름) DB 식 : 해당 레이블에 1byte 크기의 기억장소 확보하고, 식 값을 기억
(레이블 이름) DW 식 : 워드 ( 2byte ) 확보하고 해당 레이블에 식 값 기억
(레이블 이름) DD 식 : 2워드 ( 4byte ) 확보하고 해당 레이블에 식 값 기억
(레이블 이름) DQ 식 : 4워드 ( 8byte ) 확보하고 해당 레이블에 식 값 기억
(레이블 이름) DT 식 : 10 byte 확보하고 해당 레이블에 식 값 기억
다음은 프로그램의 기본 형태이다.
CMP A, B
J( something ) < 분기될 주소 >
// Compare A, B --- A, B 를 비교해서 ( A - B해보고 ) Something 하면 <> 주소의 명령을 실행해라
CMP를 사용하면 연산항을 비교한 값이 플래그 레지스터 ( FR ) 에 세팅된다. 이후 J(?) 값에 의해 판별되고 해당하면 뒷 주소로 분기된다.
if ( ~ ) { return ~ } 구문의 오리지널 버젼이다.
J값 뒤에 붙일 수 있는 값들은 다음과 같다.
다음은 이를 활용한 예시다.
JMP <> // <>로 무조건 분기
ex ) JMP OVER // 주소 OVER로 분기