C H A P T E R

5
ㅔ

어셈블리 언어 프로그램의 구조

공부할 내용

★ 프로그램

★ 설명문

★ 명령문, 지시어

★ 어셈블리 언어의 문장 형식

★ 이름의 용도

프로그래머의 입장에서 보는 프로그램

★ 프로그래머의 입장에서 본 프로그램

- 프로그램 = 명령부분(논리) + 자료부분(명령부분의 처리 대상)

- 프로그램의 명령부분 : 1개 이상의 프로시저로 구성됨

어셈블러의 입장에서 보는 프로그램

★ 어셈블러는 소스 프로그램을 파일로부터 읽고 나서 오브젝트 모듈이 포함되는 다른 파일을 생성한다.

★ 어셈블러가 보는 소스 프로그램

- 한 줄에 한 개씩 쓰여진 문장들의 열로 본다.

- 여러 개의 세그먼트를 정의한다고 본다.

★ 프로그래머 입장의 프로그램 → 어셈블러 입장의 프로그램

프로그램의 명령 부분 → CS에 있음.

프로그램의 자료 부분 → SS, DS, ES에 포함됨.

링커의 입장에서 보는 프로그램

★ 오브젝트 모듈이 들어 있는 한 개 또는 여러 개의 파일

★ 링커의 역할 : 실행 가능한 한 개의 로드 모듈을 생성하는 것

★ 표준화된 오브젝트 모듈을 모아서 □library□라고 불리는 파일에 저장할 수 있다. 프로그래머는 링커로 하여금 library를 검색하여 프로그램에서 필요로 하는 특정 모듈을 추출하여 사용하도록 지시할 수 있다.

어셈블리 과정

★ 어셈블러가 하는 일

- 소스 프로그램으로부터 기계어 프로그램을 생성한다.

- 프로그램에서 사용할 자료가 저장될 장소를 할당한다.

★ 어셈블리 과정

- 어셈블러는 프로그램을 한 줄씩 읽으면서

명령문일 경우 → 대응되는 기계어 명령을 오브젝트 모듈에 추가

자료를 요구하는 경우 → 자료 저장 공간을 오브젝트 모듈에 추가

∀ 오브젝트 모듈에서 명령문들과 자료가 저장될 공간의 순서는 어셈블러가 만나는 프로그램의 줄의 순서에 따름.

설명문

★ 어셈블리 언어 프로그램은 일련의 문장들로 되어 있다.

(1) 설명문(또는 주석문)(comment)

(2) 명령문(instruction)

(3) 지시어(directive)

★ 설명문

- 한 문장 전체가 될 수도 있고, 한 문장의 일부분일 수도 있음

- 어셈블러는 어셈블 할 때 이 설명문을 무시하고 지나간다.

★ 설명문의 형식 : 세미콜론(;)으로 시작한다.

예) ; This line is a comment

예)  MOV  AX, 99           ; Here is a comment

명령문과 지시어

★ 명령문 - 컴퓨터에게 해야 할 일을 지시하는 문장이다.

- 명령문(instruction)은 기계어로 변환될 문장이다.

★ 지시어(directive)

- 어셈블러에게 지시를 내리는 문장이다.

- 의사 연산(pseudo operation)이라고도 함.

- 기계어로 변환되지 않고 단지 어셈블 되는 것을 돕는다.

명령문의 예제 :	ADD     AX,  BX

MOV     SUM, AX

지시어의 예제 :	SUM     DB      1

CSEG    SEGMENT

어셈블리 언어의 문장 형식

★ 일반적으로,

□ 한 행(line)에 한 문장만을 쓴다.

□ 문장은 어떤 열에서 시작하여도 된다.

□ 대소문자를 원하는 대로 선택하여 사용할 수 있다. "Hello"와 같이 따옴표나 작은 따옴표에 싸여 있는 경우를 제외하고는 어셈블러는 대소문자를 구별하지 않는다.

★ 명령문과 지시어

- 최대 3부분으로 나뉜다.

형식 : 이름(name), 연산 코드(operation code), 오퍼랜드(operand)

- 각 부분은 1개 이상의 공백 또는 탭으로 분리됨.

예) ; update the total

NEWSUM	LABEL	NEAR

MOVE	AX, TOTAL

ADD	AX, SUBTOTAL

PUSH	AX

★ 명령문과 지시어는 읽기 쉽도록 대문자로 쓴다.

★ 오퍼랜드가 2개 있는 문장도 있다.

MOV     AX, TOTAL

★ 모든 명령문과 지시어에는 연산 코드가 있다.

(이름이나 오퍼랜드는 항상 있을 필요가 없다.)

이름     연산 코드  오퍼랜드	설명문

↓         ↓        ↓	↓

SETUP	MOV	DX,OFFSET MESSAGE	; setup DX

이름의 용도

★ 명령, 지시어의 이름 : 명령, 지시어가 나타난 곳의 주소를 나타냄

예) GETDATA PROC

★ 어셈블러는 이름을 어떻게 처리하는가?

(1) 새로운 이름을 접할 때마다 그 이름과 그 이름이 나타난 곳의 주소(실제 오프셋)를 symbol table에 추가한다.

(2) 그 이후, 다른 명령문들은 주소 대신에 이미 정의된 이름을 참조할 수 있다. 어셈블러가 나중에 symbol table에서 그 이름을 찾아 해당하는 주소로 대치시킨다.

예) GETDATA가 프로시저의 시작주소로 이미 정의되었다고 하면 아래와 같은 CALL 명령문으로 이 프로시저를 호출할 수 있다.

CALL    GETDATA

예) 어셈블러에게 5개의 메모리 워드를 확보하도록 지시

SUM     DW      5 DUP(?)

- SUM은 5개의 워드 중에서 첫째 워드의 주소이다.

- AX의 값을 이 워드에 복사하려면

MOV     SUM, AX

- AX에 있는 값을 두 번째 워드에 복사하려면

MOV     SUM+2, AX

★ 전방참조(forward reference)

예)        MOV   SUM, AX

…

SUM   DW    5 DUP(?)

이름 정의 규칙

★ 이름의 정의 규칙

□ 이름에는 영문자, 숫자(0-9)와  ?  @  _  $를 사용할 수 있다.

□ 첫째 문자: 0-9 사이의 숫자 사용 금지

□ 이름의 첫자에 @를 사용하지 않는 것이 좋다. (특수 목적 문자)

□ 이름의 첫 31자만 어셈블러가 사용함.

예) HELLO   $MARKET   A12345   LONG_NAME   PART_3

예) 적합하지 않은 예 : LONG-NAME   3_PART

숫자 정의 규칙

★ 숫자는 10진수, 16진수와 2진수로 표현될 수 있다.

★ 10진수

예) MOV     AX, 855

★ 16진수

예) MOV     AX, 855H

(주의) 16진수가 A∼F 중의 한 문자로 시작될 때 0을 앞에 첨가

예) MOV     AX, 0FFH

예) MOV     AX, FFH

★ 2진수

예) MOV     AX, 011010010110B