제4장 어셈블리어.

Slides:



Advertisements
Similar presentations
1 Prof. Young Jin Nam, Daegu University 컴퓨터 구조 (Computer Architecture) 명령어 세트 : 특성과 기능 남영진
Advertisements

ISA 심화 및 start.S code 분석 SIOR 15th 최재훈.
Basic of Buffer Over Flow
Shellcode 작성 김영성.
CRT 뽀개기 신영진.
9장 가로채기(Interrupt) Slide 1 (of 15).
4장 어셈블리 프로그램 작성의 기본 어셈블러 어셈블리 언어 요소 예제 프로그램 데이터 정의
6장 자료사전(DD).
제4장 어셈블리어.
기본 컴퓨터 프로그래밍 Lecture #6.
Lecture #12 인터럽트 Interrupt.
Lecture #5 어셈블리어 (2) 매크로 어셈블리어 시스템프로그래밍.
10장 주변장치 (PIO) Slide 1 (of 28).
Lecture #7 어셈블리어 (4) 매크로 어셈블리어 시스템프로그래밍.
제7강 학습 내용 주소지정 방식의 예 값 즉시 지정 방식과 실행 예 레지스터 직접지정 방식 메모리 직접지정 방식과 실행 예
제 7 장 링커와 로더 설계.
제 1 장 마이크로프로세서의 기본동작.
Lecture # 어셈블러 설계.
3장 MPU 내부구조 Slide 1 (of 28).
제4장 제어 유니트 4.1 제어 유니트의 기능 4.2 제어 유니트의 구조 4.3 마이크로 명령어의 형식
7장 마이크로프로세서의 명령어수행과 주소지정 방식 Slide 1 (of 29).
출처: IT CookBook, 컴퓨터 구조와 원리 2.0 제 12장
어셈블리 문법 보강 4월 10일.
PowerPC ABI 김종화.
수학 I 2. 방정식과 부등식.
+ 가상 메모리 -> 물리 메모리 Selector Offset DIR Page Segmetatation
Lecture #8 어셈블리어 (5) 매크로 어셈블리어 시스템프로그래밍.
Ch2-2. VHDL Basic VHDL lexical element VHDL description
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
9장. 중앙처리 장치의 조직과 기능 다루는 내용 컴퓨터 본체에서 CPU의 위치 살펴보기 CPU의 성능, 기능, 조직
Computer Architecture
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 5장 매크로 프로세서 설계.
제 5장 매크로 프로세서 설계.
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS 이 종 태
Chapter 06 명령어와 번지지정 방식.
ARM 명령어 집합 Lecture #7.
제 6 장 8086 어셈블러 설계.
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
BOF of 2.6 Kernel ! 박수완 / Su-Wan, PARK [ L1nkC] 숭실대학교 정보보호동아리 ACK
제3장 8086 프로세서의 내부구조.
제 2장 컴퓨터동작의 기본 개념.
임베디드 소프트웨어 설계.
10장. 중앙처리 장치의 명령어 다루는 내용 어셈블리 프로그램의 이해 인터럽트(interrupt) 명령어 세트 주소 지정 방식.
명령어 구조 컴퓨터 하드웨어의 구성 프로그램 명령어 프로그램 실행 동작.
쉽게 풀어쓴 C언어 Express 제1장 프로그래밍의 개념 C Express.
Chapter 4 The Von Neumann Model.
명품 C++ 프로그래밍 1장. C++ 시작.
Buffer Overflow
제 장 학습내용 C 언어에서의 인터럽트 사용 레지스터를 위한 자료구조 인터럽트를 수행하기 위한 명령어
Chapter 2 Lexical Elements, Operators, and the C System
어셈블리어 (2) 매크로 어셈블리어 시스템 프로그래밍 - Lecture #4
Computer System Architecture
PIC16C84의 외형 RA2 1 RA1 I/O PIN I/O PIN RA3 RA0 RTCC OSC1 발 진 RESET
ARM Development Suite v1.2
운영체제 (Operating Systems) (Memory Management Strategies)
Lecture #9 매크로 프로세서 설계 & 구현.
제 2 장 어셈블러(Assemblers) 2.1 기본 어셈블러 기능 단순 SIC 어셈블러
1. 컴퓨터 시스템 구성요소 메모리(Memory) 캐시메모리 개념 캐시메모리의 특징 적중률(hit ratio)
4. 어휘 분석(Lexical analysis)
9장. 중앙처리 장치의 조직과 기능 다루는 내용 컴퓨터 본체에서 CPU의 위치 살펴보기 CPU의 성능, 기능, 조직
쉽게 풀어쓴 C언어 Express 제1장 프로그래밍의 개념 C Express.
제4강 학습내용 인텔프로세서의 발전 과정 8086 프로세서와 80i86프로세서 개요 인텔 펜티엄 IV프로세서 개요
C언어 프로그래밍의 이해 Ch03. 기본 자료형, 변수와 상수.
10장. 컴퓨터 구조에 대한 세 번째 이야기 작성자: 윤성우.
Assembly 05 방호남 07 반지훈 09 박상욱.
프로그래밍 기법 최적화 프로그래밍.
4-1. 명령어 형식.
제 1 강 컴퓨터의 구조.
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개 명령어 원시 코드 저급 언어 :1개 명령어 컴파일러 (복잡, 느림) 어셈블러 (간단, 빠름) 목적 코드 목적 코드 기계어 :N개 명령어 :1개 명령어 마이크로 코드 (전기회로의 동작상태 기술)

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

