C H A P T E R

7
ㅔ

프로그램의 처리

공부할 내용

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

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

★ 리스팅

★ 크로스 레퍼런스

★ 맵

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

★ 소스 프로그램

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

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

(2) 리스팅 : 소스 프로그램의 각 문장과 다른 중요한 정보가 포함되어 있는 어셈블 과정에서 만들어지는 보고서

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

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

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

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

	표 7-1			어셈블러가 사용하는 파일 확장자

확장자	의미
ASM OBJ LST CRF XRF SBR	소스 프로그램 오브젝트 모듈 리스팅 (어셈블러가 생성하는 보고서) 크로스 레퍼런스 정보

링커가 사용하는 파일들

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

	그림 7-2			링커의 입출력

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

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

확장자	의미
OBJ EXE MAP LIB	오브젝트 모듈 실행 가능 프로그램 맵 (링커가 생성하는 보고서) 라이브러리

MS 매크로 어셈블러를 사용한 어셈블/링크 과정

★ MASM 6.0 이전

★ 어셈블 : MASM 명령을 사용한다.

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

★ 링크 : LINK 명령을 사용한다.

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

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

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

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

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

ML DISPLAY.ASM

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

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

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

ML /Fl  DISPLAY.ASM

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

ML /Fm /Fr DISPLAY.ASM

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

ML /c DISPLAY.ASM

리스팅

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

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

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

★ 기계어 : 16진수로 표현

처음 4자리 16진수 : 세그먼트 내의 오프셋

★ 어셈블러는 세그먼트를 시작할 때 오프셋이 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회 반복한다는 뜻

★ 20행 : 스택 세그먼트는 오프셋이 0000H(14행)에서 시작하여 오프셋이 0100H 되는 곳의 바로 앞에서 끝남.

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

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

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

28행 : EQU 지시어는 어셈블러에게 L_MESSAGE라는 심볼에 MESSAGE의 길이와 같은 값을 주라고 지시함.

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

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

예) 68행 : 오프셋 0013H에서 시작하는 명령인 □INT 21□이 CD21H로 변환되어 있음

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

예) INT ∀ CDH, RET ∀ CBH

★ 명령의 형태에 따라 다른 코드로 표시됨

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

57행의 PUSH 명령은 값을 푸쉬 → 6AH

★ 오퍼랜드의 종류

(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□을 의미

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

∀ 오퍼랜드의 완전한 주소는 DS:MESSAGE

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

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

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

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

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

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

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

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

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

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

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

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

크로스 레퍼런스

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

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

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

- 디버깅할 때 유용함

★ CREF 프로그램을 사용해 생성함.

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

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

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

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

맵

★ 링커가 만드는 보고서

★ 맵에서 각 세그먼트가 언급되는 순서는 프로그램을 실행시킬 때 그들이 메모리에 로드되는 순서이다.

	그림 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)바이트이다.

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

프로그램이 시작될 곳의 주소 → 프로그램이 로드되는 곳으로부터의 상대 주소