61
신신신신신 신신신신신신 신신신신신신신신 신신신신신 신신신신신 (1) (1) - 8086 - 8086 매매매 매매매매매 매매매 매매매매매 매매매 매매매매매 - Lecture #3

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

  • Upload
    prisca

  • View
    216

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

시스템 프로그래밍 - Lecture #3

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

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

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

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

고급언어 고급언어 & & 중급언어 중급언어 (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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

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

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

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

길어진다

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

신라대학교 컴퓨터공학과 시스템프로그래밍

저급언어저급언어 어셈블리어 (Assembly Language)

2 진수 형태의 기계어를 기호형식의 명령어로 표현한 언어 Machine Code Mnemonic Code

e.g) in 8086 Processor 100010 MOV 000000 ADD

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

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

자연어자연어

고급고급언어언어

저급저급언어언어

기계어기계어

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

원시원시코드코드

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

:1:1

컴파일러컴파일러

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

원시원시코드코드

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

:1:1

어셈블러어셈블러

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

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

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

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

가능 실행 시간이 짧아짐

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

U 에서 실행되는 명령어

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

지시어 (Directives)

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

어셈블리 프로그램의 틀을 구성

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

어셈블리 문장의 구성

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

0 개의 연산항 e.g) CLC

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

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

실실행행전전

실실행행후후

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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, LOOP

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

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

직접 주소 지정 (Direct addressing mode)

간접 주소 지정 (Indirect addressing mode)

– 레지스터 간접주소 지정

– 베이스 주소 지정

– 인덱스 주소 지정

– 베이스 인덱스 주소 지정

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

MAIN SEGMENT

ASSUME CS:MAIN

프로그램 블록

MAIN ENDS

END

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

신라대학교 컴퓨터공학과 시스템프로그래밍

문자 문자 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

지시어

지시어

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

지시어 지시어 ((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 로 끝남

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

신라대학교 컴퓨터공학과 시스템프로그래밍

지시어 지시어 ((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 로 끝남

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

예 ) 세그먼트와 프로시져Codename SEGMENT PARA 'code'

subroutinename PROC FAR

:

subroutinename ENDP

Codename ENDS

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

신라대학교 컴퓨터공학과 시스템프로그래밍

지시어 지시어 ((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] 같은 유형의 여러 세그먼트를 하나의 이름하에 한 세그먼트에

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

TINY | SMALL | MEDIUM | COMPACT | LARGE | HUGE

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

.MODELSMALL

.STACK 100

.DATA[ 데이타 항목 ]

.CODE[ 명령 ]

END

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

지시어 지시어 ((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'>

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

지시어 지시어 ((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' ; 문자열

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

기타 연산자 ( 계속 ) PTR operator

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

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

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

시스템 호출 시스템 호출 ((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 : 콘솔에서의 문자열 입력

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

어셈블리 프로그램의 구조

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

header

stack segment

data segment

code segment

ending

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

11 ;------------------------------------------

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

( 계속 )

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

( 계속 )

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

때에 사용하는 명령어 예 )

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

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

데이터 전송 명령 – 데이터 전송 명령 – 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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

데이터 전송 명령 – 데이터 전송 명령 – 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 A

H, 4CH

INT 21H

;

XXX DB ‘X’

YYY DB 3456H

;

MAIN ENDS

END

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

정의하여 사용하는 경우

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

신라대학교 컴퓨터공학과 시스템프로그래밍

데이터 전송 명령 – 데이터 전송 명령 – 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 A

H, 4CH

INT 21H

;

MAIN ENDS

;

DATA SEGMENT

XXX DB ‘AB’

MAIN ENDS

END

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

사용하는 경우

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

신라대학교 컴퓨터공학과 시스템프로그래밍

데이터 전송 명령 – 데이터 전송 명령 – 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 A

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

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

지정 방식

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

MOV 명령 – 예제 #5

MAIN SEGMENT ASSUME CS:MAIN, DS:DAT

A;

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 A

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

MOV WORD PTR [BX], ‘AB’

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

operand2operand2

operand1operand1

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

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

값값직 접직 접

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

○○

××

○○

○○

○○

○○

○○

××

○○

○○

○○

××

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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}

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

이 주소로분기

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

신라대학교 컴퓨터공학과 시스템프로그래밍

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

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

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

간접 주소 지정 방식 :

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

BXBP

없음

SIDI

없음

8-bit offset16-bit offset

없음+ +

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

신라대학교 컴퓨터공학과 시스템프로그래밍

80x86 80x86 주소지정 모드 – 주소지정 모드 – 간접 주소 지정 모드 요약간접 주소 지정 모드 요약 간접 주소 지정 방식 ( 계속 )

세그먼트 관련 조건 기본적으로 데이터는 데이터 세그먼트에 있다고 가정한다

– 프로그램 초기에 데이터 세그먼트 설정이 필요 BP 를 포함하는 간접 지정에서는 데이터가 스택 세그먼트에 있다고 가정

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