C H A P T E R

7
ㅔ

프로그램의 처리

공부할 내용

★ 프로그램의 처리와 실행

★ 어셈블러가 사용하는 파일과 어셈블 과정

★ 링커가 사용하는 파일과 링크하는 과정

★ 배치 파일을 사용한 프로그램의 처리

★ 리스팅 읽는 법

★ 크로스 레퍼런스 만드는 법, 읽는 법

★ 맵 읽는 법

프로그램의 처리와 실행

(1) (에디터를 사용하여) 소스 프로그램을 작성한다.

(2) 소스 프로그램을 어셈블한다.

(3) 어셈블러가 만든 오브젝트 모듈을 링크하여 실행가능 파일로 만든다.

★ 소스 프로그램을 어셈블하고 링크하는 방법

(방법 1) 각 단계 처리를 위한 명령을 순서대로 1개씩 준다.

(방법 2) 프로그래밍 개발 시스템을  사용한다.

어셈블러가 사용하는 파일들

★ 소스 프로그램

★ 어셈블러가 출력하는 파일들

(1) 오브젝트 모듈: 소스 프로그램이 기계어로 변환된 것

(2) 리스팅: 소스 프로그램의 각 문장과 다른 중요한 정보가

포함되어 있는 어셈블 과정에서 만들어지는 보고서

(3) 크로스 레퍼런스를 만드는데 필요한 정보가 담긴 파일

(프로그램에서 정의된 모든 이름, 그 이름이 나타난 문장번호,등)

★ 어셈블러가 항상 생성하는 것: 오브젝트 모듈 뿐.

리스팅과 크로스 레퍼런스는 요구해야만 만들어진다.

	그림 7-1			어셈블러의 입출력

	.ASM →	어셈블러	→ .OBJ
			→ .LST
			.CRF → .XRF .SBR

	표 7-1			어셈블리가 사용하는 확장자

확장자	의미
ASM OBJ LST CRF XRF SBR	소스 프로그램 오브젝트 모듈 리스팅 크로스 레퍼런스 정보

터보 어셈블러를 사용한 어셈블 과정

★  TASM 명령을 사용한다.

형식) TASM 소스 프로그램, 오브젝트 모듈, 리스팅, 크로스 레퍼런스

예) DISPLAY.ASM을 어셈블하기 위한 명령

TASM DISPLAY, DISPLAY, DISPLAY, DISPLAY 또는

TASM DISPLAY.ASM, DISPLAY.OBJ, DISPLAY.LST, DISPLAY.XRF

★ 오브젝트 모듈과 크로스 레퍼런스만을 만드는 명령

TASM DISPLAY, , , DISPLAY

- 원하지 않는 파일명은 생략해도 콤마는 생략할 수 없다.

★ 오브젝트 모듈만 출력하는 명령

TASM DISPLAY

MS, IBM 어셈블러를 사용한 어셈블 과정

★  MASM 명령을 사용한다. (어셈블러 버젼 6.0보다 낮은 경우)

형식) MASM 소스 프로그램, 오브젝트 모듈, 리스팅, 크로스 레퍼런스

예) DISPLAY.ASM을 어셈블하기 위한 명령

MASM DISPLAY, DISPLAY, DISPLAY, DISPLAY 또는

MASM DISPLAY.ASM, DISPLAY.OBJ, DISPLAY.LST, DISPLAY.XRF

★ 오브젝트 모듈과 크로스 레퍼런스만을 만드는 명령

MASM DISPLAY, , , DISPLAY

- 원하지 않는 파일명은 생략해도 콤마는 생략할 수 없다.

★ 오브젝트 모듈만 출력하는 명령

MASM DISPLAY;

★ 세미콜론으로 끝나면, 생략된 파일은 원하지 않는 것으로 해석함

예) MASM DISPLAY, DISPLAY, DISPLAY;

링커가 사용하는 파일들

