이장의내용 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