Top Banner
시시시시시시시시 1 Lecture #7 Lecture #7 어어어어어 어어어어어 (4) (4) - 8086 - 8086 어어어 어어어어어 어어어 어어어어어
27

Lecture #7

Jan 25, 2016

Download

Documents

Lea

Lecture #7. 어셈블리어 (4) - 8086 매크로 어셈블리어. INCLUDE 의사 명령 (1). 예제 프로그램 #1 AL 레지스터의 값을 ASCII 코드 16 진수 값으로 화면에 출력하는 프로그램. PUTHEX:CMP DL, 0AH JAE HEX2 ADD DL, ‘0’ JMP HEX3 HEX2:ADD DL, ‘A’-0AH HEX3: MOV AH, 2 INT 21H RET - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Lecture #7

시스템프로그래밍1

Lecture #7Lecture #7

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

Page 2: Lecture #7

시스템프로그래밍2

INCLUDE INCLUDE 의사 명령의사 명령 (1)(1)

예제 프로그램 #1 AL 레지스터의 값을 ASCII 코드 16 진수 값으로 화면에

출력하는 프로그램MAIN SEGMENT

ASSUME CS:MAIN, DS:MAIN;;---------------------------------------------------------PUTAL: MOV BL, 10H

MUL BLMOV LEVEL1, AHMOV AH, 0MOV BL, 10HDIV BL

MOV LEVEL2, AL MOV DL, LEVEL1

CALL PUTHEX MOV DL, LEVEL2

CALL PUTHEXRET

;---------------------------------------------------------

PUTHEX: CMP DL, 0AHJAE HEX2ADD DL, ‘0’

JMP HEX3HEX2: ADD DL, ‘A’-0AHHEX3: MOV AH, 2

INT 21HRET

;---------------------------------------------------------LEVEL1 DB ?LEVEL2 DB ?;START: MOV AX, MAIN

MOV DS, AXMOV AL, 3FHCALL PUTAL MOV AH, 4CHINT 21H

MAIN ENDSEND START

Page 3: Lecture #7

시스템프로그래밍3

INCLUDE INCLUDE 의사 명령의사 명령 (2)(2)

예제 프로그램 #1 설명 PUTAL 프로시저 – AL 레지스터의 값을 2 자리의 ASCII 16

진수로 출력하는 서브루틴 PUTHEX 프로시저 – DL 레지스터의 값에 해당하는 문자

(‘0’~’9, ‘A’~’F’) 로 바꾸어 출력하는 서브루틴 END 명령에서 프로그램 시작 위치 (START) 를 지정

Page 4: Lecture #7

시스템프로그래밍4

INCLUDE INCLUDE 의사 명령의사 명령 (3)(3)

모듈별 분할 프로그래밍 (1) PUTAL 프로시저를 별도의 모듈 ( 어셈블리 파일 ) 로 작성한다 파일이름 – PUTAL.SUB

; MODULE – PUTAL.SUB;PUTAL: MOV BL, 10H

MUL BLMOV LEVEL1, AHMOV AH, 0MOV BL, 10HDIV BL

MOV LEVEL2, AL MOV DL, LEVEL1

CALL PUTHEX MOV DL, LEVEL2

CALL PUTHEXRET

;---------------------------------------------------------

PUTHEX: CMP DL, 0AHJAE HEX2ADD DL, ‘0’

JMP HEX3HEX2: ADD DL, ‘A’-0AHHEX3: MOV AH, 2

INT 21HRET

;---------------------------------------------------------LEVEL1 DB ?LEVEL2 DB ?

Page 5: Lecture #7

시스템프로그래밍5

INCLUDE INCLUDE 의사 명령의사 명령 (4)(4)

모듈별 분할 프로그래밍 (2) 모듈 PUTAL.SUB 을 이용할 경우 INCLUDE 의사 명령을

이용하여 예제 프로그램 #1 을 다음과 같이 수정할 수 있다

MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN

;INCLUDE PUTAL.SUB;START: MOV AX, MAIN

MOV DS, AXMOV AL, 3FHCALL PUTAL

MOV AH, 4CHINT 21H

;MAIN ENDS

END START

어셈블 과정에서 MASM 어셈블러에 의해

소스 확장이 이루어진 다음에 어셈블이

수행된다 .

Page 6: Lecture #7

시스템프로그래밍6

INCLUDE INCLUDE 의사 명령의사 명령 (5)(5)

모듈별 분할 프로그래밍 (3) 장점

