제5강 내용

Download Report

Transcript 제5강 내용

Lecture #4
어셈블리어 (1)
- 8086 매크로 어셈블리어
1
시스템프로그래밍
프로그래밍언어 계층

프로그래밍 언어



인간과 컴퓨터 사이에서 의사 전달을 하는 수단
컴퓨터 프로그램 작성
프로그래밍 언어 계층(Fig.4-1 참조)

고급 언어(High-level Language)



중급 언어(Middle-level Language)



고급 언어와 저급 언어 사이의 프로그래밍 언어
C, FORTH 등
저급 언어(Low-level Language)


2
인간이 사용하는 자연어에 가까운 프로그래밍 언어
BASIC, ADA, FORTRAN, PASCAL, C++, JAVA 등
기계에 종속된 언어
기계어, 어셈블리어 등
시스템프로그래밍
고급언어 & 중급언어 (1)

고급언어로 작성된 프로그램은 기계어 코드로 번역되어
실행된다
소스 파일
- 소스 코드
a.c
b.c
d.c
Compiler
목적 파일
- 목적 코드
a.o
b.o
d.o
libs
linker
실행 파일
(Loadable File)
- Machine Code
/ Binary Code
3
t.exe
loader
Main
Memory
t.exe
CPU
시스템프로그래밍
고급언어 & 중급언어 (2)

고급언어 프로그램의 번역

컴파일러(Compiler)




원시 코드를 한꺼번에 번역하여 이진 코드를 생성하고 실행
컴파일 시간이 많이 요구
한번의 컴파일 과정을 통해 반복적으로 프로그램 실행이 가능
 반복 실행 시에 실행 시간을 단축
인터프리터(Interpreter)

원시 코드를 한줄씩 번역하면서 실행
• 번역과 실행을 동시에 실행


4
번역 시간이 짧다
반복 실행 시에 매번 번역하여 실행함에 따라 실행 시간이
길어진다
시스템프로그래밍
저급언어

어셈블리어(Assembly Language)


2진수 형태의 기계어를 기호형식의 명령어로 표현한 언어
Machine Code  Mnemonic Code
e.g) in 8086 Processor
100010  MOV
000000  ADD
001010  SUB

기계어 코드와 어셈블리어 코드 사이에는 1:1 대응 관계

어셈블러(Assembler)


5
어셈블리어 프로그램을 기계어 명령어로 번역
컴파일러보다는 단순
시스템프로그래밍
고급언어와 저급언어에서의 번역
고급언어 사용
자연어
고급
언어
저급
언어
기계어
6
(프로그래밍)
원시
코드
:1
컴파일러
목적
코드
:n
저급언어 사용
(프로그래밍)
원시
코드
:1
어셈블러
목적
코드
:1
시스템프로그래밍
프로그래밍 언어의 선택

프로그래밍을 위한 언어 선택


작성하려는 응용의 특성을 적절하게 고려하여 선택
고급 언어
1.
2.
3.
소스수준의 호환성
배우기 쉽고 코딩이
용이
최적화된 기계어
코드로 번역이 어려움
 실행 시간이 길어짐

저급 언어
1.
2.
3.
4.
7
기계에 종속 
호환성이 떨어짐
코딩이 어려움
최적화된 코드 작성이
가능  실행 시간이
짧아짐
시스템 프로그램
작성에 이용
시스템프로그래밍
8086 어셈블리어 개요(1)

8086 어셈블리 언어의 문장

명령어(Instructions)

니모닉 코드(Mnemonic Code) – 기계어 코드로 번역되어
CPU에서 실행되는 명령어


어셈블리 프로그램의 본체를 구성
지시어(Directives)

의사 코드(Pseudo Code) – 어셈블러에게 프로그램과 관련된
정보를 제공하거나 특정 기능을 수행토록 지시하는 코드
8

어셈블리 프로그램의 틀을 구성

어셈블 및 링트 시에 참조되는 코드
시스템프로그래밍
8086 어셈블리어 개요(2)

