Microsoft PowerPoint - a4.ppt [호환 모드]

Similar documents
Microsoft PowerPoint - a4.ppt [호환 모드]

Microsoft PowerPoint - a6.ppt [호환 모드]

PowerPoint 프레젠테이션

hlogin2

Microsoft PowerPoint - a10.ppt [호환 모드]

Microsoft PowerPoint - a9.ppt [호환 모드]

Microsoft PowerPoint - hy2-12.pptx

Microsoft PowerPoint - a2.ppt [호환 모드]

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

Microsoft PowerPoint - a8a.ppt [호환 모드]

Microsoft PowerPoint - hw8.ppt [호환 모드]

=

Microsoft PowerPoint - a3.ppt [호환 모드]

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - a5a.ppt [호환 모드]

No Slide Title

(1) 주소지정방식 Address Mode 메모리접근 분기주소 명령어 직접번지 Reg. 지정 Reg. 간접 Base Index 간접 Immediate 상대번지 절대번지 Long 주소 Reg. 간접 Byte Access Bit Access 내부 Data M

Deok9_Exploit Technique

untitled

슬라이드 1

9

PowerPoint 프레젠테이션

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Computer Architecture

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - Chapter_04.pptx

Microsoft PowerPoint - o8.pptx

<BEEEBCC0BAEDB8AEBEEEC1A4B8AE2E687770>

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

Microsoft PowerPoint - chap06-2pointer.ppt

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

학습목차 r 컴퓨터본체에서 CPU 의위치살펴보기 r CPU 의성능 r CPU 의기능 r CPU 의조직 r 레지스터의조직 r 명령어사이클 r 명령어파이프라이닝 컴퓨터구조 2 9. CPU 조직과기능

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

11장 포인터

OCW_C언어 기초

Microsoft PowerPoint - hy2-12.pptx

PowerPoint Presentation

금오공대 컴퓨터공학전공 강의자료

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

Microsoft Word - 1. ARM Assembly 실습_xp2.doc

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - 15-MARS

설계란 무엇인가?

PowerPoint 프레젠테이션

IDA 5.x Manual hwp

금오공대 컴퓨터공학전공 강의자료

hwp

Microsoft PowerPoint - chap04-연산자.pptx

ch15

Data Structure

Frama-C/JESSIS 사용법 소개

Microsoft Word - FunctionCall

Microsoft PowerPoint - Chapter_02.pptx

Microsoft PowerPoint - 1-2장 디지털_데이터 .ppt

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

Microsoft Word - ExecutionStack

Computer Architecture

PowerPoint Presentation

T100MD+

Microsoft PowerPoint - c2.ppt

