제4장 어셈블리어.

Slides:



Advertisements
Similar presentations
Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
Advertisements

천안천일고등학교 Copyright © by Ryu Bin All rights reserved 프로그래밍 실무.
컴퓨터와 인터넷.
3. 명령어 집합 구조 순천향대학교 정보기술공학부 이상정.
4장 어셈블리 프로그램 작성의 기본 어셈블러 어셈블리 언어 요소 예제 프로그램 데이터 정의
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제4장 어셈블리어.
기본 컴퓨터 프로그래밍 Lecture #6.
Lecture #12 인터럽트 Interrupt.
인터럽트 Interrupt 시스템 프로그래밍 - Lecture #8 신라대학교 컴퓨터공학과 시스템프로그래밍.
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 프로그래밍 언어 1-1 C 언어의 개론적 이야기 한글, 엑셀, 게임 등의 프로그램을 만들 때 사용하는 언어 ‘컴퓨터 프로그래머’라는 사람들이 제작 C 언어(C++ 포함)를 가장 많이 사용함.
Lecture #5 어셈블리어 (2) 매크로 어셈블리어 시스템프로그래밍.
컴퓨터 프로그래밍 기초 [Final] 기말고사
Lecture #7 어셈블리어 (4) 매크로 어셈블리어 시스템프로그래밍.
제7강 학습 내용 주소지정 방식의 예 값 즉시 지정 방식과 실행 예 레지스터 직접지정 방식 메모리 직접지정 방식과 실행 예
제 7 장 링커와 로더 설계.
Lecture # 어셈블러 설계.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
어셈블리 문법 보강 4월 10일.
System Programming 제1장 배경지식 시스템 프로그래밍.
REVERSE ENGINEERING HeXA 1st
Lecture #8 어셈블리어 (5) 매크로 어셈블리어 시스템프로그래밍.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
제 5장 매크로 프로세서 설계.
제 5장 매크로 프로세서 설계.
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS 이 종 태
Chapter 06 명령어와 번지지정 방식.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
제 6 장 8086 어셈블러 설계.
제 6장 8086 어셈블러 설계.
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
임베디드 실습 # LED, 7’Segment 제어
2주차: 변수, 수식, Control Flow.
제1장 컴파일러 개요.
제3장 8086 프로세서의 내부구조.
명품 C++ 프로그래밍 1장. C++ 시작.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
어셈블리어 (2) 매크로 어셈블리어 시스템 프로그래밍 - Lecture #4
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
이름 : 황 상 두 전화번호 : 이메일 : PinTool 이름 : 황 상 두 전화번호 : 이메일 :
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Lecture #9 매크로 프로세서 설계 & 구현.
연산자 (Operator).
논리회로 설계 및 실험 5주차.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
컴퓨터 시스템 하드웨어 컴퓨터 시스템 소프트웨어 C P U Control Unit 입 력 장 치 출 력 장 치 ALU
제4강 처리장치 1.
자바 5.0 프로그래밍.
ARM Development Suite v1.2
1. 2진 시스템.
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
Lecture #3 제2장 CPU의 구조와 기능(2).
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
AT MEGA 128 기초와 응용 I 기본적인 구조.
ARM Development Suite v1.2
Chapter 10 데이터 검색1.
공학도를 위한 C언어 프로그래밍실습1 -통합개발환경 사용법-
TVM ver 최종보고서
3.2 분기 명령어.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
Assembly 05 방호남 07 반지훈 09 박상욱.
ARM Development Suite v1.2
Presentation transcript:

제4장 어셈블리어

학습내용 프로그래밍 언어 어셈블리어 개요 어셈블리 프로그래밍 MASM 사용법

프로그래밍언어 계층

고급언어와 어셈블리어 예 b =1; c= 2; a = b+c; mov dword ptr [ebp-8],1 mov dword ptr [ebp-0Ch],2 mov eax,dword ptr [ebp-8] add eax,dword ptr [ebp-0Ch] mov dword ptr [ebp-4],eax

원시프로그램의 번역 과정 보조기억장치 주기억장치 운영체제 원시코드 컴파일러 프로 세서 목적코드 목적코드

고급언어와 저급언어에서 번역 고급언어 사용 저급언어 사용 자연어 (프로그래밍) (프로그래밍) 원시 코드 고급 언어 :1 원시 컴파일러 어셈블러 목적 코드 목적 코드 :n 기계어 :1

