62
시시시시시시시시 1 Lecture #4 Lecture #4 어어어어어 어어어어어 (1) (1) - 8086 - 8086 어어어 어어어어어 어어어 어어어어어

Lecture #4

  • Upload
    galen

  • View
    74

  • Download
    1

Embed Size (px)

DESCRIPTION

Lecture #4. 어셈블리어 (1) - 8086 매크로 어셈블리어. 프로그래밍언어 계층. 프로그래밍 언어 인간과 컴퓨터 사이에서 의사 전달을 하는 수단 컴퓨터 프로그램 작성 프로그래밍 언어 계층 (Fig.4-1 참조 ) 고급 언어 (High-level Language) 인간이 사용하는 자연어에 가까운 프로그래밍 언어 BASIC, ADA, FORTRAN, PASCAL, C++, JAVA 등 중급 언어 (Middle-level Language) 고급 언어와 저급 언어 사이의 프로그래밍 언어 - PowerPoint PPT Presentation

Citation preview

시스템프로그래밍1

Lecture #4Lecture #4

어셈블리어 어셈블리어 (1)(1)- 8086 - 8086 매크로 어셈블리어매크로 어셈블리어

시스템프로그래밍2

프로그래밍언어 계층프로그래밍언어 계층 프로그래밍 언어

인간과 컴퓨터 사이에서 의사 전달을 하는 수단 컴퓨터 프로그램 작성

프로그래밍 언어 계층 (Fig.4-1 참조 ) 고급 언어 (High-level Language)

인간이 사용하는 자연어에 가까운 프로그래밍 언어 BASIC, ADA, FORTRAN, PASCAL, C++, JAVA 등

중급 언어 (Middle-level Language) 고급 언어와 저급 언어 사이의 프로그래밍 언어 C, FORTH 등

저급 언어 (Low-level Language) 기계에 종속된 언어 기계어 , 어셈블리어 등

시스템프로그래밍3

고급언어 고급언어 & & 중급언어 중급언어 (1)(1)

고급언어로 작성된 프로그램은 기계어 코드로 번역되어 실행된다

a.c b.c d.c

Compiler

a.o b.o d.o libs

linker

t.exe

loader t.exe

MainMemory

CPU

소스 파일- 소스 코드

목적 파일- 목적 코드

실행 파일(Loadable File)- Machine Code / Binary Code

시스템프로그래밍4

고급언어 고급언어 & & 중급언어 중급언어 (2)(2)

고급언어 프로그램의 번역 컴파일러 (Compiler)

원시 코드를 한꺼번에 번역하여 이진 코드를 생성하고 실행 컴파일 시간이 많이 요구 한번의 컴파일 과정을 통해 반복적으로 프로그램 실행이 가능

반복 실행 시에 실행 시간을 단축

인터프리터 (Interpreter) 원시 코드를 한줄씩 번역하면서 실행

• 번역과 실행을 동시에 실행 번역 시간이 짧다 반복 실행 시에 매번 번역하여 실행함에 따라 실행 시간이

길어진다

시스템프로그래밍5

저급언어저급언어

어셈블리어 (Assembly Language) 2 진수 형태의 기계어를 기호형식의 명령어로 표현한 언어 Machine Code Mnemonic Code

e.g) in 8086 Processor 100010 MOV 000000 ADD

001010 SUB 기계어 코드와 어셈블리어 코드 사이에는 1:1 대응 관계

어셈블러 (Assembler) 어셈블리어 프로그램을 기계어 명령어로 번역 컴파일러보다는 단순

시스템프로그래밍6

고급언어와 저급언어에서의 번역고급언어와 저급언어에서의 번역

자연어자연어

고급고급언어언어

저급저급언어언어

기계어기계어

고급언어 사용고급언어 사용 저급언어 사용저급언어 사용

원시원시코드코드

(( 프로그래밍프로그래밍 ))

:1:1

컴파일러컴파일러

목적목적코드코드 :n:n

원시원시코드코드

(( 프로그래밍프로그래밍 ))

:1:1

어셈블러어셈블러

목적목적코드코드 :1:1

시스템프로그래밍7

프로그래밍 언어의 선택프로그래밍 언어의 선택 프로그래밍을 위한 언어 선택

작성하려는 응용의 특성을 적절하게 고려하여 선택

