Transcript chap4

Asm-Chap4-1
4장 어셈블리 프로그램 작성의 기본
• 어셈블러
– 코딩
=>
– (원시코드)
어셈블링
(목적코드)
=> 링킹 => 실행
(실행코드)
• 어셈블리 언어 요소
–
–
–
–
–
설명문
예약어
식별자
문장
지시어
(Comment)
(Reserved Word)
(Identifier)
(Statement)
(Directive)
• 예제 프로그램
• 데이터 정의
• 주의 : 어셈블리 코드 작성시, 디버그와 다르게 숫자는 10진
수를 나타냄. 16진수는 H (123H) 2진수는 B (1010B) 사용
– MOV
AX, 10
Asm-Chap4-2
TITLE
STACKSG
page 60, 132
A04SAM1 Skeleton of an .EXE Program
SEGMENT
PARA STACK ‘Stack’
……….
STACKSG
DATASG
ENDS
SEGMENT
PARA ‘Data’
……….
DATASG
CODESG
MAIN
MAIN
CODESG
ENDS
SEGMENT
PROC
ASSUME
MOV
MOV
…
MOV
INT
ENDP
ENDS
END
PARA ‘Code’
FAR
SS:STACKSG, DS:DATASG, CS:CODESG
AX, DATASG
DS, AX
; Set address of data
; segment in DS
AX, 4C00H
21H
; End processing
MAIN
Asm-Chap4-3
언어 요소
• 설명문
– 세미콜론으로 시작되는 문장
– 판독성을 향상시키나 기계 코드로 번역되지 않음
예) ADD AX, BX ; Accumulate total quantity
• 예약어
–
–
–
–
–
명령어
지시어
연산자
미리 정의된 기호
부록 C 참조
(ADD, MOV, …)
(END, SEGMENT, …)
(FAR, NEAR, …)
(레지스터 이름, .STACK, …)
Asm-Chap4-4
식별자
• 2가지 용도
– 이름 (name): 데이터의 주소를 참조하기 위해서 사용
– COUNTER DB 0
– 레이블 (label): 명령어, 프로시쥬어, 세그먼트의 주소를 참조
– MAIN
PROC
FAR
• 정의 규칙
– 첫번째 문자는 알파벳이나 특수 문자(‘.’은 제외), 다음에는 알파벳,
디지트 혹은 특수 문자가 올 수 있다.
– 특수 문자: ‘?’, ‘_’, ‘$’, ‘@’, ‘.’
– 어셈블러는 @로 시작되는 특수어를 사용한다.
– 식별자의 길이는 최대 31
– 대, 소 문자는 구분이 안된다.
예) TOTAL, QTY250, $P50
Asm-Chap4-5
문장
• 문장의 유형
– 명령어(Instruction): 기계 코드로 번역된다.
– 지시어(Directive): 어셈블러의 특정 행동을 지시
• 문장 형식
식별자
COUNT
P30
연산
DB
MOV
RET
INC
피연산자들
1
AX, 0
BX
;설명문
; define a byte with 0
; move 0 to AX
; return
; increment BX by 1
Asm-Chap4-6
지시어(directives)
• 용도
– 프로그램이 어셈블되고 출력되는 방법을 제어하는 수단
– 어셈블리 과정에서만 사용; 기계 코드로 번역되지 않음
• PAGE
– 형식: PAGE [길이] [, 너비]
– 프로그램의 출력 형태 지정:
• 길이는 페이지당 줄 수, 너비는 줄 당 문자 개수
• 디폴트 값: PAGE 50, 80
• TITLE
– 형식: TITLE 텍스트 [설명문]
– 각 페이지의 두 번째 줄에 텍스트가 출력된다.
SEGMENT 지시어
name
name
Asm-Chap4-7
SEGMENT [ align ] [ combine ] [ ‘class’ ]
…..
ENDS
– align: 세그먼트가 시작되는 경계 명시(디폴트: PARA)
– combine:
• 링킹 단계에서 다른 세그먼트와의 결합 여부 명시
• 다른 어셈블된 프로그램과 결합하고자 할 때 사용
• PUBLIC, COMMON, STACK / 생략 혹은 NONE
– class: 링킹 단계에서 관련된 세그먼트를 그룹화시킬 때
• 데이터, 코드, 스택 세그먼트에 대해서 각각 ‘data’,
‘code’, ‘stack’을 사용
예) name SEGMENT PARA STACK ‘Stack’
Asm-Chap4-8
PROC 지시어
segname
procname
procname
segname
SEGMENT
PROC
…..
ENDP
ENDS
PARA
FAR
– 코드 세그먼트는 한 개 이상의 프러시쥬어를 포함한다
– 프로시쥬어는 PROC 지시어로 정의된다
– PROC의 피연산자 FAR는 이 프로시쥬어가 실행의 시작
점으로 사용된다는 것을 알려준다
– 다른 프로시쥬어의 피연산자는 생략되거나 NEAR이다.
Asm-Chap4-9
지시어
• ASSUME
ASSUME SS:stackname, DS:datasegname, CS:codesegname, ..
– 각 세그먼트의 용도를 알려준다
– SS:stackname은 스택 세그먼트 이름을 SS 레지스터에 연
관시킨다는 것을 의미한다.
• END
END [procname]
– 프로그램 전체에 대한 끝을 명시한다.
– procname은 FAR로 명시된 프로시쥬어 이름이다
– 프로그램이 데이터 정의만을 포함할 경우에는 procname
이 생략된다
Asm-Chap4-10
DS 초기화
MOV AX, DATASG
MOV DS, AX
– 프로그램 시작시 제일먼저 반드시 실행
– 두 개의 MOV를 사용한 이유는 메모리로부터 데이터를
직접 세그먼트 레지스터에 이동시킬 수 없기 때문.
– CS와 SS를 초기화시키지 않은 이유
• EXE. 프로그램을 적재시킬 때, 로더가 CS:IP, SS:SP를
초기화하나 DS, ES를 초기화하지 않기 때문
• 이때 DS, ES는 무슨 값을 가지고 있는가?
Asm-Chap4-11
프로그램 종료
MOV
MOV
INT
AH, 4CH
AL, 00
21H
– AH에는 인터럽트 처리기의 함수 코드가 저장된다.
– AL은 프로그램 실행 결과 코드가 저장된다. 정상적으로
프로그램이 종료되었을 때 0을 돌려주라는 뜻.
– 위의 두 MOV는 한 개의 MOV로 표현될 수 있다:
Asm-Chap4-12
예제 프로그램: 4-2
Asm-Chap4-13
간단한 세그먼트 지시어
• 메모리 모델을 먼저 초기화한다
.MODEL
모델
TINY
SMALL
MEDIUM
COMPACT
LARGE
메모리-모델
코드 세그먼트 수
*
1
1개 이상
1
1개 이상
데이터 세그먼트 수
* (.com용)
1
1
1개 이상
1개 이상
Asm-Chap4-14
간단한 세그먼트 지시어
• 세그먼트 정의 지시어
.STACK
.DATA
.CODE
–
–
–
–
[크기]
[이름]
디폴트 세그먼트 이름: STACK, _DATA, _TEXT
새로운 코드 세그먼트 이름 부여 가능
스택의 디폴트 크기는 1,024 바이트
DS 초기화 코드 변경
MOV AX, @data
MOV DS, AX
• ASSUME 지시어는 자동으로 생성
• 따라서 프로그램에서 ASSUME 지시어 불필요
Asm-Chap4-15
예제 프로그램: 4-3
Asm-Chap4-16
데이터 정의
name
Dn
expression
– Dn: DB, DW, DD, DF, DQ, DT
BYTE, WORD, DWORD, FWORD, QWORD, TWORD
– 식(expression)
FLDA DB ?
FLDB DB 25
FLDC DB 21, 22, 23, 24, 25, 26, …; MOV AL, FLDC + 3
DW 10 DUP(?)
; 20바이트 정의
DB 5 DUP(12)
; 12를 5번 반복(5바이트)
DB 3 DUP(5 DUP(4)) ; 모두 4로 15바이트
Asm-Chap4-17
문자 스트링 표현
– 스트링은 단일 인용 부호나 이중 인용 부호로 표현
– 3개 이상의 문자로 구성된 스트링은 반드시 DB로 정의
– 스트링은 ASCII 코드 형태로 메모리에 저장된다
DB
DB
DB
DB
DB
‘PC’
“PC”
‘Strawberry Jam’
“Crazy Sam’s CD Emporium”
‘Crazy Sam’’s CD Emporium”
Asm-Chap4-18
수치 상수
• 이진수: 수치 다음에 B가 명시된다
• 십진수: D 혹은 생략
– 예제: 125, 125D
• 16진수: H, 첫번째 디지트는 반드시 0 ~ 9
– 예제: 3DH, 0DE8H
• 어셈블러는 모든 수치 값을 이진수로 변환하고, 이
를 16진법으로 표현한다. 즉, 12, hex C, 1100은 동일
한 값을 생성한다
• 문자와 수치 상수간의 차이
예)
DB
DB
‘24’
24
Asm-Chap4-19
데이터 정의 지시어
데이터 정의 단위
byte
word
double word
farword
quadword
ten bytes
지시어
DB
DW
DD
DF
DQ
DT
* 주의: 수치 상수는 2진수로 변환, 16진수로 표현, 역순으로 저장된다
는 것에 주의.
예) DW12345D  3039H 
DD 12345678D  00BC614EH 
Asm-Chap4-20
데이터 정의 지시어
• DT
– packed BCD 수치 값을 정의하는데 사용
– 수치 상수를 16진수가 아닌 십진수로 저장
예) 12345678 
• Fig 4-4: 문자 스트링과 수치 값들의 정의
– Listing의 내용은 DW, DD의 경우 반전 안 함.
• Fig 4-5: Fig 4-4의 데이터가 저장된 형태
EQU 지시어
Asm-Chap4-21
C의 매크로(#define)와 같은 것을 정의한다. 어셈블러는
매크로를 정의된 값으로 대체한다.
예)
FACTOR EQU 12
TABLEX DB FACTOR DUP(?)
LIMITX
TOTSALES
….
TS
MPY
EQU 25
….
MOV CX, LIMITX
DW 0
EQU TOTSALES
EQU MUL
Asm-Chap4-22
어셈블링
• .LST 파일:
– 어셈블 결과로, 번역된 기계 코드와 소스 코드를 보여준다
• 스택 세그먼트
• 데이터 세그먼트
• 코드 세그먼트
• 세그먼트와 그룹 테이블
• 심볼 테이블
– Fig. 5-2, Fig. 5-4
• .CRF 파일
– 프로그램에 정의된 심볼들에 대한 리스트를 보여준다.
– Fig. 5-5
• 오류 진단
Asm-Chap4-23
링킹
• 역할
– 여러 어셈블 모듈을 한 개의 실행 모듈로 결합
– .EXE 실행 모듈을 생성하고 초기화한다
– 링크 맵 생성
Asm-Chap4-24
연습문제
•