8086 어셈블리 프로그램
어셈블리
명령어
기계어 코드로
변환
어셈블러
기계어 코드  CPU에서 실행되어 데이터를 처리
어셈블리어
프로그램
어셈블리
의사코드
어셈블 및
링크 작업시에
참조
어셈블러
의사코드  어셈블리 명령어에 대한 기계어 코드
변환 작업 방식을 지시
9
시스템프로그래밍
8086 어셈블리어 개요(3)

10
어셈블리 명령어 문장의 구성
시스템프로그래밍
8086 어셈블리어 개요(4)

11
명령어 : 종류에 따라서 1 ~ 6 Byte
시스템프로그래밍
8086 어셈블리어 개요(5)

명령어(instruction)의 형식

연산항의 개수로 3가지로 분류

0 개의 연산항


1개의 연산항


e.g) DEC CX
2개의 연산항

12
e.g) CLC
e.g) MOV AX, BX
시스템프로그래밍
2-번지 명령어 예
출발항
MOV AL, BL
MOV AX, BX
16 8 7
0
34
BX 1 2
16 8 7
0
34
BX 1 2
BH
목적항 AX 0 0
AH
출발항
BX 1 2
BH
목적항 AX 0 0
AH
13
BL
00
실
행
전
BH
AX
BL
34
AL
실
행
후
00
AH
AL
BX 1 2
BH
34
AL
34
00
BL
AX
12
BL
34
AH
AL
시스템프로그래밍
8086 어셈블리어 개요(6)

8086 명령어 종류










14
데이터 전송 명령 – MOV
산술연산 명령 – ADD, ADC, SUB, SBB, MUL, DIV, INC, DEC
논리연산 명령 – AND, OR, XOR, NOT, NEG
비트연산(시프트) 명령 – SHL, SHR, SAR, ROL, ROR, RCL,
RCR
비교 분기 명령 – CMP, TEST, JMP, JE, JNE, JAE, LOOP,
LOOPE, LOOPNE, CALL, RET
스트링 명령 – LODSB, STOSB, MOVSB, MOVSW
I/O 명령 – IN, OUT
인터럽트 명령 – INT, IRET
CPU 제어 명령 – WAIT, ESC, LOCK, HLT, NOP
그외 명령 – PUSH, POP, XCHG, XLAT
시스템프로그래밍
8086 어셈블리어 개요(7)

주소 지정 방식(Addressing Mode)

명령어의 연산항은 명령어 수행에 필요한 데이터를
표시하거나 데이터가 저장된 주소를 지정

15
데이터를 표시하는 주소 모드

상수값 지정(Immedimate data addressing mode)

직접 주소 지정(Direct addressing mode)

간접 주소 지정(Indirect addressing mode)
•
레지스터 간접주소 지정
•
베이스 주소 지정
•
인덱스 주소 지정
•
베이스 인덱스 주소 지정
시스템프로그래밍
어셈블리 프로그램의 기본구성
MAIN SEGMENT
ASSUME CS:MAIN
프로그램 블록
MAIN ENDS
END
16
시스템프로그래밍
문자 A를 출력하는 프로그램 예
지시어
1 MAIN SEGMENT
2
ASSUME CS : MAIN
3
MOV DL, ‘A’
4
MOV AH, 2
5
INT 21H
6
MOV AH, 4CH
7
INT 21H
8 MAIN ENDS
9
END
17
프로그램 본체:
어셈블리 명령어
지시어
시스템프로그래밍
지시어 (directives) (1)

출력 제어 지시어 listing control directives

PAGE [length] [, width]





TITLE text (60자까지), SUBTTL text (60자까지)
예) PAGE 60, 130
TITLE HEX TO BINARY CONVERSION
프로시저 지시어 PROC directive

proc-name PROC [type]




18
디폴트: 50, 80
“PAGE” 만 쓰면 다음 페이지로 넘어감
코드 세그먼트 내에서 서브루틴 구현
명령 CALL에 의해 진입. RET에 의해 돌아감
type: NEAR(디폴트) | FAR
지시어 ENDP로 끝남
시스템프로그래밍
지시어 (directives) (2)