프로그램을 기능별로 분할함으로써 이해가 용이 공동 및 병행 개발이 가능하여 효율적 한번 작성된 루틴을 효과적으로 반복 사용이 가능

단점 INCLUDE 의사 명령에 대한 소스 확장 과정이 필요 어셈블을 위한 전처리가 필요

Page 7: Lecture #7

시스템프로그래밍7

레지스터 보존레지스터 보존 (1)(1)

레지스터 보존 프로시저 호출을 사용하는 경우에 프로시저에서 호출

루틴에서 사용하는 레지스터 값을 변경하는 경우 프로시저에서 복귀하여 원래 루틴이 실행될 때에 오동작이

발생한다 .

레지스터 보존 (Register Housekeeping) 호출 루틴에서 프로시저가 사용하는 레지스터의 값을 보관한

다음 , 프로시저 복귀 후에 레지스터 값을 원래대로 복구한다 .

별도의 메모리를 이용한 레지스터 보존 스택을 이용한 레지스터 보존

Page 8: Lecture #7

시스템프로그래밍8

레지스터 보존레지스터 보존 (2)(2)

예제 프로그램 #2 변수 NUM 에 저장되어 있는 값들을 16 진수로 출력하는

프로그램

MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN

;INCLUDE PUTAL.SUB;START: MOV AX, MAIN

MOV DS, AX

MOV BX, OFFSET NUMMOV SI, 0

NEXT: MOV AL, [BX+SI]CMP AL, 0JE EXITMOV BXSAVE, BXCALL PUTALMOV BX, BXSAVEINC SIJMP NEXT

EXIT: MOV AH, 4CHINT 21H

;BXSAVE DW ?NUM DB 01H, 23H, 45H, 67H, 89H

DB 0ABH, 0CDH, 0EFH, 00H

;MAIN ENDS

END START

PUTAL 프로시저에서 BX 레지스터를 사용하기 때문에 원래 값을 별도의 메모리에

저장해둔다

Page 9: Lecture #7

시스템프로그래밍9

레지스터 보존레지스터 보존 (3)(3)

예제 프로그램 #2 문제점 레지스터 보존을 위해 별도의 메모리 공간을 사용 레지스터 값을 메모리에 전송하고 레지스터 값을 복구하기 위해

다시 읽어오는 과정이 요구됨으로 실행시간이 늘어난다 .

Page 10: Lecture #7

시스템프로그래밍10

프로그램+

데이터

스택 메모리

프로그램 메모리 할당

PUSH & POP PUSH & POP 명령명령 (1)(1)

스택 (Stack) LIFO(Last-In First-Out) 동작을 지원하는 메모리 공간 8086 CPU 는 스택 세그먼트를 지원한다

레지스터 SS(Stack Segment), SP(Stack Pointer) 에 의해 관리 PUSH / POP 명령에 의해 스택 메모리에 데이터 전송

Page 11: Lecture #7

시스템프로그래밍11

PUSH & POP PUSH & POP 명령명령 (2)(2)

PUSH & POP 명령

PUSH 명령은 operand 의 16 비트 데이터를 스택 (SS:SP) 에 저장한다

POP 명령은 스택 (SS:SP) 에서 16 비트 데이터를 읽어와 operand 에 저장한다

SP 레지스터 값은 PUSH/POP 명령에 의해 자동적으로 2 씩 증감한다

16 비트 범용 레지스터PUSH/POP 세그먼트 레지스터 16 비트 메모리

Page 12: Lecture #7

시스템프로그래밍12

PUSH & POP PUSH & POP 명령명령 (3)(3)

PUSH & POP 명령

번지FFF0

FFF1

FFF2

FFF3

FFF4

FFF5

FFF6

FFF7

FFF8

FFF9

FFFA

SP

PUSH

POP

F002F003F004F005F006F007F008F009

이전의 SP

새로운 SP

PUSH AX

F002F003F004F005F006F007F008F009

새로운 SP

이전의 SP

POP AX

Page 13: Lecture #7

시스템프로그래밍13

PUSH & POP PUSH & POP 명령명령 (4)(4)

스택을 이용한 레지스터 보존 (1) 예제프로그램 #2 을 스택을 사용하여 수정

MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, SS:MAIN

;INCLUDE PUTAL.SUB;START: MOV AX, MAIN

MOV DS, AXMOV SS, AX

MOV BX, OFFSET NUMMOV SI, 0

NEXT: MOV AL, [BX+SI]CMP AL, 0JE EXITPUSH BXCALL PUTALPOP BXINC SIJMP NEXT

EXIT: MOV AH, 4CHINT 21H