고급 언어1. 소스수준의 호환성2. 배우기 쉽고 코딩이 용이3. 최적화된 기계어 코드로

번역이 어려움 실행 시간이 길어짐

저급 언어1. 기계에 종속 호환성이

떨어짐2. 코딩이 어려움3. 최적화된 코드 작성이

가능 실행 시간이 짧아짐

4. 시스템 프로그램 작성에 이용

시스템프로그래밍8

8086 8086 어셈블리어 개요어셈블리어 개요 (1)(1)

8086 어셈블리 언어의 문장 명령어 (Instructions)

니모닉 코드 (Mnemonic Code) – 기계어 코드로 번역되어 CP

U 에서 실행되는 명령어 어셈블리 프로그램의 본체를 구성

지시어 (Directives)

의사 코드 (Pseudo Code) – 어셈블러에게 프로그램과 관련된 정보를 제공하거나 특정 기능을 수행토록 지시하는 코드

어셈블리 프로그램의 틀을 구성 어셈블 및 링트 시에 참조되는 코드

시스템프로그래밍9

8086 8086 어셈블리어 개요어셈블리어 개요 (2)(2)

8086 어셈블리 프로그램

어셈블리어 프로그램

어셈블리 명령어

어셈블리 의사코드

어셈블러 기계어 코드로 변환

어셈블러어셈블 및

링크 작업시에 참조

기계어 코드 CPU 에서 실행되어 데이터를 처리

의사코드 어셈블리 명령어에 대한 기계어 코드 변환 작업 방식을 지시

시스템프로그래밍10

8086 8086 어셈블리어 개요어셈블리어 개요 (3)(3)

어셈블리 명령어 문장의 구성

시스템프로그래밍11

8086 8086 어셈블리어 개요어셈블리어 개요 (4)(4)

명령어 : 종류에 따라서 1 ~ 6 Byte

시스템프로그래밍12

8086 8086 어셈블리어 개요어셈블리어 개요 (5)(5)

명령어 (instruction) 의 형식 연산항의 개수로 3 가지로 분류

0 개의 연산항 e.g) CLC

1 개의 연산항 e.g) DEC CX

2 개의 연산항 e.g) MOV AX, BX

시스템프로그래밍13

2-2- 번지 명령어 예번지 명령어 예

16 8 7 016 8 7 0

MOV AL, BLMOV AL, BL MOV AX, BXMOV AX, BX

출발항출발항

목적항목적항

1 2 3 41 2 3 4BH BLBH BL

0 0 0 00 0 0 0AH ALAH AL

BXBX

AXAX

출발항출발항

목적항목적항

1 2 3 41 2 3 4BH BLBH BL

0 0 3 40 0 3 4AH ALAH AL

BXBX

AXAX

16 8 7 016 8 7 01 2 3 41 2 3 4

BH BLBH BL

0 0 0 00 0 0 0AH ALAH AL

BXBX

AXAX

1 2 3 41 2 3 4BH BLBH BL

1 2 3 41 2 3 4AH ALAH AL

BXBX

AXAX

실실행행전전

실실행행후후

시스템프로그래밍14

8086 8086 어셈블리어 개요어셈블리어 개요 (6)(6)

8086 명령어 종류 데이터 전송 명령 – 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, L

OOPE, LOOPNE, CALL, RET 스트링 명령 – LODSB, STOSB, MOVSB, MOVSW I/O 명령 – IN, OUT 인터럽트 명령 – INT, IRET CPU 제어 명령 – WAIT, ESC, LOCK, HLT, NOP 그외 명령 – PUSH, POP, XCHG, XLAT

시스템프로그래밍15

8086 8086 어셈블리어 개요어셈블리어 개요 (7)(7)

주소 지정 방식 (Addressing Mode) 명령어의 연산항은 명령어 수행에 필요한 데이터를

표시하거나 데이터가 저장된 주소를 지정

데이터를 표시하는 주소 모드 상수값 지정 (Immedimate data addressing mode)

직접 주소 지정 (Direct addressing mode)

간접 주소 지정 (Indirect addressing mode)

• 레지스터 간접주소 지정

• 베이스 주소 지정

• 인덱스 주소 지정

• 베이스 인덱스 주소 지정

시스템프로그래밍16

어셈블리 프로그램의 기본구성어셈블리 프로그램의 기본구성