세그먼트 지시어 segment directive

seg-name SEGMENT [align combine 'class']


세그먼트의 시작 표시
정렬 유형(align type) : 시작 경계
• PARA: 패러그래프 경계(디폴트)
• BYTE | WORD | DWORD | PARA | PAGE(100H)

결합 유형(combine type) : 어셈블리 후 링크 시에 다른
세그먼트와의 결합 여부
• NONE(디폴트) | PUBLIC | STACK | COMMON | AT

클래스 유형(class type) : 링크할 때 같은 클래스의
세그먼트끼리 합침
• code | stack | data

19
지시어 ENDS로 끝남
시스템프로그래밍
지시어 (directives) (3)

예) 세그먼트와 프로시져
Codename SEGMENT PARA 'code'
subroutinename PROC FAR
:
subroutinename ENDP
Codename ENDS
20
시스템프로그래밍
지시어 (directives) (4)

기타 지시어

ASSUME seg-reg:seg-name [, ...]





END [proc name]


전체 프로그램을 종료할 때 사용
name GROUP seg-name [, segname]

21
세그먼트 이름과 세그먼트 레지스터를 연계시키도록 지시함
seg-reg : CS | DS | ES | SS | FS | GS
seg-name : segment names | NOTHING | GROUPS
예) ASSUME CS:CODESG, DS:DATASG, SS:STACK
같은 유형의 여러 세그먼트를 하나의 이름하에 한 세그먼트에
위치하게 함 (통상 데이타)
시스템프로그래밍
지시어 (directives) (5)

단순화된 세그먼트 지시어

.CODE [name] - 코드 세그먼트 정의 (모든 실행 코드)

.DATA - 데이타 세그먼트 정의 (near data 용)

.STACK [size] - 스택을 정의 / 디폴트 값은 1KB

.MODEL memory-model

디폴트 세그먼트, ASSUME 및 GROUP 문장을 생성

memory models: (다음 쪽)
TINY | SMALL | MEDIUM | COMPACT | LARGE | HUGE
22
시스템프로그래밍
지시어 (directives) (6)

23
Memory Model
Model
# of code
segments
# of data segments
TINY
-
-
SMALL
1
1
MEDIUM
>1
1
COMPACT
1
>1
LARGE
>1
>1 (array size < 64K)
HUGE
>1
>1 (array size > 64K)
시스템프로그래밍
지시어 (directives) (7)

단순화된 세그먼트 지시어(계속)


.STARTUP : 세그먼트 레지스터를 초기화하는 명령 생성
.EXIT : 프로그램을 마칠 때


INT 21H function 4CH 명령 생성
예)
.MODEL SMALL
.STACK 100
.DATA
[데이타 항목]
.CODE
[명령]
END
24
시스템프로그래밍
지시어 (directives) (8)

데이타 할당 지시어 data allocation directives

데이타의 표현

문자열 : 작은 따옴표(' '), 따옴표(" ") 사용 character strings
• 예) 'This converts ... ' "in 1950's ..."

10진수 : 그냥 쓰거나 뒤에 D를 붙임 (MASM 6.0에서는 T도
사용)
• 예) 578 혹은 578D

16진수 : 처음 숫자가 A∼F일 때는 0을 붙임. 뒤에 H를 붙임
• 예) 3AH, 0C38DH

2진수 : 뒤에 B를 붙임 (MASM 6.0에서는 Y도 사용)
• 예) 00110010B


실수 : 뒤에 R을 붙임
DUP 연산자 : 반복된 데이타 표현
• 예) 10 DUP('K'), 2 DUP(?)
25
시스템프로그래밍
지시어 (directives) (9)

데이타 할당 지시어 data allocation directives

ORG expression



위치 카운터의 내용값을 바꿔줌. 예) ORG 0
프로그램의 시작 주소를 지정
name EQU expression, name EQU <string>