고급언어와 어셈블리어 어셈블리어 기계어에 가깝다(대표적인 저급언어) 컴퓨터의 각 장치들의 구체적 동작 제어 기계어 하나에 하나의 니모닉 명령어 프로세서 마다 따로 정의 프로그램이 난해하며 배우기 힘들다 빠른 속도 주로 시스템 프로그래밍에 사용 하드웨어 이해에 적합

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

어셈블리 지시어 데이터 관련 지시어 데이터 정의(DB, DW, DD, DT) 심볼 정의(EQU, =) 프로그램 출력 지시어 PAGE [lines] [,columns] ; 프린트 될 페이지 결정 lines : 10~255 , default : 57 columns : 60~132, default : 80 TITLE text(임의의 문장) SUBTTL text(임의의 문장) 프로세서 관련 지시어 .8086 .8087 .286 어떤 프로세서에서 쓰이는 명령어인지 어셈블러에게 지시 Default : .8086 데이터 관련 지시어 데이터 정의(DB, DW, DD, DT) 심볼 정의(EQU, =) 외부 프로그램 참조(PUBLIC, EXTRN, ICLUDE) 영역 정의(SEGMENT, ASSUME, PROC) 어셈블리 제어(END, EVEN, ORG)

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

명령어 구성 연상코드(Mnemonic): 명령어 실행 내용을 나타냄 연산항(Operand): 명령어에 따라 상이 명령어가 작용하는 레지스터나 기억 장소의 위치 두개 일 때 앞의 것은 목적지 연산항 뒤의 것은 출발지 연산항

명령어 형식 연산항을 갖지 않는 명령어 * CLC ;캐리플래그를 0으로 함 하나의 연산항을 갖는 명령어 * DEC CX ;CX 레지스터의 값을 하나줄임 두개의 연산항(출발항, 목적항)을 갖는 명령어 * MOV AX, BX ;BX값을 AX로 옮김

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

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

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

문자 A를 출력하는 프로그램 (4-1) 1 MAIN SEGMENT ;MAIN 세그먼트 시작 주석문 vs 지시어 vs 명령어 1 MAIN SEGMENT ;MAIN 세그먼트 시작 2 ASSUME CS : MAIN ;코드 세그먼트 지정 3 MOV DL, ‘A’ ;출력할 문자 저장 4 MOV AH, 2 ;콘솔로 문자 출력 5 INT 21H ;AH(수행할 명령)값에 따라 ;기능 수행 6 MOV AH, 4CH ;DOS 프롬프트 복귀(종료) 7 INT 21H ;DOS 인터럽트 시스템 호출 8 MAIN ENDS ;MAIN 세그먼트 끝 9 END ;프로그램 종료