프로그램카운터 (Program Counter) 명령레지스터 (Instruction Register) 누산기 (AC: Accumulator) 상태레지스터 (Status Register) PSWR(Program Status Word Register) 메모리주소레지스터 (M

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

C# Programming Guide - Types

Microsoft PowerPoint - 부호기와 복호기.PPT

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

Microsoft PowerPoint - chap10-함수의활용.pptx

PowerPoint 프레젠테이션

Microsoft Word - Heap_Spray.doc

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

Visual Basic 반복문

Microsoft PowerPoint - 제11장 포인터(강의)

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

구문 분석

Microsoft PowerPoint - chap03-변수와데이터형.pptx

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

시스템 프로그래밍.hwp

PowerPoint Template

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

PowerPoint Presentation

Microsoft PowerPoint - chap-05.pptx

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

OCW_C언어 기초

2 장수의체계 1. 10진수 2. 2진수 3. 8진수와 16진수 4. 진법변환 5. 2진정수연산과보수 6. 2진부동소수점수의표현 한국기술교육대학교전기전자통신공학부전자전공 1

02장.배열과 클래스

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - 강의자료8_Chap9 [호환 모드]

Microsoft PowerPoint - chap-11.pptx

Microsoft PowerPoint - C++ 5 .pptx

MicrocontrollerAcademy_Lab_ST_040709

API 매뉴얼

Microsoft Word - Reversing Engineering Code with IDA Pro-4-1.doc

<C0FCC0DAB0E8BBEAB1E2B1B8C1B6347E36B0AD20B9AEC1A62BC1A4B4E42E687770>

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Transcription:

이장의내용 4 장데이터전송, 주소지정, 산술연산 데이터전송명령어 덧셈과뺄셈 데이터관련연산자와디렉티브 간접주소지정 JMP와 LOOP 명령어 컴퓨터정보통신 컴퓨터정보통신 어셈블리언어 2 4.1 데이터전송명령어 Instruction Operand 표기 (Intel) 피연산자 (operand) 의유형 즉시값 (Immediate) 상수정수 ( 식 )(8 (8, 16, 32bits) 값이 instruction 에포함됨 Register CPU 내의레지스터이름 레지스터이름이 instruction 에부호화되어포함됨 Memory 메모리위치에대한참조정보 주소또는주소를저장한레지스터이름이 instruction 에포함됨 ( 직접메모리피연산자또는간접메모리피연산자 ) 예 MOV AX, 100 ;AX 100 즉시값 ( 상수 ) MOV AX, CX ; AX CX 레지스터 MOV AX, [100] ; AX M(DS:100), 16-bit 메모리 - 직접주소 MOV AX, [SI] ; AX M(DS:SI), 16-bit 메모리 - 간접주소 컴퓨터정보통신 어셈블리언어 3 컴퓨터정보통신 어셈블리언어 4

직접메모리피연산자 직접메모리피연산자 instruction 에포함된메모리주소에있는메모리피연산자 MOV AL, [400] 직접주소지정방식 어셈블리언어에서는메모리주소대신에 data label 을사용함 어셈블러가 data label 을 offset 주소로변환해줌 예 MOV AL, var1 MOV AL, [var1] 또는 이표기를선호함 var1 BYTE 10h ; 변수 ( 데이터 ) mov al,var1 ; AL = 10h 컴퓨터정보통신 어셈블리언어 5 MOV 명령어 MOV dst, src 동작 : dst src operand 사용규칙 두피연산자는같은크기이어야함 두피연산자가모두메모리일수는없음 CS, EIP( 또는 IP) 는 dst 일수없음 immediate 값은 segment register 로이동할수없음 잘못사용한예 mov ax, bl (x) ; 크기가다름 mov var1, var2 (x) ; var1, var2는 data label( 변수 ) mov cs, ax (x) ; CS가 dst임 mov ds, 400h (x) () ; 숫자를 DS로이동 컴퓨터정보통신 어셈블리언어 6 사용예 잘못된예 count BYTE 100 wval WORD 2 mov bl,count mov ax,wval mov count,al mov al,wval mov ax,count mov eax,count ; BL count(100) ; AX wval(2), 16-bit ; count AL(2), 8-bit ; error(size mismatch) ; error ; error 잘못된이유는? bval BYTE 100 bval2 BYTE? wval WORD 2 dval DWORD 5 mov ds,45 immediate move to DS not permitted mov esi,wval size mismatch mov eip,dval EIP cannot be the destination mov 25,bVal immediate value cannot be destination mov bval2,bval memory-to-memory move not permitted 컴퓨터정보통신 어셈블리언어 7 컴퓨터정보통신 어셈블리언어 8

여러가지 MOV 방법 메모리에서메모리로의전송 var2 var1 mov eax, var1 mov var2, eax ; AX var1 ; var2 AX 작은 operand 를큰 operand 로복사 레지스터를경유함 작은 operand 를큰크기로확장한후에 mov 명령어수행 unsigned number 는 zero extension( 상위부분을 0 으로채움 ) 사용 signed number 는 sign extension( 상위부분을부호로채움 ) 사용 ( 예 ) 4 비트 8 비트 zero 확장 sign 확장 0101 (5) 0000_0101 (5) 0000_0101 (5) 1011 (11 또는 5) 0000_1011 (11) 1111_10111011 (-5) 컴퓨터정보통신 어셈블리언어 9 MOVZX 명령어 zero 확장 MOVZX reg, r/m 동작 : reg zero-extension(r/m) extension(r/m) reg 는 r/m 보다크기가큼 reg32 r/m8 또는 r/m16 reg16 r/m8 0 0 0 0 0 0 0 0 0 mov bl,10001111b movzx ax,bl 1 0 0 0 1 1 1 1 Source 1 0 0 0 1 1 1 1 Destination ; zero-extension 컴퓨터정보통신 어셈블리언어 10 MOVSX 명령어 sign 확장 MOVSX reg, r/m 동작 : reg sign-extension(r/m) reg 는 r/m 보다크기가큼 1 1 1 1 1 1 1 1 mov bl,10001111b movsx ax,bl 1 0 0 0 1 1 1 1 Source 1 0 0 0 1 1 1 1 Destination ; sign extension 컴퓨터정보통신 어셈블리언어 11 XCHG 명령어 - exchange XCHG dst, src 동작 : dst 와 src 의내용을서로교환함 메모리간의교환을할수없음 var1 WORD 1000h var2 WORD 2000h xchg ax,bx ; exchange 16-bit regs xchg ah,al ; exchange 8-bit regs xchg var1,bx ; exchange mem, reg xchg eax,ebx ; exchange 32-bit regs xchg var1,var2 var2 ; error: two memory operands mov ax,var1 ; 메모리간의내용교환은 xchg ax,var2 ; 임시레지스터를사용해야함 mov var1,axax 컴퓨터정보통신 어셈블리언어 12

직접오프셋 (Direct-Offset) 피연산자 직접오프셋피연산자 (Direct offset operand) data_label + constant 형태로표현되는메모리피연산자 어셈블러가 offset 주소로변환함 ( 직접주소지정방식과같음 ) 용도 : array 원소접근 arrayb BYTE 10h,20h,30h,40h mov al,arrayb+1 ; AL = 20h mov al,[arrayb+1] ; alternative notation word array 다음원소의 offset 은 2 씩증가 doubleword array 다음원소의 offset 은 4 씩증가 arrayw WORD 1000h,2000h,3000h arrayd DWORD 1,2,3,4 mov ax,arrayw+2 ; AX = 2000h mov eax,arrayd+4 ; EAX = 00000002h arrayw[1] arrayd[1] arrayb의주소가 100h라고하면 mov al, arrayb mov al, [100h] (cf) a[0] mov al, arrayb+1 mov al, [101h] (cf) a[1] 잘못된예 : 주소가배열범위를벗어남 mov ax,arrayw-2 arrayw-2 ;?? arrayw[-1] mov eax,arrayd+16 ;?? arrayd[4] 컴퓨터정보통신 어셈블리언어 13 컴퓨터정보통신 어셈블리언어 14 연습 자료의배치를바꾸기 다음자료를다음순서로바꾸시오 : 3, 1, 2 arrayd DWORD 1, 2, 3 Step1: arrayd 와 arrayd+4 의값을교환 2, 1, 3 mov eax,arrayd arrayd xchg eax,arrayd+4 Step 2: arrayd 와 arrayd+8 의값을교환 3, 1, 2 xchg eax,arrayd+8 mov arrayd,eax 4.2 덧셈과뺄셈 덧셈과뺄셈명령어 형식 동작 설명 INC dst dst dst + 1 increment DEC dst dst dst 1 decrement ADD dst, src dst dst + src add SUB dst, src dst dst src subtract NEG dst dst dst negate(2 의보수 ) INC, DEC, NEG 의 operand 는 r/m ADD, SUB 의 operand 는 MOV 의 operand 와같은 rule 을적용 컴퓨터정보통신 어셈블리언어 15 컴퓨터정보통신 어셈블리언어 16

INC 과 DEC 예 ADD 와 SUB 예 myword WORD 1000h mydword DWORD 10000000h inc myword dec myword inc mydword mov ax,00ffh inc ax mov ax,00ffh inc al ; 1001h ; 1000h ; 10000001h ; AX = 0100h ; AX = 0000h var1 DWORD 10000h var2 DWORD 20000h ; ---EAX--- mov eax,var1 ; 00010000h add eax,var2 ; 00030000h add ax,0ffffh ; 0003FFFFh add eax,1 ; 00040000h sub ax,1 ; 0004FFFFh 컴퓨터정보통신 어셈블리언어 17 컴퓨터정보통신 어셈블리언어 18 NEG 예 valb BYTE -1 valw WORD +32767 mov al,valb ; AL = -1 neg al ; AL = +1 neg valw ; valw = -32767 수식계산 수식의계산 (ex) R = X+(Y Z) 과정 : (1) X (2) Y Z (3) ( X) + (Y Z) R DWORD? X DWORD 26 Y DWORD 30 Z DWORD 40 mov eax,x ; EAX = X neg eax ; EAX = -26 (-X) mov ebx,y ; EBX = Y sub ebx,z ; EBX = -10 (Y-Z) add eax,ebx ; EAX = -36 (-X)+(Y-Z) mov R,eax ; -36 컴퓨터정보통신 어셈블리언어 19 컴퓨터정보통신 어셈블리언어 20

연산과 FLAG FLAG 레지스터 산술 / 논리연산의결과에따라서값이정해짐 MOV 명령어의영향을받지않음 기본적인 FLAG bits ZF(Zero Flag) 결과가 0 이면 1 SF(Sign Flag) 결과가음수 (MSB=1) 이면 1 CF(Carry Flag) unsigned value가표현범위벗어나면 1 (unsigned overflow) OF(Overflow Flag) signed value 가표현범위벗어나면 1 (signed overflow) ZF SF Zero Flag(ZF) 와 Sign Flag(SF) mov cx,1 sub cx,1 ; CX = 0, ZF = 1 mov ax,0ffffh inc ax ; AX = 0, ZF = 1 inc ax ; AX = 1, ZF = 0 mov al,0 sub al,1 ; AL = 11111111b(-1), SF = 1 add al,2 ; AL = 00000001b, SF = 0 SF 는 MSB( 부호 bit) 값과같음 컴퓨터정보통신 어셈블리언어 21 컴퓨터정보통신 어셈블리언어 22 부호있는정수와부호없는정수 부호있는정수와부호없는정수 signed integer 와 unsigned integer 모두 2 진수 pattern 으로표현됨 CPU 는 signed 와 unsigned integer 를구별할수없음 signed와 unsigned integer의구분은프로그램에서사용하는 instruction tion 에의해서이루어짐 ( 예 ) 2 진수패턴 11100000b unsigned integer = 224 signed integer = -32 Signed와 Unsigned integer에대한산술연산 덧셈과뺄셈연산 : 구분없이같은명령어를사용함 곱셈과나눗셈연산 : signed와 unsigned integer에대해서구분을하여별개의명령어를사용 Singed 와 Unsigned 연산과 Flag unsigned 연산 : Zero, Carry, 보조 Carry 플래그를사용 signed 연산 : Zero, Sign, Overflow 플래그를사용 컴퓨터정보통신 어셈블리언어 23 Carry Flag (CF) 와 Overflow Flag (OF) CF unsigned overflow, OF signed overflow mov al,0ffh ; 255(unsigned) 또는 -1(signed) add al,1 ; AL = 00, CF = 1, OF = 0 255 0 (CF=1), -1 0 (OF=0) mov al,0 ; 0 sub al,1 ; AL = FF, CF = 1, OF = 0 ; (255 또는 -1) 0 255 (CF=1), 0 1 (OF=0) mov al,7fh ; 127 add al,1 ; AL = 80h, CF = 0, OF = 1, ; (128 또는 -128) 127 128 (CF=0), 127-128 (OF=1) 컴퓨터정보통신 어셈블리언어 24

INC, DEC, NEG 명령어와 CF INC 와 DEC 명령어는 CF 에는영향을주지않음 mov al,0ffh ; 255(unsigned) 또는 -1(signed) add al,1 ; AL = 00, CF = 1, OF = 0 mov al,0ffh inc al ; AL = 00, CF = 0, OF = 0 NEG 명령어는 0 이아닌피연산자에대한연산시항상 CF=1 이됨 4.3 데이터관련연산자와디렉티브 OFFSET 연산자 PTR 연산자 TYPE 연산자 LENGTHOF 연산자 SIZEOF 연산자 LABEL 디렉티브 valb BYTE 0,1 valc SBYTE -128 ; 80h neg valb ; CF = 0, OF = 0 (00h) neg valb+1 ; CF = 1, OF = 0 (FFh) neg valc ; CF = 1, OF = 1 (80h) 컴퓨터정보통신 어셈블리언어 25 컴퓨터정보통신 어셈블리언어 26 OFFSET 연산자 OFFSET label label 의 offset 주소반환 Protected mode: 32 bits Real mode: 16 bits data segment: offset mybyte (cf) protected mode 프로그램은 0 번지부터시작하는단일 segment 를사용한다. (flat memory model) 예제 ; start at 00404000 bval BYTE? wval WORD? dval DWORD? dval2 DWORD? mov esi,offset bval ; ESI = 00404000 mov esi,offset wval ; ESI = 00404001 mov esi,offset dval ; ESI = 00404003 mov esi,offset dval2 ; ESI = 00404007 컴퓨터정보통신 어셈블리언어 27 컴퓨터정보통신 어셈블리언어 28

C/C++ 와의관계 OFFSET 연산자는변수의주소 (pointer) 를얻을때사용함 ; C++ version: char array[1000], *p; int a, *q; p = array; q = &a; ; assembly language array BYTE 1000 DUP(?) a BYTE? mov esi,offset array mov edi,offset a ; ESI is p ; EDI is q 컴퓨터정보통신 어셈블리언어 29 PTR 연산자 type PTR label label 이가리키는 operand 의크기를 type 크기로재설정 ; little endian mydouble DWORD 12345678h ; 78 56 34 12 순서로저장 mov ax, mydouble ; error - size mismatch mov ax, WORD PTR mydouble ; loads 5678h mov WORD PTR mydouble,4321h ; saves 4321h mov bl, BYTE PTR mydouble ; loads 78h mov bl, BYTE PTR [mydouble+1] ; loads 56h mybytes BYTE 12h,34h,56h,78h mov ax, WORD PTR mybytes mov eax, DWORD PTR mybytes y ; AX = 3412h ; EAX = 78563412h 컴퓨터정보통신 어셈블리언어 30 TYPE 연산자 TYPE label label 이가리키는 data 의크기를반환 ( 단위 byte) var1 BYTE? var2 WORD? var3 DWORD? var4 QWORD? mov eax,type var1 ; 1 mov eax,type var2 ; 2 mov eax,type var3 ; 4 mov eax,type var4 ; 8 (cf) C 언어 :sizeof(a) LENGTHOF 연산자 LENGTHOF label label 과같은줄에선언된원소의개수를반환 comma 로구분된경우에는다음줄도포함 ( 예 : mword) LENGTHOF byte1 BYTE 10,20,30 ; 3 array1 WORD 30 DUP(?),0,0 ; 32 array2 WORD 5 DUP(3 DUP(?)) ; 15 array3 DWORD 1,2,3,4 ; 4 digitstr BYTE "12345678",0 ; 9 mword WORD 10,20,30, ; 6 40,50,60 mword2 WORD 10,20,30 ; 3 WORD 40,50,60 mov ecx,lengthof array1 ; 32 컴퓨터정보통신 어셈블리언어 31 컴퓨터정보통신 어셈블리언어 32

SIZEOF 연산자 SIZEOF label LENGTHOF 와 TYPE 의곱을반환 원소들이차지하는크기 ( 단위 byte) SIZEOF byte1 BYTE 10,20,30 ; 3 array1 WORD 30 DUP(?),0,0 ; 64=32*2 array2 WORD 5 DUP(3 DUP(?)) ; 30=15*2 array3 DWORD 1,2,3,4 ; 16=4*4 digitstr BYTE "12345678",0 ; 9 mov ecx,sizeof array1 ; 64 (cf) C 언어 : sizeof(array) LABEL 디렉티브 label LABEL type 기존 label 의위치에다른 type 의 label 이름을부여함 PTR operator 를사용할필요가없도록함 기억장소의추가적인할당은없음 dwlist LABEL DWORD wordlist LABEL WORD intlist BYTE 00h,10h,00h,20h mov eax,dwlist ; 20001000h mov cx,wordlist ; 1000h mov dl,intlist ; 00h dwlist, wordlist, intlist 는모두같은주소의 label 이지만참조하는자료형의크기가다름 컴퓨터정보통신 어셈블리언어 33 컴퓨터정보통신 어셈블리언어 34 ALIGN 디렉티브 ALIGN bound bound: 1, 2, 4, 또는 16 변수를 bound 크기의배수위치에배치 ; start at 00404000 bval BYTE? ; 00404000 ALIGN 2 wval WORD? ; 00404002 wval2 WORD? ; 00404004 ALIGN 4 dval DWORD? ; 00404008 dval2 DWORD? ; 0040400C ALIGN 을사용하는이유 16비트데이터와 32비트데이터는각각 2의배수와 4의배수의주소에배치되어야데이터를빠르게접근할수있음 real mode 세그먼트는 16 의배수주소에서시작함 컴퓨터정보통신 어셈블리언어 35 4.4 간접주소지정 간접주소지정 명령어에 operand 의주소를직접포함하는것대신에 operand의주소를저장한위치를포함 register indirect addressing memory indirect addressing IA32 에서지원하지않음 C/C++ 의 pointer와관련됨 mov eax,,[100] ; direct addressing mov esi, 100 mov eax, [si] instruction 100 ESI ; indirect addressing direct indirect memory 100 ESI 100 컴퓨터정보통신어셈블리언어 36

간접피연산자 피연산자의유효주소 (EA: effective address) = reg 간접피연산자 operand 주소를갖고있는 register 사용하기전에유효한주소로초기화해야함 간접피연산자로사용하는레지스터 32-bit mode: 범용레지스터 (EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP) 16-bit mode: SI, DI, BX, BP (cf) DS:SI/DI/DX, SS:BP val1 BYTE 10h,20h,30h mov esi,offset val1 mov al,[esi] inc esi mov al,[esi] inc esi mov al,[esi] ; AL = M[DS:SI] (10h) ; AL = 20h ; AL = 30h 컴퓨터정보통신 어셈블리언어 37 간접피연산자와 PTR 연산자 operand 의크기지정 간접피연산자가지시하는피연산자크기가명확하지않을수있음 피연산자의크기를명확하게하기위해서 PTR operator를사용 mycount WORD 0 mov esi,offset mycount inc [esi] inc WORD PTR [esi] add ax, [esi] add [esi], 20 add BYTE PTR [esi], 20 ; error: ambiguous size ; ok ; ok ; error: ambiguous size ; ok 컴퓨터정보통신 어셈블리언어 38 간접피연산자와배열 배열원소를다루는데에 indirect operand가유용함 특히순차적으로다루는데편리함 예 : 배열의합 arrayw WORD 1000h,2000h,3000h mov esi,offset arrayw mov ax,[esi] add esi,2 ; 2대신에 TYPE arrayw 사용가능 add ax,[esi] add esi,2 add ax,[esi] ; AX = sum of the array 다음원소를사용할때에주소를원소의크기만큼증가시킴 인덱스피연산자 피연산자유효주소 (EA)= reg + const 형식 :[reg+const] 또는 const[reg] [const + reg] arrayw WORD 1000h,2000h,3000h mov esi,0 mov ax,[arrayw + esi] mov ax,arrayw[esi] add esi,2 add ax,[arrayw + esi] 인덱스피연산자로사용하는 register ; AX = 1000h ; alternate format 32-bit mode: general purpose registers (cf) SS:EBP 16-bit mode: SI, DI, BX, BP (cf) SS:BP 컴퓨터정보통신 어셈블리언어 39 컴퓨터정보통신 어셈블리언어 40

인덱스배율 (Index Scaling) 피연산자유효주소 (EA) = const + reg*scale 형식 : const[reg*scale] scale] ; scale: 1, 2, 4 scale은 TYPE operator를사용하여얻을수도있음 워드, 더블워드배열을다루는데유용함 arrayb BYTE 0,1,2,3,4,5 arrayw WORD 0,1,2,3,4,5 arrayd DWORD 0,1,2,3,4,5 mov esi,4 mov al,arrayb[esi*type arrayb] ; 04 mov bx,arrayw[esi*type arrayw] ; 0004 mov edx,arrayd[esi*type arrayd] ; 00000004 컴퓨터정보통신 어셈블리언어 41 포인터 (Pointer) 포인터변수 다른변수의주소를가지고있는변수 arrayw WORD 1000h,2000h,3000h ptrw DWORD arrayw ; pointer variable ptrw2 DWORD OFFSET arrayw ; 위와같은값 mov esi,ptrw mov ax,[esi] ; AX = 1000h mov ptrw, OFFSET arrayw ; OK mov ptrw, arrayw ; Error (data) 변수선언에서초기값으로사용되는변수이름은변수의주소를나타냄 (OFFSET varname과같음 ) 명령어에서사용되는변수이름은변수의값을나타냄 컴퓨터정보통신 어셈블리언어 42 NEAR and FAR pointers Pointer 유형 의미 NEAR pointer 같은세그먼트내의주소 FAR pointer 다른세그먼트에속한주소 표현 offset segment:offset 16-bit mode 16-bit 32-bit (16 + 16) 32-bit mode 32-bit 48-bit (16 + 32) flat model 을사용하는 protected mode 프로그램은 near pointer 만사용함. 컴퓨터정보통신 어셈블리언어 43 TYPEDEF 연산자 TYPEDEF 연산자 사용자정의자료형을만든다. 포인터자료형을명확히나타내는데유용함. PBYTE TYPEDEF PTR BYTE ; BYTE에대한포인터자료형정의 PWORD TYPEDEF PTR WORD PDWORD TYPEDEF PTR DWORD arrayw WORD 1,2,3 arrayd DWORD 4,5,6 ptr1 PWORD arrayw ptr2 PDWORD arrayd mov esi, ptr1 mov ax,[esi] mov esi, ptr2 mov eax, [esi] 컴퓨터정보통신 어셈블리언어 44

4.5 JMP 와 LOOP 명령어 무조건이동 (ex) JMP 조건부이동 (ex) LOOP, Jcc 조건은플래그레지스터와 ECX 의내용에의하여정해짐 JMP 명령어 JMP label 예 동작 :label 위치의명령어로 jump 함 (EIP label 주소 ) top: jmp top ; code label 컴퓨터정보통신 어셈블리언어 45 컴퓨터정보통신 어셈블리언어 46 LOOP 명령어 LOOP label 동작: 특정한횟수를반복수행함 (ECX: 루프카운터, 반복횟수계수 ) ECX ECX 1 if (ECX!= 0) jump to label assembler 는 label 을 relative offset 으로바꾸어서기계어로변환 real mode에서는 CX가루프카운터로사용됨 LOOPD 와 LOOPW 명령어 LOOPD는 ECX를루프카운터로사용 LOOPW는 CX를루프카운터로사용 relative offset = label 주소 다음명령어주소 LOOP 예 합 5+4+3+2+1 을계산 offset machine code source code 00000000 66 B8 0000 mov ax,0 00000004 B9 00000005 mov ecx,5 00000009 66 03 C1 L1: add ax,cx 0000000C E2 FB loop L1 0000000E relative offset = 9 E(14) = 5 (FBh) label loop relative offset relative offset 의범위 : -128 +127 (8-bit signed 정수 ) relative offset 이지정된범위를벗어나면어셈블할때에오류발생 컴퓨터정보통신 어셈블리언어 47 컴퓨터정보통신 어셈블리언어 48

연습 AX 의결과? mov ax,6 mov ecx,4 L1: inc ax loop L1 반복횟수? mov ecx,0 X2: inc ax loop X2 10 2 32 = 4,294,967,296 중첩된 Loop 사용법 바깥 loop 의 loop count 값 ECX 를저장하고 ECX 를안쪽 loop 의 loop count값으로초기화해야함. count DWORD? mov ecx,100 L1: mov count,ecx mov ecx,20 L2:.. loop L2 mov ecx,count count loop L1 ; set outer loop count ; save outer loop count ; set inner loop count ; repeat the inner loop ; restore outer loop count ; repeat the outer loop 컴퓨터정보통신 어셈블리언어 49 컴퓨터정보통신 어셈블리언어 50 정수배열의합 16 비트정수배열의합 intarray WORD 100h,200h,300h,400h mov edi,offset intarray ; address of intarray mov ecx,lengthof intarray ; loop counter(4) mov ax,0 ; zero the accumulator L1: add ax,[edi] ; add an integer add edi,type intarray ; point to next integer(+2) loop L1 ; repeat until ECX = 0 연습 doubleword array 의합계산 문자열복사 source 문자열을 target 으로복사 source BYTE "This is the source string",0 target BYTE SIZEOF source DUP(0) good use of SIZEOF mov esi,0 ; index register mov ecx,sizeof source ; loop counter L1: mov al,source[esi] ; get char from source mov target[esi],al ; store it in the target inc esi ; move to next character loop L1 ; repeat for entire string 연습 indexed addressing 대신에 indirect addressing 을사용하여수정 컴퓨터정보통신 어셈블리언어 51 컴퓨터정보통신 어셈블리언어 52