데이타 이름, 변수 등을 다른 이름이나 값으로 재정의함
주소 상수(constant)를 정의
예)
FIVE
SUM
SUBJ
26
EQU
EQU
EQU
5
TOTAL
<'System Prog'>
시스템프로그래밍
지시어 (directives) (10)

데이타 할당 지시어 data allocation directives

데이타의 정의








데이타 정의 양식


27
데이터를 정의하거나 데이터 영역을 위한 메모리 확보를 위해 사용
DB(Define Byte), BYTE
DW, WORD : 2 바이트
DD, DWORD : 4 바이트(doubleword)
DF, FWORD : 6 바이트(farword)
DQ, QWORD : 8 바이트(quadword)
DT, TWORD : 10 바이트(tenbytes)
[name] directive (Dn) expression
[name] directive (Dn) repeat-count DUP(exp)
시스템프로그래밍
지시어 (directives) (11)

데이타 할당 지시어 data allocation directives

예)
UNK
VALU
SEQ
A
B
C
28
DB
BYTE
DW
WORD
BYTE
DB
?
; 초기화되지 않은 항목
40
; 초기화된 항목
1000, 2000, 3000, ...
100 DUP(?)
; 초기화되지 않은 워드 100개
2 DUP(3 DUP(4)) ; ‘4’가 6 개
'Data definition' ; 문자열
시스템프로그래밍
지시어 (directives) (12)

기타 연산자

OFFSET operator



SEG operator


29
해당 세그먼트로부터 레이블이나 변수의 거리를 반환
예)
move bx,offset data_x ; bx points to data_x
레이블이나 변수가 속한 세그먼트(의 주소)를 반환
예)
push ds
; save DS, currently used segment
mov ax,seg list ; set DS to segment of list
mov ds,ax
mov bx,offset list ; get the list’s offset
…
; perform list processing
pop ds
; restore DS
시스템프로그래밍
지시어 (directives) (13)

기타 연산자(계속)

PTR operator

피연산자의 크기를 명시
BYTE PTR, WORD PTR, DWORD PTR, …

예)
• dec [bx] 의 경우 bx가 가리키는 것이 바이트인지 워드인지 알 수
없을 수 있다
• dec word ptr [bx] 라고 하면 워드 타입의 데이터임을 명시
30
시스템프로그래밍
지시어 (directives) (14)

기타 연산자(계속)

LABEL directive

변수의 디폴트 타입을 재정의할(override) 때 사용
var_name label byte/word/dword/qword/tbyte

예)
byte0
word0
word1
byte1
byte2
31
label byte
dw 4567h
label word
db 41h
db 20h
…
mov al,byte0 ; al  67h
mov bx,word1 ; bx  2041h
low address
byte0
word1
67
45
41
20
word0
byte1
byte2
high address
시스템프로그래밍
시스템 호출 (system call)

시스템 호출

운영체제가 제공하는 서비스(기본 서비스 함수)을 사용하기
위한 방법


e.g) 입출력을 위한 시스템 호출
MS-DOS에서는 소프트웨어 인터럽트를 사용하여 시스템
호출을 제공


인터럽트 타입 21H
예) 화면에 문자 ‘A’을 출력
MOV
MOV
지정
INT 21H

DL, ‘A’ ; 전달할 데이터를 DL 레지스터에 지정
AH, 02H ; 서브커맨드(subcommand)를 AH 레지스터
; 인터럽트 호출
subcommand(or function number)
• 01H : 키보드 문자 입력,
02H : 화면에서의 문자 출력
• 06H : 콘솔에서의 문자 입력, 09H : 화면에서의 문자열 출력
• 0AH : 콘솔에서의 문자열 입력
32
시스템프로그래밍
어셈블리 프로그램의 구조(1)

어셈블리 프로그램의 구조
header
stack segment
data segment
code segment
ending

헤더부


33
페이지의 규격, 제목 등을 명시
예) PAGE 50, 120
시스템프로그래밍
어셈블리 프로그램의 구조(2)

프로그램 실행의 종료를 위한 명령

INT 21H


function code 4CH