고급언어와 어셈블리어 고급언어 자연어와 가깝다 컴퓨터 동작에 대하여 알 필요가 없다 하나의 명령어는 수십 개의 기계어 프로세서에 호환 프로그램 이해가 용이하고 배우기 쉽다

고급언어와 어셈블리어 어셈블리어 기계어에 가깝다 컴퓨터의 각 장치들의 구체적 동작 제어 기계어 하나에 하나의 니모닉 명령어 프로세서 마다 따로 정의 프로그램이 난해하며 배우기 힘들다 빠른 속도

어셈블리어 (4-1) 명령어의 형식 2-번지 명령어의 예 프로그램의 형태와 예 MOV 명령에서 연산항의 조합 명령어의 순차적 실행 명령어의 조건적 분기와 예 무조건 분기와 예

어셈블리어의 개요 상징적인 연상 기호사용 기계어와 일대 일 대응 대표적인 저급언어 주로 시스템프로그래밍에 사용 하드웨어 이해에 적합

수행문의 구성 [Lable:] Mnemonic [Operand] [;Comment] 빈칸을 이용하여 구분 레이블은 하나의 어셈블리 명령어에 대하여 어떤 이름을 부여하는 것 다른 명령어는 그 이름을 사용하여 연관된 어셈블리 명령 참조 31문자까지 가능, 콜론(:)으로 끝난다. 알파벳, 숫자, 특수문자(?,,,@,$) 첫문자로 숫자는 사용하지 않음, 마침표는 반드시 첫자리에 레지스터 이름은 쓰지 않는다.

수행문의 구성 연상코드 : 어셈블리 언어를 배우는 것 피연산자 : 명령어에 따라 다르다. 두 개 이상 일 때는 쉼표로 구분

수행문의 성격 어셈블리 지시어 어셈블리 명령어 컴퓨터가 무엇을 하도록 지시하는 것이 아니고 어셈블러에 대한 지시 사항을 전달 기계어로 번역되지 않는다 어셈블리 명령어 컴퓨터로 하여금 무엇을 수행하라고 직접 명령 기계어로 번역

명령어의 형식 연산항을 갖지 않는 명령어 * CLC 하나의 연산항을 갖는 명령어 * DEC CX 두개의 연산항을 갖는 명령어 * MOV AX,BX

2 개의 연산항을 갖는 명령어 MOV AL,BL MOV AX,BX 1 2 3 4 1 2 3 4 출발항 BX 실 행 전 BX 16 8 7 0 16 8 7 0 1 2 3 4 1 2 3 4 출발항 BX 실 행 전 BX BH BL BH BL 0 0 0 0 0 0 0 0 목적항 AX AX AH AL AH AL 1 2 3 4 1 2 3 4 출발항 BX 실 행 후 BX BH BL BH BL 0 0 3 4 1 2 3 4 목적항 AX AX AH AL AH AL

상수 정수 문자상수 표시는 대문자 또는 소문자(b/ o,q/ d/ h) 16진법 첫 숫자는 반드시 아라비아 숫자 abcH  0abcH 16진법에서 A,B,C,D,E,F는 대/소문자 아무표시가 없으면 10진수 문자상수 ‘A’ ‘AB’ ‘Can’’t’ “Can’t”

어셈블리 지시어 프로그램 출력 지시어 프로세서 관련 지시어 데이터 관련 지시어

프로그램 출력 지시어 프로그램 출력 지시어 lines : 10~255 , default : 57 PAGE [lines] [,columns] TITLE text (임의의 문장) SUBTTL text(임의의 문장) lines : 10~255 , default : 57 columns : 60~132, default : 80 TITLE의 text 내용은 각 페이지 둘째 줄 왼쪽 SUBTTL의 text 내용은 셋째 줄 오른쪽

프로세서 관련 지시어 프로세서 관련 지시어 어떤 프로세서에서 쓰이는 명령어인지 어셈블러에게 지시 Default : .8086 .8086 .8087 .286 어떤 프로세서에서 쓰이는 명령어인지 어셈블러에게 지시 Default : .8086