★ 링커(linker) -- 오브젝트 모듈을 읽어서 실행가능 프로그램을 생성

	그림 7-2			링커의 입출력

	.OBJ → .LIB →	링크	→ .EXE → .MAP

	표 7-2			링커가 사용하는 파일 확장자

확장자	의미
OBJ EXE MAP LIB	오브젝트 모듈 실행 가능 프로그램 맵 라이브러리

★ 링커도 링크 하는 과정에 대한 보고서를 생성한다. 이 보고서는 맵

(MAP)이라고 불린다. 대부분의 경우에 맵은 별로 쓸모가 없다.

터보 어셈블러 프로그램을 링크하는 과정

★ TLINK 명령을 사용한다.

(형식) TLINK 오브젝트 모듈, 실행 가능 프로그램, 맵, 라이브러리

(예) DISPLAY.OBJ 와 MYLIB.LIB 라이브러리를 링크하는 명령

TLINK DISPLAY, DISPLAY, DISPLAY, MYLIB 또는

TLINK DISPLAY.OBJ, DISPLAY.EXE, DISPLAY.MAP, MYLIB.LIB

★ DISPLAY.OBJ와 MYLIB.LIB로부터 실행가능 프로그램만 생성

TLINK  DISPLAY, , , MYLIB

★ 라이브러리를 사용하지 않고 실행 가능 프로그램만을 생성하는 명령

TLINK DISPLAY

MS, IBM 어셈블러 프로그램을 링크하는 과정

★ LINK 명령을 사용한다. (MS 어셈블러 버젼 6.0보나 낮은 경우)

(형식) LINK 오브젝트 모듈, 실행 가능 프로그램, 맵, 라이브러리

(예)  DISPLAY.OBJ 를  MYLIB.LIB 라이브러리와 링크하는 명령

LINK DISPLAY, DISPLAY, DISPLAY, MYLIB 또는

LINK DISPLAY.OBJ, DISPLAY.EXE, DISPLAY.MAP, MYLIB.LIB

★ DISPLAY.OBJ, MYLIB.LIB로부터 실행가능 프로그램만 생성하려면

LINK  DISPLAY, , , MYLIB

★ 세미콜론으로 끝나면, 생략된 파일은 원하지 않는 것으로 해석함

LINK DISPLAY, DISPLAY, DISPLAY;

★ 오브젝트 모듈로부터 실행 가능 프로그램만을 생성 (라이브러리(x))

LINK DISPLAY;

MS 어셈블러 6.0이상으로 어셈블하고 링크하는 과정

★ ML을 사용한다. (MS 어셈블러 버젼 6.0이상)

(형식) ML 소스 프로그램.ASM

(예) DISPLAY.ASM 을 어셈블하고 링크하는 명령

ML DISPLAY.ASM

	표 7-3			정보 파일을 생성하기 위한 ML 옵션

옵션	서비스
/Fl /Fm /Fr	리스팅 파일의 만든다 맵 파일을 만든다 크로스 레퍼런스 정보 파일을 만든다

★ 표 7-3의 옵션을 사용하지 않으면 ML은 리스팅, 맵, 크로스 레퍼런스  중의 어느 것도 만들지 않는다.

★ DISPLAY.ASM을 어셈블, 링크하여 DISPLAY. LST를 생성하려면

ML /Fl  DISPLAY.ASM

★ DISPLAY.ASM을 어셈블, 링크, 맵, 크로스 레퍼런스 파일을 생성

ML /Fm /Fr DISPLAY.ASM

★ 어셈블만하고 링크는 하지 않으려면 /c 옵션을 사용한다.

ML /c DISPLAY.ASM

프로그램의 실행

(방법 1) 프로그램의 이름을 그대로 사용

예) DISPLAY.EXE 를 실행시키려면      DISPLAY

예) DISPLAY.EXE가 \WORK\PROGRAMS 디렉토리에 있는 경우

\WORK\PROGRAMS\DISPLAY

(방법 2) 디버거를 사용하여 실행시킨다.

- 명령을 한 번에 한 개씩 실행시키면서 그때마다 원하는