DOS 인터럽트 연산. AH 레지스터에 있는 function code가
수행할 액션을 지정
프로그램 실행의 종료 요청. AL 레지스터에 리턴 코드 저장.
"00"이면 정상적인 종료
일반적으로
MOV AH, 4CH
; request end
MOV AL, retcode ; return code(optional)
INT 21H
; exit to DOS

정상적인 종료

34
MOV AX, 4C00H
시스템프로그래밍
어셈블리 프로그램의 구조(3)

protected mode를 위한 초기화


80386 혹은 그 이상의 프로세서에 해당
세그먼트를 더블워드(DWORD)에 정렬(align)


32 비트의 데이타 버스를 효율적으로 사용하여 메모리를
액세스함
USE32 use type
32-bit protected mode에 적합한 코드 생성
.386
segname SEGMENT DWORD USE32


데이타 세그먼트 레지스터의 초기화
MOV EAX,DATASG ; get address of data segment
MOV DS,AX
; load 16-bit portion
35
시스템프로그래밍
어셈블리 프로그램의 구조(4)
예 1) skeleton of an .exe program
{왼쪽의 번호는 참조용임. 실제는 사용하지 않음}
1
PAGE 60,132
2
TITLE P04ASM1 Skeleton of an .EXE Program
3 ;-----------------------------------4 STACKSG SEGMENT PARA STACK 'Stack'
5 ...
6 STACKSG ENDS
7 ;-----------------------------------8 DATASG SEGMENT PARA 'Data'
9 ...
10 DATASG ENDS
11 ;-----------------------------------------(계속)
36
시스템프로그래밍
어셈블리 프로그램의 구조(5)
12 CODESG SEGMENT PARA 'Code'
13 BEGIN PROC
FAR
14
ASSUME SS:STACKSG,DS:DATASG,CS:CODESG
15
MOV AX,DATASG ;Get address of data segment
16
MOV DS,AX
;Store address in DS
17
...
18
MOV AX,4C00H ;Request
19
INT 21H
;exit to DOS
20 BEGIN
ENDP
21 CODESG ENDS
22
END BEGIN
37
시스템프로그래밍
어셈블리 프로그램의 구조(6)
예 2)
TITLE P04ASM1 (EXE) Move and add operations
; .exe source program with conventional segments
;------------------------------------STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(0)
STACKSG ENDS
DATASG SEGMENT PARA 'Data'
FLDA DW
250
FLDB DW
125
FLDC DW
?
DATASG ENDS
; ----------------------------------(계속)
38
시스템프로그래밍
어셈블리 프로그램의 구조(7)
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME SS:STACKSG,DS:DATASG,CS:CODESG
MOV AX,DATASG ;Set address of DATASG
MOV DS,AX
; in DS register
MOV AX,FLDA
;Move 0250 to AX
ADD AX,FLDB
;Add 0125 to AX
MOV FLDC,AX
;Store sum in FLDC
MOV AX,4C00H
;Exit to DOS
INT
21H
BEGIN ENDP
;End of procedure
CODESG ENDS
;End of segment
END BEGIN
;End of program
39
시스템프로그래밍
어셈블리 프로그램의 구조(8)
예 3)
PAGE 60,132
TITLE P04ASM2 (EXE) Move and add operations
; .exe source program with simplified segment directives
; ----------------------------------.MODEL
SMALL
.STACK
64
;Define stack
.DATA
;Define data
FLDA DW 250
FLDB DW 125
FLDC DW ?
; ----------------------------------(계속)
40
시스템프로그래밍
어셈블리 프로그램의 구조(9)
.CODE
;Define code segment
BEGIN PROC FAR
MOV AX,@data
;Set address of DATASG
MOV DS,AX
; in DS register
MOV AX,FLDA
ADD AX,FLDB
MOV FLDC,AX
MOV AX,4C00H
INT 21H
BEGIN ENDP
END BEGIN
41
;Move 0250 to AX
;Add 0125 to AX
;Store sum in FLDC
;Exit to DOS
;End of procedure
;End of program
시스템프로그래밍
데이터 전송 명령 – MOV (1)