데이터 관련지시어 데이터 관련 지시어 데이터 정의(DB, DW, DD, DT) 심볼 정의(EQU, =) 외부 프로그램 참조(PUBLIC, EXTRN, ICLUDE) 영역 정의(SEGMENT, ASSUME, PROC) 어셈블리 제어(END, EVEN, ORG)

데이터 정의 DB : 1 바이트 이상의 메모리 할당 DW : 2 바이트 메모리 할당 DD : 4 바이트 메모리 할당 DT : 10 바이트 메모리 할당

데이터 정의 max DB 255 wmax DW 65535 table DB 0,1,2 table DB 0 DB 1 DB 2 table DB 4 DUP(3), 8, 3 DUP(7) temp DB ? temp1 DW 12 DUP(?) 문자는 DB 사용 : msg DB “hello”

심볼 정의 EQU : 프로그램 내에서 변경할 수 없다. = : 프로그램 내에서 변경 가능하다.

외부 프로그램 참조 여러 프로그램을 연결 편집하여 하나의 수행 가능한 프로그램을 만들 때 각각의 프로그램 간에 서로 정보를 주고 받아야 한다. PUBLIC symbol[,…] 외부 사용자가 이 프로그램을 사용해도 좋다 EXTERN name : type[, …] 다른 곳에서 정의된 것을 사용하겠다 type : byte, word, dword, NEAR, FAR, ABS(EQU, =)

연산자 산술연산자(+,-,*,/,MOD,SHL,SHR) 논리연산자(AND,OR,XOR,NOT):비트단위 abc EQU 00110010B SHL 2 def EQU abc SHR 2 논리연산자(AND,OR,XOR,NOT):비트단위 관계연산자(EQ,NE,LT,GT,LE,GE) mov ax, const EQ 20 const가 20이면 ax는 FFFFh가 저장

프로그램의 기본형태 MAIN SEGMENT ASSUME CS:MAIN 프로그램 블록 MAIN ENDS END

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

MOV <operand1>, <operand2> 직 접 값 간접 operand1 범용 r. 세그먼트 r. 범용 r. 세그먼트 r. (CS는 제외) 간접:메모리주소 ○ × ○ ○ × ○ ×

MASM MASM TEST.ASM LINK TEST TEST

4-1 어셈블리어 요약 어셈블리언어의 개념 이해 명령어의 형식 이해 프로그램의 작성방법 이해

명령어의 조건적 분기 CX레지스터가 0일때만 분기 플래그 SF ZF PF CF OF CX 1:분기 JS JZ/JE JP/JPE JB/JNAE JO - 0:분기 JNS JNZ/JNE JNP/JPO JNB/JAE JNO JCXZ 1일때의 의미 보수표현으로 음수 결과가 0 1의 수가 짝수개 캐리플래그가 1 결과의 범위초과 CX레지스터가 0일때만 분기

조건적 분기 명령의 예 CMP AX,100 JA Loop1 * if AX>100 then Loop1으로 분기 JE Loop2

1~100 합을 구하는 프로그램 1 MAIN SEGMENT 2 ASSUME CS:MAIN, DS:MAIN 3 MOV AX, CS 4 MOV DS, AX 5 MOV CX, 1 6 MOV AX, 0 7 LOOP1: ADD AX, CX 8 INC CX

1~100 합을 구하는 프로그램 9 CMP CX, 100 10 JBE LOOP1 11 MOV SUM, AX 12 MOV AH, 4CH 13 INT 21H 14 SUM DW ? 15 MAIN ENDS 16 END

무조건 분기의 형태 기억장치 IP N JMP N-2 OVER N d =OVER - N . OVER

소문자를 대문자로 변환 1 MAIN SEGMENT 2 ASSUME CS:MAIN 3 L1: MOV AH, 1 4 INT 21H 5 CMP AL, 1AH 6 JE FIN 7 CMP AL,‘a’ 8 JB L2 9 CMP AL,‘z’

소문자를 대문자로 변환 10 JA L2 11 SUB AL, ‘a’-‘A’ 12 L2: MOV DL, AL 13 MOV AH, 2 14 INT 21H 15 JMP L1 16 FIN: MOV AH, 4CH 17 INT 21H 18 MAIN ENDS 19 END