;NUM DB 01H, 23H, 45H, 67H, 89H

DB 0ABH, 0CDH, 0EFH, 00H

;MAIN ENDS

END START

PUTAL 프로시저에서 BX 레지스터를 사용한다는

사실을 알아야 레지스터를 보존할 수 있다 .

Page 14: Lecture #7

시스템프로그래밍14

PUSH & POP PUSH & POP 명령명령 (5)(5)

스택을 이용한 레지스터 보존 (2) PUTAL 프로시저에서의 레지스터 보존

; MODULE – PUTAL.SUB;PUTAL: PUSH AX

PUSH BXPUSH DXMOV BL, 10HMUL BLMOV DL, AHCALL PUTHEXMOV AH, 0MOV BL, 10HDIV BL

MOV DL, ALCALL PUTHEX

POP DXPOP BXPOP AX

RET;---------------------------------------------------------

PUTHEX: PUSH AXPUSH DXCMP DL, 0AH

JAE HEX2ADD DL, ‘0’

JMP HEX3HEX2: ADD DL, ‘A’-0AHHEX3: MOV AH, 2

INT 21HPOP DXPOP AXRET

;---------------------------------------------------------

Page 15: Lecture #7

시스템프로그래밍15

PUSH & POP PUSH & POP 명령명령 (6)(6)

스택을 이용한 레지스터 보존 (3)

MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, SS:MAIN

;INCLUDE PUTAL.SUB;START: MOV AX, MAIN

MOV DS, AXMOV SS, AX

MOV BX, OFFSET NUMMOV SI, 0

NEXT: MOV AL, [BX+SI]CMP AL, 0JE EXIT

; PUSH BXCALL PUTAL

; POP BXINC SIJMP NEXT

EXIT: MOV AH, 4CHINT 21H

;NUM DB 01H, 23H, 45H, 67H, 89H

DB 0ABH, 0CDH, 0EFH, 00H

;MAIN ENDS

END START

Page 16: Lecture #7

시스템프로그래밍16

PUSH & POP PUSH & POP 명령명령 (7)(7)

스택을 이용한 레지스터 보존 (4) 프로시저를 구현할 때에 프로시저 내에서 사용하는 레지스터는

스택에 보존하도록 한다 프로시저 시작 부분에서 레지스터를 스택에 PUSH

프로시저에서 반환하기 전에 레지스터 값을 스택에서 POP

호출 루틴에서 레지스터 보존에 대한 부담 없이 프로시저를 호출할 수 있도록 지원

Page 17: Lecture #7

시스템프로그래밍17

논리 연산 명령논리 연산 명령 (1)(1)

비트 연산 명령 비트 단위 연산을 수행하는 명령

논리 연산 명령 / 시프트 연산 명령

논리 연산 명령 비트 단위로 논리 연산 (and, or, not 등 ) 을 수행하는 명령

AND / OR / NOT / XOR / TEST / NEG

Page 18: Lecture #7

시스템프로그래밍18

논리 연산 명령논리 연산 명령 (2)(2)

AND 명령 주로 비트 마스크 (mask) 연산에 사용

예 ) AL 레지스터의 하위 4 비트 값만 구하기

AND AL, 0FH

OR 명령 주로 임의의 비트를 1 로 세트하는 연산에 사용

예 ) AL 레지스터 최상위 비트를 1 로 설정하기

OR AL, 80H

Page 19: Lecture #7

시스템프로그래밍19

논리 연산 명령논리 연산 명령 (3)(3)

XOR 명령 주로 임의의 비트를 반전시키는 연산에 사용

예 ) AL 레지스터의 상위 4 비트을 반전하기

XOR AL, 0F0H

TEST 명령 AND 명령과 유사하나 operand 값을 변경하지 않고 연산

결과에 대해 플래그 레지스터의 상태 비트를 설정한다

주로 임의의 비트가 1 인지를 검사하는 연산에 사용

예 ) AL 레지스터 최상위 비트를 1 인지를 검사하기

TEST AL, 80H

Page 20: Lecture #7

시스템프로그래밍20

논리 연산 명령논리 연산 명령 (4)(4)

NEG 명령 부호있는 데이터에 대한 부호 반전 ( 양수 음수 )

2 의 보수 연산 NOT 명령을 실행한 후에 1 을 더하여 결과를 없음

예 ) AL 레지스터의 2 의 보수 구하기

NEG AL

Page 21: Lecture #7

시스템프로그래밍21

논리 연산 명령논리 연산 명령 (5)(5) 예제프로그램