MOV 명령


레지스터 간에 또는 레지스터와 메모리간에 데이터를 전송할
때에 사용하는 명령어
예)
MOV AH, 01H
; 레지스터에 상수값을 지정
MOV AX, BX
; 레지스터간에 데이터 전송
MOV AX, WORD PTR [BX] ; 메모리 데이터를 레지스터로 전송
MOV [BX], AL
; 레지스터 데이터를 메모리로 전송
42
시스템프로그래밍
데이터 전송 명령 – MOV (2)

MOV 명령 – 예제 #1
MAIN
SEGMENT
ASSUME CS:MAIN
;
MOV
MOV
INT
MOV
MOV
INT
DL,
AH,
21H
DL,
AH,
21H
41H
02H
‘B’
02H
;
MAIN
43
MOV AH, 4CH
INT 21H
ENDS
END
시스템프로그래밍
데이터 전송 명령 – MOV (3)

MOV 명령 – 예제 #2
MAIN
SEGMENT
ASSUME CS:MAIN, DS:MAIN
;
MOV
MOV
MOV
MOV
INT
MOV
MOV
MOV
INT
MOV
MOV
INT
AX,
DS,
DL,
AH,
21H
CX,
DL,
AH,
21H
DL,
AH,
21H
CS
AX
XXX
02H
YYY
CH
02H
CL
02H
데이터를 코드
세그먼트 안에서
정의하여
사용하는 경우
;
XXX
YYY
;
MAIN
MOV AH, 4CH
INT 21H
DB
DB
‘X’
3456H
ENDS
END
;
44
시스템프로그래밍
데이터 전송 명령 – MOV (4)

MOV 명령 – 예제 #3
MAIN
SEGMENT
ASSUME CS:MAIN, DS:DATA
;
MOV AX, DATA
MOV DS, AX
;
MOV
MOV
MOV
INT
MOV
MOV
INT
BX, XXX
DL, BH
AH, 02H
21H
DL, BL
AH, 02H
21H
데이터를 별도의
데이터 세그먼트
;
안에서 정의하여
사용하는 경우MAIN
;
DATA
XXX
MAIN
MOV AH, 4CH
INT 21H
ENDS
SEGMENT
DB ‘AB’
ENDS
END
;
45
시스템프로그래밍
데이터 전송 명령 – MOV (5)

MOV 명령 – 예제 #4
MAIN
SEGMENT
ASSUME CS:MAIN, DS:DATA
;
MOV AX, DATA
MOV DS, AX
;
MOV
MOV
MOV
INT
MOV
MOV
INT
MOV
MOV
INT
BX,
DL,
AH,
21H
DL,
AH,
21H
DL,
AH,
21H
OFFSET XXX
[BX]
02H
[BX+1]
02H
[BX+2]
02H
레지스터를
이용한 간접
주소 지정 방식
;
MAIN
;
DATA
XXX
MAIN
MOV AH, 4CH
INT 21H
ENDS
SEGMENT
DB ‘ABC’
ENDS
END
;
46
시스템프로그래밍
데이터 전송 명령 – MOV (6)

MOV 명령 – 예제 #5
MAIN
SEGMENT
ASSUME CS:MAIN, DS:DATA
;
MOV AX, DATA
MOV DS, AX
;
MOV
MOV
MOV
MOV
MOV
MOV
INT
MOV
MOV
INT
MOV WORD PTR [BX], ‘AB’
MOV AH, 4CH
INT 21H
BX, OFFSET XXX
;
AX, ‘AB’
[BX], AX
MAIN
ENDS
CX, XXX
;
DL, CH
DATA
SEGMENT
AH, 02H
XXX
DW ?
21H
DL, CL
MAIN
ENDS
AH, 02H
END
21H
;
47
시스템프로그래밍
MOV명령연산항의가능한조합
MOV <operand1>, <operand2>
operand2
operand1
직
값
접
간접
범용 r. 세그먼트 r.
범용 r.
○
○
○
○
세그먼트 r.
×
○
×
○
○
○
○
×
(CS는 제외)
간접:메모리주소
48
시스템프로그래밍
80x86 주소지정 모드 단순한 방법 simple addressing modes