주소지정방식 값 즉시 지정방식 직접 주소지정방식 간접 주소지정방식 * 레지스터 간접 주소지정 * 베이스 주소지정 레지스터 직접, 메모리 직접 간접 주소지정방식 * 레지스터 간접 주소지정 * 베이스 주소지정 * 인덱스 주소지정 * 베이스 인덱스 주소지정

값 즉시 지정방식 1010H + 203CH의 예 1 ;값 즉시 지정방식의 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV AX, 1010H

값 즉시 지정방식 7 ADD AX, 203CH 8 MOV RESULT, AX 9 MOV AH, 4CH 10 INT 21H 11 RESULT DW ? 12 MAIN ENDS 13 END

실행전의 기억장소 상태 0A5C : 0000 0A5C : 0002 0A5C : 0004 0A5C : 0007 0A5C : 000D 0A5C : 000F 0A5C : 0011 0A5C : 0013 MOV AX, CS MOV DS, AX MOV AX, 1010 ADD AX, 203C MOV [0011] , AX MOV AH, 4C INT 21 00 00

실행후의 기억장소 상태 0A5C : 0000 0A5C : 0002 0A5C : 0004 0A5C : 0007 0A5C : 000D 0A5C : 000F 0A5C : 0011 0A5C : 0013 MOV AX, CS MOV DS, AX MOV AX, 1010 ADD AX, 203C MOV [0011] , AX MOV AH, 4C INT 21 4C 30

레지스터 직접지정방식 MOV AL,BL AH AL AX 86 BL의 내용이 AL에 이동된다 BH BL BX 86

메모리 직접지정방식 데이터세그먼트 + DS 1010 AX B437 MOV AX,[0020] ×16 10100 10120 37 10121 B437 B4

직접주소지정의 실행과정 AX 1010 + AX 304C MOV AX,DATA1 ADD AX,DATA2 0012 0014 10 1427:0012 DATA1 1427:0014 DATA2 1427:0016 RESULT 1427:0018 10 10 3C 20 0016 4C 30 MOV RESULT, AX

DATA1,DATA2에 저장된 값의 합 1 ;값 주소지정방식 예제 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV AX, DATA1 7 ADD AX, DATA2

DATA1,DATA2에 저장된 값의 합 8 MOV RESULT, AX 9 MOV AH, 4CH 10 INT 21H 11 DATA1 DW 1010H 12 DATA2 DW 203CH 13 RESULT DW ? 14 MAIN ENDS 15 END

간접 주소지정의 유효주소 유효주소(EA) = BR + INX + D * BR:베이스 레지스터(BX,BP) * INX:인덱스 레지스터(SI,DI) * D:변위 - 레지스터 간접지정 : BR - 베이스 주소 지정 : BR, D - 인덱스 주소 지정 : INX, D - 베이스 인덱스 주소 지정 : BR,INX,D

8086 명령어의 형태 d는 레지스터의 방향 w는 바이트 또는 워드인지 결정 mod는 레지스터 또는 메모리 결정 3 byte 4 byte 1byte 5 byte 2byte 6 byte 7 6 5 4 3 2 1 7 6 5 4 3 2 1 변위 데이터 명령코드 d w mod reg r/m

MOV AL, CL 100010 1 0 11 000 001

주소지정방식 요약 주소지정방식의 이해 실행전·후의 기억장소 상태 이해 유효주소 생성의 이해 8086 명령어의 내용 이해

간접 주소지정 방식 레지스터 간접주소지정과 예 베이스 주소지정과 예 인덱스 주소지정과 예 베이스 인덱스 주소지정과 예

레지스터 간접 주소지정 ①LEA BX,DATA1 ②MOV AX,[BX] 0018 0018 BX 0018 0018 001A 001C AX 1010 10 10 3C 20

레지스터 간접 주소지정의 예 DATA1 + DATA2의 계산 1 ;레지스터 간접 주소지정 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 LEA BX, DATA1 7 MOV AX, [BX] 8 LEA BX, DATA2

레지스터 간접 주소지정의 예 9 ADD AX, [BX] 10 MOV RESULT, AX 11 MOV AX, 4CH 12 INT 21H 13 DATA1 DW 1010H 14 DATA2 DW 203CH 15 RESULT DW ? 16 MAIN ENDS 17 END