문자 A를 출력하는 프로그램 MAIN SEGMENT 세그먼트의 이름을 ‘MAIN’으로 한다는 선언문 ASSUME CS : MAIN MAIN은 코드 세그먼트, MAIN내의 레이블을 참조할 때는 CS 레지스터로부터 세그먼트의 주소를 얻어서 사용하라는 지시어 MAIN ENDS MAIN 세그먼트 끝을 나타내는 지시어 END 프로그램의 끝을 나타내는 지시어

문자 A를 출력하는 프로그램 MOV DL, ‘A’ 출력할 문자를 DL 레지스터로 전송하라는 명령어 MOV AH, 2 INT 21H AH 레지스터에 저장된 명령코드에 따라 기능(부록 F) 수행 MOV AH, 4CH DOS 프롬프트 복귀 하라는 의미의 명령코드 ’4Ch’를 AH 레지스터로 전송하라는 명령어

프로그램 실행 번역: masm filename 프로그램을 ex4-2.asm으로 저장했다면… masm ex4-2.asm  링크: link filename ex4-2.asm을 번역하고 나면 ex4-2.obj 파일이 생성… link ex4-2  실행: filename ex4-2.obj 파일을 링크하고 나면 ex4-2.exe 파일이 생성… ex4-2 

상수 정수 문자상수 실수: 12.34, 1.234E1 표시는 대문자 또는 소문자(2:b; 8:o,q; 10:d; 16:h) 16진법 첫 숫자는 반드시 아라비아 숫자 abcH  0abcH 16진법에서 A,B,C,D,E,F는 대/소문자 아무 표시가 없으면 10진수 문자상수 ‘A’ ‘AB’ ‘Can’’t’ “Can’t” 실수: 12.34, 1.234E1 DD, DQ, DT에 의해서만 정의가능 실수 자체가 명령어에서 직접 사용되지는 않는다.

상수 정의 레이블 EQU 상수[식] 레이블 = 상수[식] EQU 사용시 한번 정의된 레이블은 재정의가 불가 레이블 = 상수[식] EQU 사용시 한번 정의된 레이블은 재정의가 불가 SUM EQU 2FFh XT = ‘Z’ SUM EQU 3FAh ;재정의 불가능, 오류발생 XT = ‘Y’ ;재정의 가능

변수 정의 DB : 1 바이트 이상의 메모리 할당 DW : 워드 (2바이트) 메모리 할당 DD : 2워드 (4바이트) 메모리 할당 DQ : 4워드 (8바이트) 메모리 할당 DT : 10 바이트 메모리 할당 [레이블] DB expression[,반복]

변수 정의 max DB 255 wmax DW 65535 table DB 0,1,2 table DB 0 DB 1 DB 2 table DW 3, 3, 3, 3, 8, 7, 7, 7 table DW 4 DUP(3), 8, 3 DUP(7) temp DB ? temp1 DW 12 DUP(?) 문자는 DB 사용 : msg DB ‘abcabc’ msg DB 2 DUP(‘abc’)

어셈블리어… 문법 여러 프로그램을 연결 편집하여 하나의 수행 가능한 프로그램을 만들 때 각각의 프로그램 간에 서로 정보를 주고 받아야 한다. PUBLIC symbol[,…] 외부 사용자가 이 프로그램을 사용해도 좋다 EXTERN name : type[, …] 다른 곳에서 정의된 것을 사용하겠다 type : byte, word, dword, NEAR, FAR, ABS(EQU, =) SEGMENT 프로그램의 영역을 구분하는데 사용 세그먼트란 한 세그먼트 레지스터 내의 주소를 참조 함으로서 찾아갈 수 있는 모든 명령문과 데이터의 집합 s_name SEGMENT … s_name ENDS ENDS ASSUME ASSUME s_reg : s_name END [entry_point name] 원시 프로그램의 끝을 정의 EVEN 메모리 주소를 짝수에 위치 시킴 산술연산자(+,-,*,/,MOD,SHL,SHR) / : 몫, MOD: 나머지 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가 저장 아니면 0