즉시 모드 immediate addressing mode


피연산자: register, constant
간혹 어셈블러에 따라 상수 앞에 “#” 기호를 붙임
MOV
MOV

AL, ‘Q’
EAX, 29AB3H
m
{EAX}
직접 모드 direct mode


피연산자: offset address, register
MOV 명령에서 메모리와 레지스터(AL, AX, EAX) 사이의
데이터 이동에 사용
MOV AX, DATA5
MOV HERE, AL
{AL}
49
29AB3H
moved to
Memory
×10H
points to
{DS}
register
HERE
“value”
시스템프로그래밍
80x86 주소지정 모드 –
레지스터 이용 방법 register-based modes

레지스터 모드 register mode

피연산자: register, register
MOV

AX, BX
m
{BX}
{AX}
변위 모드 displacement mode


피연산자: 오프셋 주소, 레지스터
직접 모드와 같으나 거의 모든 명령에 적용
MOV
MOV
ES, OFFDAT
NUM, BP
{DS}
×10H
p
M
m
{ES}
OFFDAT
50
시스템프로그래밍
80x86 주소지정 모드 –
레지스터 이용 방법 register-based modes

레지스터 간접 모드 register indirect mode



피연산자: [register], register
BX, DI, SI (or EBX, EDI, ESI): 레지스터 값이 데이터
세그먼트에 대한 오프셋
BP (or EBP): 레지스터 값이 스택 세그먼트에 대한 오프셋
MOV
MOV
MOV
[DI], [BX]
CX, [BX]
[BP], DL
(문자열 연산의 경우만 가능)
{DS}
×10H
m
{CX}
p
{BX}
×10H
{DL}
m
p
{SS}
{BP}
51
시스템프로그래밍
80x86 주소지정 모드 –
레지스터 이용 방법 register-based modes

레지스터 상대 모드 register relative mode


피연산자: [register±offset] or offset[register], register
ESP, SP는 사용 불가
MOV
MOV
AX, [DI+100H]
LIST[BP+2], CL
{BP}
M
{CL}
m
2
p
LIST
×10H
{SS}
52
시스템프로그래밍
80x86 주소지정 모드 –
인덱스 이용 방법 indexed addressing modes

베이스+인덱스 모드 base-plus-index mode

피연산자: [register+register]*, register



[register+register]* = [base register(BP, BX, or other 32-bit
registers) + index register(DI, SI, or other 32-bit registers)]
SP, ESP 는 사용 불가
간접 주소지정 모드
MOV
MOV
MOV
CX, [BX+DI]
[BP+DI], CX
[EAX+EBX], ECX
{BX}
m
{DI}
p
{DS}
53
{CX}
×10H
시스템프로그래밍
80x86 주소지정 모드 –
인덱스 이용 방법 indexed addressing modes

베이스 상대+인덱스 모드 base-relative-plus-index mode

피연산자: [register+register+offset] or
offset[register+register+offset], register
MOV DH, [BX+DI+30H]
MOV LIST[BP+SI+10], AX
MOV AH, FILE[EBX+ECX+2]
{EBX}
{ECX}
m
2
p
{AH}
FILE
×10H
{DS}
54
시스템프로그래밍
80x86 주소지정 모드 –
인덱스 이용 방법 indexed addressing modes

예
.MODEL
.DATA
FILE
RECA
RECB
RECC
RECD
.CODE
.STARTUP
MOV
MOV
MOV
MOV
MOV
MOV
.EXIT
END
55
SMALL
EQU
DB
DB
DB
DB
THIS BYTE
10 DUP (?)
10 DUP (?)
10 DUP (?)
10 DUP (?)
BX, OFFSET RECA
DI, 0
AL, FILE[BX+DI]
BX, OFFSET RECC
DI, 2
FILE[BX+DI], AL
시스템프로그래밍
80x86 주소지정 모드 –
인덱스 이용 방법 indexed addressing modes