레지스터나 메모리 공간의 값을 화면에 나타낼 수 있다.

레지스터나 메모리의 값을 변화시킬 수도 있다.

★ 역어셈블(disassembling, unassembling) - 디버거가 기계어 명령으로

부터 원래의 소스 명령을 복원하여 화면에 나타내는 것.

프로그램의 처리: 요약

★ 프로그램은 다음과 같은 단계로 처리된다.

어셈블  →  링크  →  실행

	표 7-4			프로그램을 처리하는데 사용되는 파일의 확장자

확장자	의미
ASM CRF EXE LIB LST OBJ MAP REF SBR XRF	소스 프로그램 크로스 레퍼런스 정보 (MASM) 실행 가능 프로그램 라이브러리 리스팅 오브젝트 모듈 맵 크로스 레퍼런스 보고서 크로스 레퍼런스 정보 (ML) 크로스 레퍼런스 정보 (TASM)

	그림 7-3			어셈블리 언어 프로그램을 처리하기 위하여 MASM과 TASM이 사용하는 입출력 파일들

			.LIB → ― .OBJ →	LINK	→ .EXE → .MAP
	.ASM →	MASM TASM
			→ .LST
			― .CRF → .XRF	CREF TCREF	→ .REF

	그림 7-4			어셈블리 언어 프로그램을 처리하기 위하여 ML이 사용하는 입출력 파일들

	.ASM → .LIB →	ML	→ .EXE → .OBJ → .LST → .MAP ― .SBR →
				CREF	→ .REF

배치 파일을 사용한 프로그램의 처리

:----------------------- GO.BAT -----------------------	:

:  Batch file to process an assembly language program	:

:  Parameters: %1 -- filename of the source program	:

:              %2 -- "/d" run program under debugger	:

:------------------------------------------------------	:

:--Turn off echo and clear the screen

@ECHO OFF

CLS:

:--Make sure that the source file exists

IF EXIST %1.ASM GOTO FOUND

ECHO *** Error:  %1.asm -- file not found

GOTO STOP

:--Assemble the program:

:FOUND

MASM %1;

:--If there was an error, stop

IF ERRORLEVEL 1 GOTO STOP

:--Link the program

link %1;

:--If there was an error, stop

IF ERRORLEVEL 1 GOTO STOP

:--If %2 is "/D", execute the program under the debugger

:--If %2 is empty, execute the program by itself

:--Otherwise, display an error message

IF x%2 == x/D GOTO DEBUGGER

IF x%2 == x GOTO EXECUTE

ECHO *** Error:  Illegal parameter: %2

GOTO STOP

:DEBUGGER

DEBUG %1.EXE

GOTO STOP

:EXECUTE

%1

:--Finished

:STOP

★ GO.BAT은 그 프로그램을 어셈블, 링크, 실행하여 준다.

예) DISPLAY.ASM 프로그램을 어셈블, 링크, 실행하려면

GO DISPLAY

예) 두 번째 파라미터로 /D를 주면 디버거로 프로그램을 실행

GO DISPLAY /D

리스팅 읽는 법: 소개

★ 그림 7-6은 그림 6-1에 있는 프로그램의 리스팅.

★ 페이지의 오른편: 프로그램

페이지의 왼편: 어셈블러가 생성한 기계어와 자료 영역

★ 기계어 프로그램: 16진수로 되어 있다.

처음 4자리 16진수 -- 세그먼트 내의 오프셋이다.

예) 67행: 오프셋 0011H에 생성된 기계어 명령인 B440H가 있다.

★ 어셈블러는 세그먼트를 시작할 때 오프셋이 0000H가 되도록 한다.

(세그먼트를 패러그래프에 정돈)

	그림 7-6			그림 6-1에 있는 프로토타입 프로그램의 리스팅

Microsoft  (R)  Macro Assembler Version 6.00B    07/26/92 21:21:41

DISPLAY -- prototype program                        Page 1 - 1

1	PAGE      58,132

2	;-----------------------------------

3	; DISPLAY

4	;