베이스 주소지정 방식 MOV AX, [BX] ADD AX, [BX+2] BX 0014 + AX 304C 0A5C:0014 DATA 0A5C:0016 0A5C:0018 RESULT 0A5C:0020 10 10 1010 3C 20 203C AX 304C 4C 30 MOV RESULT, AX

베이스 주소지정의 예 1 ;베이스 주소지정의 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 LEA BX, DATA 7 MOV AX, [BX]

베이스 주소지정의 예 8 ADD AX, [BX+2] 9 MOV RESULT, AX 10 MOV AH, 4CH 11 INT 21H 12 DATA DW 1010H, 203CH 13 RESULT DW ? 14 MAIN ENDS 15 END

인덱스 주소지정 방식 + AL 34 DI 0002 MOV DI, 2 MOV AL, DATA [DI] 0020 10 40 34 0A5C:0020 DATA 0A5C:0021 0A5C:0022 + 10 40 34 23 AL 34 ... DI 0002

인덱스 주소지정의 예 3월분→DATA1, 10월분→DATA2 1 ;인덱스 주소지정의 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV DI, 2 7 MOV AL, DATA[DI]

인덱스 주소지정의 예 8 MOV DATA1, AL 9 MOV DI, 9 10 MOV AL, DATA[DI] 12 MOV AH, 4CH 13 INT 21H 14 DATA DB 10 ; 1월 15 DB 40 ; 2월

인덱스 주소지정의 예 16 DB 34 ; 3월 ... 23 DB 26 ;10월 26 DATA1 DB ? 28 MAIN ENDS 29 END

베이스 인덱스 주소지정 방식 DI 0002 + BX 001A AX 0014 2 4 TABLE1 TABLE2 10 20 30 TABLE1 TABLE2 10 20 30 40 50 60 BX 레지스터의 값 LEA BX, TABLE1 0A5C:001A TABLE1 0A5C:001C 0A5C:001E 0A5C:0020 TABLE2 0A5C:0022 0A 00 MOV AX, [BX][DI] 14 00 1E 00 DI 0002 + 28 00 BX 001A AX 0014 32 00

베이스 인덱스 주소지정의 예 1 ;베이스 인덱스 주소지정의 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV DI, 2 7 LEA BX, TABLE1 8 MOV AX, [BX][DI] 9 LEA BX, TABLE2

베이스 인덱스 주소지정의 예 10 ADD AX, [BX][DI] 11 MOV RESULT, AX 12 MOV AH, 4CH 13 INT 21H 14 TABLE1 DW 10, 20, 30 15 TABLE2 DW 40, 50, 60 16 RESULT DW ? 17 MAIN ENDS 18 END

주소지정방식 요약 레지스터 간접주소지정의 이해 인덱스 주소지정의 이해 베이스 주소지정의 이해 베이스 + 인덱스결합 주소지정의 이해

ML 사용법 ML options filename.asm ML/Fl filename.asm : .lst .obj .exe MSAM + LINK : .obj, .exe ML/Fl filename.asm : .lst .obj .exe ML/Fm filename.asm : .map .obj .exe

assemble -> link -> execute 과정 library loader linker source file object file executable file output listing file map file text editor

ML/Fl tt.asm ML/Fl 사용법(tt.asm) LEA BX, DATA1 MAIN SEGMENT MOV AX, [BX] ASSUME CS:MAIN,DS:MAIN MOV AX,MAIN MOV DS,AX MOV AX,203CH MOV AL,CL LEA BX, DATA1 MOV AX, [BX] MOV AH,4CH INT 21H DATA1 DW 1010H MAIN ENDS END ML/Fl tt.asm

ML/Fl 사용법(tt.lst) 0000 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN 0000 B8 ---- R MOV AX,MAIN 0003 8E D8 MOV DS,AX 0005 B8 203C MOV AX,203CH 0008 8A C1 MOV AL,CL 000A 8D 1E 0014 R LEA BX, DATA1 000E 8B 07 MOV AX, [BX] 0010 B4 4C MOV AH,4CH 0012 CD 21 INT 21H 0014 1010 DATA1 DW 1010H 0016 MAIN ENDS END

XCHG(exchange data) XCHG reg,reg XCHG reg,mem XCHG mem,reg Two memory operands cannot be used together