스케일-인덱스 모드 scaled-index mode


피연산자: 32-bit register, [sf*register+offset] or
offset[sf*register]
sf: scaling factor
MOV EAX, [EBX+4*ECX]
MOV LIST[EAX+2*EBX+10], DX
×2
M
{DX}
m
{EBX}
{EAX}
p
10
LIST
×10H
{DS}
56
시스템프로그래밍
80x86 주소지정 모드 –
PC 이용 방법 PC-related addressing modes

직접 모드
메모리 공간의 어디든지 직접 갈 수 있음 (절대 위치로의 분기)
JMP [10000H] → CS : 1000H, IP : 0000H


상대 모드
현재 위치로부터의 상대 위치
 short jump(1-byte displacement), near jump(2-byte
displacement)
JMP [2] : 두 바이트를 건너뜀


간접 모드
JMP AX
JMP NEAR PTR[BX]
JMP TABLE[BX]
{DS}
{BX}
×10H
이 주소로
분기
TABLE
57
시스템프로그래밍
80x86 주소지정 모드 - 기타

기타

near, far 주소



near address: 주소의 오프셋으로만 구성
far address: 세그먼트와 오프셋으로 구성. segment:offset
segment override prefix


다른 세그먼트 레지스터(ES, FS, GS)를 이용하여 데이타를
접근할 때
예)
MOV CX, ES:[BX]
; move to CX from ES:[BX]
MOV ES:[DI+12], AH ; move to ES:[DI+12] from AH
58
시스템프로그래밍
80x86 주소지정 모드 - 기타

59
예
.MODEL SMALL
.DATA
ARRAY1 DB 10 DUP (?)
ARRAY2 DB 10 DUP (?)
;select SMALL model
;indicate start of DATA segment
;reserve 10 bytes for ARRAY1
;reserve 10 bytes for ARRAY2
.CODE
.STARTUP
MOV AX,0
MOV ES,AX
MOV DI,0
MOV CX,10
LAB1:
MOV AL,ES:[DI]
MOV ARRAY1[DI],AL
INC DI
LOOP LAB1
;indicate start of CODE segment
;indicate start of program
;address segment 0000 with ES
;address element 0
;count of 10
;copy 0000:0000 through 0000:0009
;into ARRAY1
시스템프로그래밍
80x86 주소지정 모드 - 기타
MOV DI,0
MOV CX,10
MOV AL,0
LAB2:
MOV ARRAY2[DI],AL
INC AL
INC DI
LOOP LAB2
MOV
MOV
MOV
MOV
MOV
.EXIT
END
60
DI,3
AL,ARRAY1[DI]
AH,ARRAY2[DI+2]
ARRAY1[DI],AH
ARRAY2[DI+2],AL
;address element 0
;count of 10
;initial value
;fill ARRAY2
;exchange array data
;exit to DOS
;end of file
시스템프로그래밍
80x86 주소지정 모드 –
간접 주소 지정 모드 요약

간접 주소 지정 방식

피연산자에 데이터가 저장되어 있는 번지를 지정

[ 주소 ] 기호를 사용

간접 주소 지정에 사용하는 레지스터


4개의 레지스터만 사용 가능 - BX, BP, SI, DI
간접 주소 지정 방식 :
BX
BP
없음

+
8-bit offset
16-bit offset
없음
허용되지 않는 조합

61
+
SI
DI
없음
3개 모두 ‘없음’인 경우, 8-bit offset만 주어지는 경우, [BP] 인 경우
시스템프로그래밍
80x86 주소지정 모드 –
간접 주소 지정 모드 요약

간접 주소 지정 방식(계속)

세그먼트 관련 조건

기본적으로 데이터는 데이터 세그먼트에 있다고 가정한다
• 프로그램 초기에 데이터 세그먼트 설정이 필요


간접 주소 지정 방식 관련 명령어 형식

62
BP를 포함하는 간접 지정에서는 데이터가 스택 세그먼트에 있다고 가정
교재 부록 D, pp.341 참조
시스템프로그래밍