5	; Purpose:

6	;     to display a message on the screen

7	;-----------------------------------

8

9	; set title and instruction set

10	TITLE  DISPLAY -- prototype program

11	.286

12

13	; ---------------------- STACK segment

14   0000                       SSEG    SEGMENT STACK

15   0000  0020 [                       DB      32 DUP ("STACK---")

16          53 54 41 43 4B 2D

17          2D 2D

18         ]

19

20   0100                       SSEG    ENDS

21

22	; ----------------------- DATA segment

23   0000                       DSEG    SEGMENT

24   0000 48 65 6C 6C 6F 2C     MESSAGE DB       "Hello, how are you?",0DH,0AH

25        20 68 6F 77 20 61

26        72 65 20 79 6F 75

27        3F 0D 0A

28   0015 = 0015                L_MESSAGE EQU   $-MESSAGE

29   0015                       DSEG    ENDS

30

31	; ----------------------- CODE segment

32   0000                       CSEG    SEGMENT 'CODE'

33                                      ASSUME  CS:CSEG, SS:SSEG, DS:DSEG

34

------------------------------------------------------------

Microsoft  (R)  Macro Assembler Version 6.00B    07/26/92 21:21:41

DISPLAY -- prototype program                        Page 2 - 1

35                                      PAGE

36                              ; -------------------------------------

37                              ; MAIN (main program)

38                              ;

39                              ; Purpose:

40                              ;    to display a message on the screen

41                              ;

42                              ; Input:

43                              ;    -- none --

44                              ;

45                              ; Output:

46                              ;  the message is displayed on the screen

47                              ;

48                              ; Procedures:

49                              ;    -- none --

50                              ; --------------------------------------

51

52                              ; Procedure: MAIN

53   0000                       MAIN    PROC    FAR

54

55                              ; save address to return to DOS

56   0000  1E                           PUSH    DS

57   0001  6A  00                       PUSH    0

58

59                              ; set up segment register

60   0003  B8 ---- R                    MOV     AX,DSEG

61   0006  8E D8                        MOV     DS,AX

62

63                              ; display the message

64   0008  BB 0001                      MOV     BX,0001H

65   000B  BA 0000 R                    LEA     DX,MESSAGE

66   000E  B9 0015                      MOV     CX,L_MESSAGE

67   0011  B4 40                        MOV     AH,40H

68   0013  CD 21                        INT     21H

69

70                              ; return to DOS

71   0015  CB                           RET

72

73                              ; End of Procedure: MAIN

74   0016                       MAIN    ENDP

75

76                              ; End of Code segment

77   0016                       CSEG    ENDS

78

79                              ; ----------------------- End of program

80                              END MAIN

------------------------------------------------

Microsoft  (R)  Macro Assembler Version 6.00B    07/26/92 21:21:41

DISPLAY -- prototype program                        Symbols 3 - 1

Segments and Groups:

N a m e            Size     Length  Align    Combine Class

CSEG . . . . . . . . . . . . . .    16 Bit   0016     Para    Private

DSEG . . . . . . . . . . . . . .    16 Bit   0015     Para    Private

SSEG . . . . . . . . . . . . . .    16 Bit   0100     Para    Stack

Microsoft  (R)  Macro Assembler Version 6.00B    07/26/92 21:21:41

DISPLAY -- prototype program                        Symbols 4 - 1

Procedures, parameters and locals:

N a m e             Type    Value   Attr

MAIN . . . . . . . . . . . . . .    P Far   0000    CSEG Length= 0016 Public

Microsoft  (R)  Macro Assembler Version 6.00B    07/26/92 21:21:41

DISPLAY -- prototype program                        Symbols 5 - 1

Symbols:

N a m e             Type    Value   Attr

L_MESSAGE  . . . . . . . . . . . .  Number  0015h

MESSAGE  . . . . . . . . . . . . .  Byte    0000    DSEG

0 Warnings

0 Errors

리스팅 읽는 법: 스택 세그먼트

★ 14행: 스택 세그먼트의 첫째 줄