XLAT 메모리내의 테이블로부터 데이터 로드 XLAT [tablename] lea bx, MyTable; 테이블의 위치 mov al,index ; 상대주소값을 al로 XLAT MyTable ; 값은 al 레지스터로

INC,DEC INC : increment , inc destination DEC : decrement , dec destination destination can be a register or memory operand

ADD,SUB ADD dest,src ; dest = dest + src SUB dest,src ; dest = dest - src The sizes of two operands must match only one can be a memory operand segment register cannot be the dest. add ax, word PTR temp

MUL,IMUL MUL : unsigned int, IMUL : signed int mul [reg | mem] ; 상수는 올 수 없다. 바이트 피연산자: AX = AL * 바이트 워드 피연산자 : DX:AX = AX * 워드

MUL,IMUL ex) 2000h * 10h = 20000h .data val1 dw 2000h val2 dw 0010h .code mov ax,val1 mul val2 ; dx = 0002h, ax=000h

DIV,IDIV DIV : unsigned int, IDIV : signed int DIV [reg | mem] ; 상수는 올 수 없다. 바이트 피연산자 AX / 바이트 > AL (몫), AH(나머지) 워드 피연산자 DX:AX / 워드 > AX(몫), DX(나머지)

DIV,IDIV ex) 8003h / 100h = 80h …3 mov dx,0 mov ax, 8003h mov cx,100h div cx ; ax = 0080h, dx = 0003h

LOOP loop : 조건 + jmp cx 값을 하나씩 줄여 나가면서 반복 수행 cx 값이 0 이면 그 다음 수행 mov cx,100 next: … … loop next

STACK LIFO(Last In First Out)방식을 취하는 메모리 상위메모리부터 저장 Each 16-bit location on the stack is pointed to by the SP register push(add), pop(remove)

PUSH,POP PUSH 명령어는 2바이트의 피연산자를 스택에 저장(SP는 2바이트씩 감소) POP 명령은 가장 마지막으로 넣은 값을 꺼내온다(SP는 2바이트씩 증가) CS,IP는 사용되어 질 수 없다.

STACK 예 mov cx,9 outer … push cx mov cx,20 inner … loop inner pop cx … loop outer

PUSHA,POPA 모든 레지스터를 스택에 저장,꺼냄 프로시져 호출 전/후에 주로 사용 프로시져에서 레지스터의 값 변경을 막기 위해서 사용 80286 이상에서 사용 ax,cx,dx,bx,sp,bp,si,di 순으로 저장

Procedure 어떤 특정한 과정을 처리하기 위해 메인 루틴과는 별도로 작성한 Subroutine CALL procedure_name name PROC [NEAR] 또는 name PROC FAR … RET name ENDP

NEAR,FAR Default : NEAR NEAR로 정의된 proc. 같은 세그먼트 내에 위치(IP만 스택에 저장) FAR로 정의된 proc. 다른 코드 세그먼트 에서도 참조 가능(CS,IP 스택에 저장)

Procedure 예 sseg SEGMENT para stack 'stack' db 64 DUP('stack') sseg ENDS dseg SEGMENT para public 'data' buffer db 16 dup(' ') ; buffer to hold chars bufferEnd label byte ; mark end of buffer xtable db '0123456789ABCDEF' ; translate table dseg ENDS

Procedure 예 MAIN SEGMENT para public 'code' ASSUME CS:MAIN, DS:dseg, ss:sseg MMAIN PROC FAR MOV AX,dseg MOV DS,AX mov ax, 5050 mov bx, 10 call Writeint MOV AH,4CH INT 21H MMAIN ENDP

Writeint proc mov cx,0 mov di, offset bufferEnd L3: mov dx,0 ; clear dividend to zero div bx ; divide AX by the radix xchg ax,dx ; exchange quotient, remainder push bx mov bx,offset xtable; translate table xlat ; look up ASCII digit pop bx dec di ; back up in buffer mov [di],al ; move digit into buffer xchg ax,dx ; swap quotient into AX inc cx ; increment digit count or ax,ax ; quotient = 0? jnz L3 ; no: divide again

; Display the buffer using CX as a counter. L4: mov ah,2 ; function: display character mov dl,[di] ; character to be displayed int 21h ; call DOS inc di ; point to next character loop L4 ret Writeint endp MAIN ENDS END MMAIN