MAIN SEGMENT

ASSUME CS:MAIN

프로그램 블록

MAIN ENDS

END

시스템프로그래밍17

문자 문자 AA 를를 출력하는출력하는 프로그램 예프로그램 예

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

지시어

지시어

프로그램 본체 : 어셈블리 명령어

시스템프로그래밍18

지시어 지시어 ((directivesdirectives) ) (1)(1)

출력 제어 지시어 listing control directives PAGE [length] [, width]

디폴트 : 50, 80 “PAGE” 만 쓰면 다음 페이지로 넘어감

TITLE text (60 자까지 ), SUBTTL text (60 자까지 ) 예 ) PAGE 60, 130 TITLE HEX TO BINARY CONVERSION

프로시저 지시어 PROC directive proc-name PROC [type]

코드 세그먼트 내에서 서브루틴 구현 명령 CALL 에 의해 진입 . RET 에 의해 돌아감 type: NEAR( 디폴트 ) | FAR

지시어 ENDP 로 끝남

시스템프로그래밍19

지시어 지시어 ((directivesdirectives) ) (2)(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

지시어 ENDS 로 끝남

시스템프로그래밍20

지시어 지시어 ((directivesdirectives) ) (3)(3)

예 ) 세그먼트와 프로시져

Codename SEGMENT PARA 'code'

subroutinename PROC FAR

:

subroutinename ENDP

Codename ENDS

시스템프로그래밍21

지시어 지시어 ((directivesdirectives) ) (4)(4)

기타 지시어 ASSUME seg-reg:seg-name [, ...]

세그먼트 이름과 세그먼트 레지스터를 연계시키도록 지시함 seg-reg : CS | DS | ES | SS | FS | GS seg-name : segment names | NOTHING | GROUPS 예 ) ASSUME CS:CODESG, DS:DATASG, SS:STACK

END [proc name] 전체 프로그램을 종료할 때 사용

name GROUP seg-name [, segname] 같은 유형의 여러 세그먼트를 하나의 이름하에 한 세그먼트에

위치하게 함 ( 통상 데이타 )

시스템프로그래밍22

지시어 지시어 ((directivesdirectives) ) (5)(5)

단순화된 세그먼트 지시어 .CODE [name] - 코드 세그먼트 정의 ( 모든 실행 코드 ) .DATA - 데이타 세그먼트 정의 (near data 용 ) .STACK [size] - 스택을 정의 / 디폴트 값은 1KB .MODEL memory-model

디폴트 세그먼트 , ASSUME 및 GROUP 문장을 생성 memory models: ( 다음 쪽 )

TINY | SMALL | MEDIUM | COMPACT | LARGE | HUGE

시스템프로그래밍23

지시어 지시어 ((directivesdirectives) ) (6)(6)

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)

시스템프로그래밍24

지시어 지시어 ((directivesdirectives) ) (7)(7)

단순화된 세그먼트 지시어 ( 계속 ) .STARTUP : 세그먼트 레지스터를 초기화하는 명령 생성 .EXIT : 프로그램을 마칠 때

INT 21H function 4CH 명령 생성 예 )

.MODELSMALL

.STACK 100

.DATA[ 데이타 항목 ]

.CODE[ 명령 ]

END

시스템프로그래밍25

지시어 지시어 ((directivesdirectives) ) (8)(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(?)

시스템프로그래밍26

지시어 지시어 ((directivesdirectives) ) (9)(9)

데이타 할당 지시어 data allocation directives ORG expression

위치 카운터의 내용값을 바꿔줌 . 예 ) ORG 0 프로그램의 시작 주소를 지정

name EQU expression, name EQU <string> 데이타 이름 , 변수 등을 다른 이름이나 값으로 재정의함 주소 상수 (constant) 를 정의 예 )

FIVE EQU 5

SUM EQU TOTAL

SUBJ EQU <'System Prog'>

시스템프로그래밍27

지시어 지시어 ((directivesdirectives) ) (10)(10)

데이타 할당 지시어 data allocation directives 데이타의 정의

데이터를 정의하거나 데이터 영역을 위한 메모리 확보를 위해 사용

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)

시스템프로그래밍28

지시어 지시어 ((directivesdirectives) ) (11)(11)

데이타 할당 지시어 data allocation directives 예 )