- 스택의 오프셋이 0000H에서 시작

★ 15행: 스택 공간으로 256바이트를 확보하는 DB 문장이다.

0020 [53 54 41 43 4B 2D 2D 2D]

- 이는 대괄호 안의 8개의 16진수가 20H회 반복한다는 뜻

★ DB (또는 유사한) 지시어를 사용하여 메모리 공간을 확보할 때마다

리스팅에는 그 바로 왼편에 실제 값을 나타난다.

★ 20행: 스택 세그먼트는 오프셋이 0000H(14행)에서 시작하여

오프셋이 0100H 되는 곳의 바로 앞에서 끝남.

리스팅 읽는 법: 데이터 세그먼트

★ 데이터 세그먼트는 23∼29행에 정의되어 있다.

23행: 오프셋이 0000H임 (새로운 세그먼트의 시작)

24행: 메시지를 저장할 바이트를 확보하는 지시어

24∼27행의 왼편: 이 바이트에 저장될 값

28행: EQU 지시어는 어셈블러에게 L_MESSAGE라는 심볼에

MESSAGE의 길이와 같은 값을 주라고 지시함.

리스팅 읽는 법: 코드 세그먼트

★ 코드 세그먼트는 32행에서 시작한다.

- 오프셋이 다시 0000H으로 바뀜 (새로운 세그먼트)

- 처음 명령은 오프셋이 0000H에서, 두 번째 명령은 0001H에서,

세 번째 명령은 0003H에서, 마지막 명령은 0015H에서 시작한다.

★ 코드 세그먼트의 범위: 0000H - 0015H

★ 오프셋의 바로 오른편에는 생성된 실제 기계어가 나타나 있다.

예) 68행: 오프셋이 0013H에서 시작하는 명령인

□INT 21□이 CD21H로 변환되어 있음

★ 각 기계어 명령의 첫째 바이트 = 연산 코드

예) 68행 INT => CDH,  71행 RET => CBH

★ 명령의 형태에 따라 다른 숫자로 표시됨

예) 56행의 PUSH 명령은 레지스터의 값을 스택에 푸쉬한다. (1EH)

57행의 PUSH 명령은 값을 푸쉬한다. (6AH)

★ 오퍼랜드가 있는 명령

61행: 기계어 명령: 8ED8H (8EH - 연산 코드, D8H - 오퍼랜드)

★ 오퍼랜드의 종류

(1) 메모리의 어떤 장소

PUSH    TEST

(2) 레지스터

PUSH    AX

(3) 값  -- 즉치 오퍼랜드 (immediate operand)

PUSH    5

예) 57행: 0을 스택에 넣음(연산코드 - 6AH, 넣을 값 -  00H)

(4) 주소

예) 65행: MESSAGE의 오프셋을 오퍼랜드로 사용한다.

MESSAGE의 오프셋은 0000H(24행) ==> BA0000H

MESSAGE의 오프셋이 218AH라면  ==> BA218AH

★ 65행(0000H): 주소뒤의 □R□ - □Relocatable□을 의미.

프로그램이 로드될 때까지 그 값이 결정되지 않는 주소

예) 65행: 오퍼랜드의 완전한 주소는 DS:MESSAGE

DS의 값은 프로그램이 메모리에 로드되어야 결정됨.

★ 60행: 오퍼랜드가 □----□으로 표시되었음

□----□는 세그먼트의 주소를 표시함, 재배치 가능함

리스팅 읽는 법: 마지막 페이지

★ 프로그램에서 정의된 모든 이름에 대한 정보가 들어 있다.

(1) 각 세그먼트의 이름과 그 세그먼트에 대한 정보가 있음

예) SSEG => 패러그래프에 정돈, 길이는 0100H인 스택 세그먼트

(2) 세그먼트 이외의 이름과 이들에 대한 설명

- 프로시저 MAIN, 심볼 L_MESSAGE와 MESSAGE

- 설명 : 자료형, 값, 특성, 등