AL 레지스터에 대해 여러 가지 논리 연산을 수행한 후에 2 진수 형태로 출력하는 프로그램

MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN

;PUTBIN PROC NEAR

TEST AL, 10000000BCALL BINOUTTEST AL, 01000000BCALL BINOUTTEST AL, 00100000BCALL BINOUTTEST AL, 00010000BCALL BINOUTTEST AL, 00001000BCALL BINOUTTEST AL, 00000100BCALL BINOUTTEST AL, 00000010BCALL BINOUTTEST AL, 00000001BCALL BINOUT

RETPUTBIN ENDP

BINOUT PROCPUSH AXPUSH DXJZ PUT0MOV DL, ‘1’JMP PUT1

PUT0: MOV DL, ‘0’MOV AH, 2INT 21HPOP DXPOP AXRET

BINOUT EMDP;CRLF PROC

PUSH AXPUSH DXMOV DL, 0DHMOV AH, 2INT 21H

Page 22: Lecture #7

시스템프로그래밍22

논리 연산 명령논리 연산 명령 (6)(6) 예제프로그램 ( 계속 )

MOV DL, 0AHMOV AH, 2INT 21HPOP DXPOP AXRET

CRLF ENDP;START: MOV AX, MAIN

MOV DS, AXXOR AX, AXCALL PUTBINCALL CRLFMOV AL, 10101111BCALL PUTBINCALL CRLFAND AL, 11110000BCALL PUTBINCALL CRLFOR AL, 00000011BCALL PUTBINCALL CRLF

XOR AL, 11110000BCALL PUTBINCALL CRLFNOT ALCALL PUTBINCALL CRLFNOT ALCALL PUTBINCALL CRLF

;MOV AH, 4CHINT 21H

MAIN ENDSEND START

Page 23: Lecture #7

시스템프로그래밍23

시프트 시프트 & & 로테이트 명령로테이트 명령 (1)(1)

시프트 & 로테이트 명령 비트 단위의 자리 옮김 명령

시프트 & 로테이트 명령에 의해 넘치는 비트는 CF(Carry Fl

ag) 로 전송된다

SHL

SHR

SAL

SAR 범용 레지스터 (8/16 비트 ) 1

ROL 메모리 (8/16 비트 ) , CL

ROR

RCL

RCR

Page 24: Lecture #7

시스템프로그래밍24

시프트 시프트 & & 로테이트 명령로테이트 명령 (2)(2)

시프트 명령 SHL(SHift logical Left) / SHR(SHift logical Right)

SAL(Shift Arithmetic Left) / SAR(Shift Arithmetic Right)

CF MSB LSB

0

CFMSB LSB

0

CF MSB LSB

0

CFMSB LSB

0

Page 25: Lecture #7

시스템프로그래밍25

시프트 시프트 & & 로테이트 명령로테이트 명령 (3)(3)

로테이트 명령 ROL(ROtate Left) / ROR(ROtate Right)

RCL(Rotate through Carry Left) / RCR(Rotate through C

arry Right)

CF MSB LSB CFMSB LSB

CF MSB LSB CFMSB LSB

0

Page 26: Lecture #7

시스템프로그래밍26

시프트 시프트 & & 로테이트 명령로테이트 명령 (4)(4)

시프트 & 로테이트 명령 응용 곱셈 및 나눗셈에서 응용

2 의 지수승 곱셈 Shift Left

2 의 지수승 나눗셈 Shift Right

예 ) AL 레지스터에 16 곱하기

MOV CL, 4

SAL AL, CL

AL 레지스터를 8 로 나누기

MOV CL, 3

SAR AL, CL

실제 MUL/DIV 명령보다 빠른 속도로 연산을 수행

Page 27: Lecture #7

시스템프로그래밍27

시프트 시프트 & & 로테이트 명령로테이트 명령 (5)(5)

예제프로그램 PUTAL 프로시저를 시프트 명령을 이용하여 수정

; MODULE – PUTAL.SUB;PUTAL: PUSH AX

PUSH BXPUSH CXPUSH DXPUSH AXAND AL, 0F0HMOV CL, 4SHR AL, CLCALL PUTHEXPOP AXAND AL, 0FH

CALL PUTHEXPOP DXPOP CXPOP BXPOP AX

RET;---------------------------------------------------------

PUTHEX: PUSH AXPUSH DXCMP DL, 0AH

JAE HEX2ADD DL, ‘0’

JMP HEX3HEX2: ADD DL, ‘A’-0AHHEX3: MOV AH, 2

INT 21HPOP DXPOP AXRET

;---------------------------------------------------------