순차적 실행 프로그램을 저장된 순서대로 실행 분기: 실행순서를 변경 BIU는 IP에 있는 내용을 주소버스로 출력 주소가 가리키는 기억장소에서 명령어를 인출하여 명령어 큐에 저장 EU에서 명령어를 명령어 큐로부터 읽어와서 해독 명령어 실행 IP 증가 (다음 명령어를 가리키도록) 분기: 실행순서를 변경

조건 분기 Jcc <분기되어 갈 주소> Cc에 올 수 있는 문자

조건 분기 명령의 예 CMP AX,100 JA Loop1 * if AX>100 then Loop1으로 분기 JE Loop2 CMP A, B ; A-B 값을 이용하여 플래그 레지스터의 비트를 세팅

명령어의 조건 분기 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의 수가 짝수개 올림수 발생 결과의 범위초과 CX 레지스터가 0일 때만 분기

1~100 합을 구하는 프로그램 (4-2) 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 LOOP1: 표지기호(label), 특정 명령어가 있는 주소에 붙여지는 이름

ADD와 INC 명령어 ADD <operand 1>, <operand 2> ADD [BX], 20h ; BX에는 주소가 저장되어 있음 ADD BYTE PTR [BX], 20h ; BX가 가리키는 곳의 메모리를 바이트로 재정의 INC <operand>, DEC <operand> INC CX ; CX 레지스터의 값을 하나 증가 DEC CX ; CX 레지스터의 값을 하나 감소

1~100 합을 구하는 프로그램 (4-2) 9 CMP CX, 100 10 JBE LOOP1 ; IF CX-100 <= 0, GOTO LOOP1 11 MOV SUM, AX 12 MOV AH, 4CH 13 INT 21H 14 SUM DW ? 15 MAIN ENDS 16 END

무조건 분기 기억장치 IP N JMP OVER . N-2 N IP = IP + d d =OVER - N OVER 변위(d: displacement)

소문자를 대문자로 변환 (4-3) 1 MAIN SEGMENT 2 ASSUME CS:MAIN 3 L1: MOV AH, 1 4 INT 21H 5 CMP AL, 1AH ;1AH = ^Z 6 JE FIN 7 CMP AL, ‘a’ ;IF AL – ‘a’ >= 0 8 JB L2 9 CMP AL, ‘z’ ;IF AL – ‘z’ >= 0

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

SUB 명령어 SUB <operand 1>, <operand 2> SUB AL, 20h ; AL에 저장되어 있는 값에서 20h를 뺀 후 이 값을 다시 AL에 저장

주소 지정방식(데이터 지정방식) 값 즉시 지정: 8 또는 16비트 값 직접 이용 직접 주소 지정: 레지스터 또는 기억장치주소가 저장하고 있는 값 직접 이용 레지스터 직접, 메모리 직접 간접 주소 지정: 레지스터가 가리키는 주소에 있는 값 간접이용 (주소를 만든 방식에 따라 분류) * 레지스터 간접 주소지정 * 베이스 주소지정 * 인덱스 주소지정 * 베이스 인덱스 주소지정

값 즉시 지정방식 연산항에 레지스터나 기억장소의 주소가 아닌 8비트 또는 16비트의 숫자를 직접 오게 하는 방법

값 즉시 지정방식 (4-4) 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 11번지 30 12번지

LST 파일

레지스터 직접지정방식 AH AL AX 86 BL의 내용이 AL에 이동된다 BH BL BX 86 MOV AL,BL 레지스터에 저장되어 있는 값을 그대로 이용 MOV AL,BL AH AL AX 86 BL의 내용이 AL에 이동된다 BH BL BX 86

메모리 직접지정방식 기억장치주소에 저장되어 있는 값을 그대로 이용 MOV AX,[0020] 데이터세그먼트 ×16 1010 + DS 1010 + 10100 10120 37 AX B437 10121 B4

DATA1,DATA2에 저장된 값의 합 (4-5) 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에 저장된 값의 합 (4-5) 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

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

실행전의 기억장소 상태 0A5C : 0000 0A5C : 0002 0A5C : 0004 0A5C : 0007 0A5C : 000B 0A5C : 000E 0A5C : 0010 0A5C : 0012 0A5C : 0014 0A5C : 0016 0A5C : 0018 MOV AX, CS MOV DS, AX MOV AX, [0012] ADD AX, [0014] MOV [0016] , AX MOV AH, 4C INT 21 10 10 3C 20 00 00