UNK DB ? ; 초기화되지 않은 항목VALU BYTE 40 ; 초기화된 항목SEQ DW 1000, 2000, 3000, ...

A WORD 100 DUP(?) ; 초기화되지 않은 워드 100 개

B BYTE 2 DUP(3 DUP(4)) ; ‘4’ 가 6 개C DB 'Data definition' ; 문자열

시스템프로그래밍29

지시어 지시어 ((directivesdirectives) ) (12)(12)

기타 연산자 OFFSET operator

해당 세그먼트로부터 레이블이나 변수의 거리를 반환 예 ) move bx,offset data_x ; bx points to data_x

SEG operator 레이블이나 변수가 속한 세그먼트 ( 의 주소 ) 를 반환 예 ) 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

시스템프로그래밍30

지시어 지시어 ((directivesdirectives) ) (13)(13)

기타 연산자 ( 계속 ) PTR operator

피연산자의 크기를 명시BYTE PTR, WORD PTR, DWORD PTR, …

예 )• dec [bx] 의 경우 bx 가 가리키는 것이 바이트인지 워드인지 알 수

없을 수 있다• dec word ptr [bx] 라고 하면 워드 타입의 데이터임을 명시

시스템프로그래밍31

지시어 지시어 ((directivesdirectives) ) (14)(14)

기타 연산자 ( 계속 ) LABEL directive

변수의 디폴트 타입을 재정의할 (override) 때 사용var_name label byte/word/dword/qword/tbyte

예 )

byte0 label byteword0 dw 4567hword1 label wordbyte1 db 41hbyte2 db 20h … mov al,byte0 ; al 67h mov bx,word1 ; bx 2041h

67

45

41

20

byte0word0

word1 byte1byte2

low address

high address

시스템프로그래밍32

시스템 호출 시스템 호출 ((system callsystem call))

시스템 호출 운영체제가 제공하는 서비스 ( 기본 서비스 함수 ) 을 사용하기 위한

방법 e.g) 입출력을 위한 시스템 호출

MS-DOS 에서는 소프트웨어 인터럽트를 사용하여 시스템 호출을 제공

인터럽트 타입 21H 예 ) 화면에 문자 ‘ A’ 을 출력

MOV DL, ‘A’ ; 전달할 데이터를 DL 레지스터에 지정MOV AH, 02H ; 서브커맨드 (subcommand) 를 AH

레지스터 지정INT 21H ; 인터럽트 호출

subcommand(or function number)• 01H : 키보드 문자 입력 , 02H : 화면에서의 문자 출력• 06H : 콘솔에서의 문자 입력 , 09H : 화면에서의 문자열 출력• 0AH : 콘솔에서의 문자열 입력

시스템프로그래밍33

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (1)(1)

어셈블리 프로그램의 구조

헤더부 페이지의 규격 , 제목 등을 명시 예 ) PAGE 50, 120

header

stack segment

data segment

code segment

ending

시스템프로그래밍34

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (2)(2)

프로그램 실행의 종료를 위한 명령 INT 21H

DOS 인터럽트 연산 . AH 레지스터에 있는 function code 가 수행할 액션을 지정

function code 4CH 프로그램 실행의 종료 요청 . AL 레지스터에 리턴 코드 저장 . "

00" 이면 정상적인 종료 일반적으로

MOV AH, 4CH ; request endMOV AL, retcode ; return code(optional)INT 21H ; exit to DOS

정상적인 종료 MOV AX, 4C00H