예) MAIN의 형(Type) =  □P Far□

★ 발생한 □경고(warning)□와 □에러(error)□의 요약이 있음

크로스 레퍼런스 만드는 법

★ 프로그램에서 사용된 모든 이름을 보여주는 보고서이다.

- 이름 옆에는 그 이름이 나타난 모든 문장의 행번호가 있다.

- 디버깅할 때 유용함

★ 크로스 레퍼런스를 만들려면: CREF 프로그램을 사용

(터보 어셈블러를의 경우, TCREF)

★ CREF 프로그램은 크로스 레퍼런스 정보 파일을 읽은후 보고서 작성

★ 크로스 레퍼런스 보고서가 담길 파일 이름의 확장자: REF

★ 크로스 레퍼런스 프로그램의 사용법

(형식) CREF 정보 파일의 이름, 보고서 파일에 붙일 이름

(예) MASM을 사용, DISPLAY.ASM으로부터 크로스 레퍼런스

정보를 생성시킨 상태에서 크로스 레퍼런스 보고서를 작성하려면

CREF DISPLAY.SBR, DISPLAY.REF 또는

CREF DISPLAY.CRF, DISPLAY.REF

★ 입력, 출력 파일의 이름이 동일한 경우

CREF DISPLAY.SBR; 또는

CREF DISPLAY.CRF;

★ 터보 어셈블러

TCREF DISPLAY.XRF, DISPLAY.REF 또는

TCREF DISPLAY, DISPLAY 또는

TCREF DISPLAY

크로스 레퍼런스 읽는 법

★ 프로그램에서 사용된 모든 이름이 알파벳 순서로 나타나 있다.

이름옆에 그 이름이 있는 곳의 행번호(소스프로그램의 행)가 있다.

이름이 정의된 곳의 행번호는 # 표시가 되어 있다.

예) MESSAGE : 세 번 나타남 (20행, 21행과 58행)

★ 큰 프로그램을 가지고 작업할 때 상당히 유용하게 쓰임

	그림 7-7			그림 6-1에 있는 프로토타입 프로그램의 크로스 레퍼런스

Microsoft Cross-Reference Version 6.00  Tue Jul 28  11:47:37  1992

Symbol Cross-Reference              (#   definition)   Cref-1

\examples\display.asm

\examples\display.asm. . . .      1#

CSEG

\examples\display.asm. . . .     25#     26     70

DSEG

\examples\display.asm. . . .     19#     53     22     26

L_MESSAGE

\examples\display.asm. . . .     21#     59

MAIN

\examples\display.asm. . . .     46#     67     73

MESSAGE

\examples\display.asm. . . .     20#     58     21

SSEG

\examples\display.asm. . . .     14#     16     26

맵 읽는 법

★ 링커가 만드는 보고서이다 - 대체로 맵을 볼 필요가 없다.

★ 맵에서 각 세그먼트가 언급되는 순서는 프로그램을 실행시킬 때

그들이 메모리에 로드되는 순서이다.

	그림 7-8			그림 6-1에 있는 프로토타입 프로그램에 대한 맵

Start   Stop    Length  Name  Class

00000H  000FFH  00100H  SSEG

00100H  00114H  00015H  DSEG

00120H  00135H  00016H  CSEG

Address           Publics by Name

0012:0000        MAIN

Address           Publics by Value

0012:0000        MAIN

Program entry point at 0012:0000

★ 세그먼트의 길이는 바이트 단위로 표시된다.

스택 세그먼트: 100H(10진수로 256)바이트

데이터 세그먼트: 15H(10진수로 21)

코드 세그먼트: 16H(10진수로 22)바이트이다.

★ □start□와 □stop□이 있는 열 - 세그먼트의 시작 주소와 끝 주소

★ □프로그램 엔트리 포인트(program entry point)□ -

프로그램의 실행이 시작될 곳의 주소 (프로그램이 로드되는 곳으로

부터의 상대 주소)

예) 시작 주소는 0012:0000 =>  CS:IP의 초기값이 됨