실행후의 기억장소 상태 0A5C : 0000 0A5C : 0002 0A5C : 0004 0A5C : 0007 0A5C : 000B 0A5C : 000E 0A5C : 0010 0A5C : 0012 0A5C : 0014 0A5C : 0016 0A5C : 0018 MOV AX, CS MOV DS, AX MOV AX, [0012] ADD AX, [0014] MOV [0016] , AX MOV AH, 4C INT 21 10 10 3C 20 4C 30

간접 주소지정의 유효주소 유효주소(EA) = BR + INX + D * BR: 베이스 레지스터(BX, BP) * INX: 인덱스 레지스터(SI, DI) * D: 변위(8비트 또는 16비트 상수값) - 레지스터 간접지정: BR - 베이스 주소 지정: BR, D - 인덱스 주소 지정: INX, D - 베이스 인덱스 주소 지정: BR, INX, D

8086 명령어의 형태 어셈블리 명령어  기계어 d는 레지스터의 방향 w는 바이트 또는 워드인지 결정 mod & r/m은 레지스터 또는 메모리 결정 reg는 조작에 쓰이는 레지스터 결정 1byte 2byte 3byte 4byte 5byte 6byte 7 6 5 4 3 2 1 7 6 5 4 3 2 1 immed -low immed -high disp -low disp -high 명령코드 d w mod reg r/m 상수항 변위

mod, r/m 필드의 의미

reg, seg 필드의 의미

레지스터 간접 주소지정 방식 지정된 베이스 레지스터 또는 인덱스 레지스터의 값이 유효주소가 됨 [BR] [레지스터 이름]: []는 주소가 나타내는 값을 의미함

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

레지스터 간접 주소지정의 예 (4-6) 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

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

실행전후의 기억장소 상태

베이스 주소지정 방식 지정된 베이스 레지스터의 값과 변위 값을 합하여 유효주소를 계산 [BR + D] [레코드의 시작위치 + 특정 필드까지의 거리]

베이스 주소지정의 예 (4-7) 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]

베이스 주소지정의 예 (4-7) 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

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

실행전후의 기억장소 상태

인덱스 주소지정방식 변위값에 인덱스 레지스터의 값을 합하여 유효주소를 계산 D[INX] : 유효주소 = D + INX 배열의 시작위치[특정 요소까지의 거리]

인덱스 주소지정의 예 (4-8) 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

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

LST 파일 22h 1Ah 실행후

베이스 인덱스 주소지정방식 지정된 베이스 레지스터의 값과 변위 값을 합한 값에 인덱스 레지스터의 값을 합하여 유효주소를 계산 [BR+D][INX] : 유효주소 = BR + D + INX 구조체와 같은 복잡한 자료의 표현을 위해 이용

베이스 인덱스 주소지정의 예 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

베이스 인덱스 주소지정 방식 0002 DI + 001A BX 0014 AX 2 4 TABLE1 TABLE2 10 20 30 2 4 DI 레지스터의 값 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 0002 1E 00 DI + 28 00 BX 001A 0014 AX 32 00

LST 파일 0046h 실행후

MOV와 ADD 명령어의 코드 변환

MOV와 ADD 명령어의 코드 변환 값 즉시 지정방식 (Immediate to Register) 명령어 : MOV AX, 203Ch B8 20 3C : 1101 1000 0010 0000 0011 1100 코드 w reg = AX 20 3C

MOV와 ADD 명령어의 코드 변환 레지스터 직접지정 (Register to/from Register/Memory) 명령어 : MOV AL, CL 8A C1 : 1000 1010 1100 0001 코드 d w Mod = 직접 reg = AL r/m = CL To register (AL)

MOV와 ADD 명령어의 코드 변환 레지스터 간접지정 (Register to/from Register/Memory) 명령어 : MOV AX, [BX] 8A C1 : 1000 1011 0000 0111 코드 d w Mod = 간접 reg = AX r/m = [BX] To register (AX)

MASM MASM TEST.ASM LINK TEST TEST

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 예 (AX 숫자 출력) 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