시스템프로그래밍35

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (3)(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

시스템프로그래밍36

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (4)(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 ENDS11 ;------------------------------------------ ( 계속 )

시스템프로그래밍37

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (5)(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

시스템프로그래밍38

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (6)(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 ENDSDATASG SEGMENT PARA 'Data' FLDA DW 250 FLDB DW 125 FLDC DW ?DATASG ENDS; -----------------------------------

( 계속 )

시스템프로그래밍39

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (7)(7)

CODESG SEGMENT PARA 'Code'BEGIN PROC FAR

ASSUME SS:STACKSG,DS:DATASG,CS:CODESGMOV AX,DATASG ;Set address of DATASGMOV DS,AX ; in DS register

MOV AX,FLDA ;Move 0250 to AXADD AX,FLDB ;Add 0125 to AXMOV FLDC,AX ;Store sum in FLDCMOV AX,4C00H ;Exit to DOSINT 21H

BEGIN ENDP ;End of procedureCODESG ENDS ;End of segment

END BEGIN ;End of program

시스템프로그래밍40

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (8)(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 dataFLDA DW 250FLDB DW 125FLDC DW ?; -----------------------------------

( 계속 )

시스템프로그래밍41

어셈블리 프로그램의 구조어셈블리 프로그램의 구조 (9)(9)

.CODE ;Define code segmentBEGIN PROC FAR

MOV AX,@data ;Set address of DATASGMOV DS,AX ; in DS register

MOV AX,FLDA ;Move 0250 to AXADD AX,FLDB ;Add 0125 to AXMOV FLDC,AX ;Store sum in FLDC

MOV AX,4C00H ;Exit to DOSINT 21H

BEGIN ENDP ;End of procedureEND BEGIN ;End of program

시스템프로그래밍42

데이터 전송 명령 – 데이터 전송 명령 – MOV (1)MOV (1)

MOV 명령 레지스터 간에 또는 레지스터와 메모리간에 데이터를 전송할

때에 사용하는 명령어 예 )

MOV AH, 01H ; 레지스터에 상수값을 지정MOV AX, BX ; 레지스터간에 데이터 전송MOV AX, WORD PTR [BX] ; 메모리 데이터를 레지스터로 전송

MOV [BX], AL ; 레지스터 데이터를 메모리로 전송

시스템프로그래밍43

데이터 전송 명령 – 데이터 전송 명령 – MOV (2)MOV (2)

MOV 명령 – 예제 #1MAIN SEGMENT

ASSUME CS:MAIN

;

MOV DL, 41H

MOV AH, 02H

INT 21H

MOV DL, ‘B’

MOV AH, 02H

INT 21H

;

MOV AH, 4CH

INT 21H

MAIN ENDS

END

시스템프로그래밍44

데이터 전송 명령 – 데이터 전송 명령 – MOV (3)MOV (3)

MOV 명령 – 예제 #2MAIN SEGMENT

ASSUME CS:MAIN, DS:MAIN;

MOV AX, CSMOV DS, AX

MOV DL, XXX MOV AH, 02H INT 21H

MOV CX, YYY MOV DL, CH MOV AH, 02H INT 21H MOV DL, CL MOV AH, 02H INT 21H;

MOV

AH, 4CH

INT 21H

;

XXX DB ‘X’

YYY DB 3456H

;

MAIN ENDS

END

데이터를 코드 세그먼트 안에서

정의하여 사용하는 경우

시스템프로그래밍45

데이터 전송 명령 – 데이터 전송 명령 – MOV (4)MOV (4)

MOV 명령 – 예제 #3MAIN SEGMENT

ASSUME CS:MAIN, DS:DATA

;

MOV AX, DATA

MOV DS, AX

;

MOV BX, XXX

MOV DL, BH

MOV AH, 02H

INT 21H

MOV DL, BL

MOV AH, 02H

INT 21H

;

MOV

AH, 4CH

INT 21H

;

MAIN ENDS

;

DATA SEGMENT

XXX DB ‘AB’

MAIN ENDS

END

데이터를 별도의 데이터 세그먼트 안에서 정의하여

사용하는 경우

시스템프로그래밍46

데이터 전송 명령 – 데이터 전송 명령 – MOV (5)MOV (5)

MOV 명령 – 예제 #4

MAIN SEGMENT ASSUME CS:MAIN,

DS:DATA;

MOV AX, DATAMOV DS, AX

;MOV BX, OFFSET XXX

MOV DL, [BX] MOV AH, 02H INT 21H MOV DL, [BX+1] MOV AH, 02H INT 21H MOV DL, [BX+2] MOV AH, 02H INT 21H;

MOV

AH, 4CH INT 21H;MAIN ENDS;DATA SEGMENTXXX DB ‘ABC’MAIN ENDS END

레지스터를 이용한 간접 주소

지정 방식

시스템프로그래밍47

데이터 전송 명령 – 데이터 전송 명령 – MOV (6)MOV (6)

MOV 명령 – 예제 #5

MAIN SEGMENT ASSUME CS:MAIN,

DS:DATA;

MOV AX, DATAMOV DS, AX

;MOV BX, OFFSET XXXMOV AX, ‘AB’MOV [BX], AXMOV CX, XXX

MOV DL, CH MOV AH, 02H INT 21H MOV DL, CL MOV AH, 02H INT 21H;

MOV

AH, 4CH INT 21H;MAIN ENDS;DATA SEGMENTXXX DW ?MAIN ENDS END

MOV WORD PTR [BX], ‘AB’

시스템프로그래밍48

MOVMOV 명령명령 연산항의연산항의 가능한가능한 조합조합

operand2operand2

operand1operand1

범용 범용 r.r.세그먼트 세그먼트 r.r.(CS(CS 는 제외는 제외 ))

간접간접 :: 메모리주소메모리주소

값값직 접직 접

범용 범용 r.r. 세그먼트 세그먼트 r.r.간접간접

○○

××

○○

○○

○○

○○

○○

××

○○

○○

○○

××

MOV MOV << operand1operand1 >> , , << operand2operand2 >>

시스템프로그래밍49

80x86 80x86 주소지정 모드 주소지정 모드 --단순한 방법단순한 방법 simple addressing modessimple addressing modes

즉시 모드 immediate addressing mode 피연산자 : register, constant 간혹 어셈블러에 따라 상수 앞에 “ #” 기호를 붙임

MOV AL, ‘Q’MOV EAX, 29AB3H

직접 모드 direct mode 피연산자 : offset address, register MOV 명령에서 메모리와 레지스터 (AL, AX, EAX) 사이의

데이터 이동에 사용MOV AX, DATA5MOV HERE, AL

{AL}{DS}

HERE

Memory

points tomoved to

“value”

register×10H

{EAX} 29AB3H m

시스템프로그래밍50

80x86 80x86 주소지정 모드 – 주소지정 모드 – 레지스터 이용 방법레지스터 이용 방법 register-based modesregister-based modes

레지스터 모드 register mode

피연산자 : register, registerMOV AX, BX

변위 모드 displacement mode

피연산자 : 오프셋 주소 , 레지스터 직접 모드와 같으나 거의 모든 명령에 적용 MOV ES, OFFDAT

MOV NUM, BP

{AX} {BX} m

{DS}

{ES}

OFFDAT

M×10H

mp

시스템프로그래밍51

80x86 80x86 주소지정 모드 – 주소지정 모드 – 레지스터 이용 방법레지스터 이용 방법 register-based modesregister-based modes

레지스터 간접 모드 register indirect mode

피연산자 : [register], register BX, DI, SI (or EBX, EDI, ESI): 레지스터 값이 데이터

세그먼트에 대한 오프셋 BP (or EBP): 레지스터 값이 스택 세그먼트에 대한 오프셋

MOV [DI], [BX] ( 문자열 연산의 경우만 가능 )

MOV CX, [BX]MOV [BP], DL

{DS}

{CX}

×10H

{BX}

{DL}{SS}×10H

{BP}

p

p

m

m

시스템프로그래밍52

80x86 80x86 주소지정 모드 – 주소지정 모드 – 레지스터 이용 방법레지스터 이용 방법 register-based modesregister-based modes

레지스터 상대 모드 register relative mode

피연산자 : [register±offset] or offset[register], register ESP, SP 는 사용 불가

MOV AX, [DI+100H]MOV LIST[BP+2], CL

{CL}

{BP}

×10H

{SS}

2

LISTpm

M

시스템프로그래밍53

80x86 80x86 주소지정 모드 – 주소지정 모드 – 인덱스 이용 방법인덱스 이용 방법 indexed addressing modesindexed 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 CX, [BX+DI]MOV [BP+DI], CXMOV [EAX+EBX], ECX

{BX}

{CX}

×10H

{DI}p

m

{DS}

시스템프로그래밍54

80x86 80x86 주소지정 모드 – 주소지정 모드 – 인덱스 이용 방법인덱스 이용 방법 indexed addressing modesindexed addressing modes

베이스 상대 + 인덱스 모드 base-relative-plus-index mode

피연산자 : [register+register+offset] or offset[register+register+offset], registerMOV DH, [BX+DI+30H]MOV LIST[BP+SI+10], AXMOV AH, FILE[EBX+ECX+2]

{EBX}

{AH}

×10H

{ECX}

p

m

{DS}

2

FILE

시스템프로그래밍55

80x86 80x86 주소지정 모드 – 주소지정 모드 – 인덱스 이용 방법인덱스 이용 방법 indexed addressing modesindexed addressing modes

예.MODEL SMALL.DATA

FILE EQU THIS BYTERECA DB 10 DUP (?)RECB DB 10 DUP (?)RECC DB 10 DUP (?)RECD DB 10 DUP (?)

.CODE

.STARTUPMOV BX, OFFSET RECAMOV DI, 0MOV AL, FILE[BX+DI]MOV BX, OFFSET RECCMOV DI, 2MOV FILE[BX+DI], AL.EXITEND

시스템프로그래밍56

80x86 80x86 주소지정 모드 – 주소지정 모드 – 인덱스 이용 방법인덱스 이용 방법 indexed addressing modesindexed 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

{DX}

{EBX}

×10H

{DS}

10

LIST

pm

M{EAX}

×2

시스템프로그래밍57

80x86 80x86 주소지정 모드 – 주소지정 모드 – PC PC 이용 방법이용 방법 PC-related addressing modesPC-related addressing modes

직접 모드 메모리 공간의 어디든지 직접 갈 수 있음 ( 절대 위치로의 분기 )JMP [10000H] → CS : 1000H, IP : 0000H

상대 모드 현재 위치로부터의 상대 위치 short jump(1-byte displacement), near jump(2-byte

displacement)JMP [2] : 두 바이트를 건너뜀

간접 모드JMP AXJMP NEAR PTR[BX]JMP TABLE[BX]

{DS}

{BX}

TABLE

×10H

이 주소로분기

시스템프로그래밍58

80x86 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

시스템프로그래밍59

80x86 80x86 주소지정 모드 주소지정 모드 - - 기타기타

.MODEL SMALL ;select SMALL model .DATA ;indicate start of DATA segmentARRAY1 DB 10 DUP (?) ;reserve 10 bytes for ARRAY1ARRAY2 DB 10 DUP (?) ;reserve 10 bytes for ARRAY2

.CODE ;indicate start of CODE segment .STARTUP ;indicate start of program MOV AX,0 ;address segment 0000 with ES MOV ES,AX MOV DI,0 ;address element 0 MOV CX,10 ;count of 10LAB1: MOV AL,ES:[DI] ;copy 0000:0000 through

0000:0009 MOV ARRAY1[DI],AL ;into ARRAY1 INC DI LOOP LAB1

시스템프로그래밍60

80x86 80x86 주소지정 모드 주소지정 모드 - - 기타기타

MOV DI,0 ;address element 0 MOV CX,10 ;count of 10 MOV AL,0 ;initial valueLAB2: MOV ARRAY2[DI],AL ;fill ARRAY2 INC AL INC DI LOOP LAB2

MOV DI,3 ;exchange array data MOV AL,ARRAY1[DI] MOV AH,ARRAY2[DI+2] MOV ARRAY1[DI],AH MOV ARRAY2[DI+2],AL

.EXIT ;exit to DOS END ;end of file

시스템프로그래밍61

간접 주소 지정 방식 피연산자에 데이터가 저장되어 있는 번지를 지정 [ 주소 ] 기호를 사용 간접 주소 지정에 사용하는 레지스터

4 개의 레지스터만 사용 가능 - BX, BP, SI, DI

간접 주소 지정 방식 :

허용되지 않는 조합 3 개 모두 ‘없음’인 경우 , 8-bit offset 만 주어지는 경우 , [BP] 인 경우

80x86 80x86 주소지정 모드 – 주소지정 모드 – 간접 주소 지정 모드 요약간접 주소 지정 모드 요약

BXBP

없음

SIDI

없음

8-bit offset16-bit offset

없음+ +

시스템프로그래밍62

80x86 80x86 주소지정 모드 – 주소지정 모드 – 간접 주소 지정 모드 요약간접 주소 지정 모드 요약

간접 주소 지정 방식 ( 계속 ) 세그먼트 관련 조건

기본적으로 데이터는 데이터 세그먼트에 있다고 가정한다• 프로그램 초기에 데이터 세그먼트 설정이 필요

BP 를 포함하는 간접 지정에서는 데이터가 스택 세그먼트에 있다고 가정

간접 주소 지정 방식 관련 명령어 형식 교재 부록 D, pp.341 참조