4 장데이터전송, 주소지정, 산술연산 연세대학교컴퓨터정보통신
이장의내용 데이터전송명령어 덧셈과뺄셈 데이터관련연산자와디렉티브 간접주소지정 JMP와 LOOP 명령어 연세대학교컴퓨터정보통신어셈블리언어 2
4.1 데이터전송명령어 피연산자 (operand) 의유형 예 즉시값 (Immediate) 상수정수 ( 식 ) (8, 16, 32 bits) 값이 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
Instruction Operand 표기 (Intel) 연세대학교컴퓨터정보통신어셈블리언어 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 연세대학교컴퓨터정보통신어셈블리언어 7
잘못된예 잘못된이유는? bval BYTE 100 bval2 BYTE? wval WORD 2 dval DWORD 5 mov ds,45 mov esi,wval mov eip,dval mov 25,bVal mov bval2,bval immediate move to DS not permitted size mismatch EIP cannot be the destination immediate value cannot be destination memory-to-memory move not permitted 연세대학교컴퓨터정보통신어셈블리언어 8
여러가지 MOV 방법 메모리에서메모리로의전송 var2 var1 mov eax, var1 ; AX var1 mov var2, eax ; var2 AX 레지스터를경유함 작은 operand를큰operand로복사 작은 operand를큰크기로확장한후에mov 명령어수행 unsigned number는 zero extension( 상위부분을 0으로채움 ) 사용 signed number는 sign extension( 상위부분을부호로채움 ) 사용 ( 예 ) 4 비트 zero 확장 8 비트 sign 확장 0101 (5) 0000_0101 (5) 0000_0101 (5) 1011 (11 또는 5) 0000_1011 (11) 1111_1011 (-5) 연세대학교컴퓨터정보통신어셈블리언어 9
MOVZX 명령어 zero 확장 MOVZX reg, r/m 동작 : reg zero-extension(r/m) reg는 r/m보다크기가큼 reg32 r/m8 또는 r/m16 reg16 r/m8 0 1 0 0 0 1 1 1 1 Source 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 Destination mov bl,10001111b movzx ax,bl ; zero-extension 연세대학교컴퓨터정보통신어셈블리언어 10
MOVSX 명령어 sign 확장 MOVSX reg, r/m 동작 : reg sign-extension(r/m) reg 는 r/m 보다크기가큼 1 0 0 0 1 1 1 1 Source 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 Destination mov bl,10001111b movsx ax,bl ; sign extension 연세대학교컴퓨터정보통신어셈블리언어 11
XCHG 명령어 - exchange XCHG dst, src 동작 : dst 와 src 의내용을서로교환함 메모리간의교환을할수없음 var1 WORD 1000h var2 WORD 2000h xchg ax,bx xchg ah,al xchg var1,bx xchg eax,ebx ; exchange 16-bit regs ; exchange 8-bit regs ; exchange mem, reg ; exchange 32-bit regs xchg var1,var2 mov ax,var1 xchg ax,var2 mov var1,ax ; error: two memory operands ; 메모리간의내용교환은 ; 임시레지스터를사용해야함 연세대학교컴퓨터정보통신어셈블리언어 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 arrayb의주소가 100h라고하면 mov al, arrayb mov al, [100h] (cf) a[0] mov al, arrayb+1 mov al, [101h] (cf) a[1] 연세대학교컴퓨터정보통신어셈블리언어 13
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 잘못된예 : 주소가배열범위를벗어남 mov ax,arrayw-2 ;?? mov eax,arrayd+16 ;?? arrayw[1] arrayd[1] arrayw[-1] arrayd[4] 연세대학교컴퓨터정보통신어셈블리언어 14
연습 자료의배치를바꾸기 다음자료를다음순서로바꾸시오 : 3, 1, 2 arrayd DWORD 1, 2, 3 Step1: arrayd 와 arrayd+4 의값을교환 2, 1, 3 mov eax,arrayd xchg eax,arrayd+4 Step 2: arrayd 와 arrayd+8 의값을교환 3, 1, 2 xchg eax,arrayd+8 mov arrayd,eax 연세대학교컴퓨터정보통신어셈블리언어 15
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 을적용 연세대학교컴퓨터정보통신어셈블리언어 16
INC 과 DEC 예 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 연세대학교컴퓨터정보통신어셈블리언어 17
ADD 와 SUB 예 var1 DWORD 10000h var2 DWORD 20000h mov eax,var1 add eax,var2 add ax,0ffffh add eax,1 sub ax,1 ; ---EAX--- ; 00010000h ; 00030000h ; 0003FFFFh ; 00040000h ; 0004FFFFh 연세대학교컴퓨터정보통신어셈블리언어 18
NEG 예 valb BYTE -1 valw WORD +32767 mov al,valb ; AL = -1 neg al ; AL = +1 neg valw ; valw = -32767 연세대학교컴퓨터정보통신어셈블리언어 19
수식계산 수식의계산 (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 연세대학교컴퓨터정보통신어셈블리언어 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) 연세대학교컴퓨터정보통신어셈블리언어 21
Zero Flag(ZF) 와 Sign Flag(SF) ZF 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 SF mov al,0 sub al,1 ; AL = 11111111b(-1), SF = 1 add al,2 ; AL = 00000001b, SF = 0 SF 는 MSB( 부호 bit) 값과같음 연세대학교컴퓨터정보통신어셈블리언어 22
부호있는정수와부호없는정수 부호있는정수와부호없는정수 signed integer 와 unsigned integer 모두 2 진수 pattern 으로표현됨 CPU 는 signed 와 unsigned integer 를구별할수없음 signed 와 unsigned integer 의구분은프로그램에서사용하는 instruction 에의해서이루어짐 ( 예 ) 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 이됨 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
4.3 데이터관련연산자와디렉티브 OFFSET 연산자 PTR 연산자 TYPE 연산자 LENGTHOF 연산자 SIZEOF 연산자 LABEL 디렉티브 연세대학교컴퓨터정보통신어셈블리언어 26
OFFSET 연산자 OFFSET label label의 offset 주소반환 Protected mode: 32 bits Real mode: 16 bits offset data segment: mybyte (cf) protected mode 프로그램은 0 번지부터시작하는단일 segment 를사용한다. (flat memory model) 연세대학교컴퓨터정보통신어셈블리언어 27
예제 ; 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 연세대학교컴퓨터정보통신어셈블리언어 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 ; 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) 연세대학교컴퓨터정보통신어셈블리언어 31
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 연세대학교컴퓨터정보통신어셈블리언어 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) 연세대학교컴퓨터정보통신어셈블리언어 33
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 이지만참조하는자료형의크기가다름 연세대학교컴퓨터정보통신어셈블리언어 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] ; indirect addressing instruction direct 100 memory 100 ESI indirect ESI 연세대학교컴퓨터정보통신어셈블리언어 36 100
간접피연산자 피연산자의유효주소 (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] ; AL = M[DS:SI] (10h) inc esi mov al,[esi] ; AL = 20h inc esi mov al,[esi] ; 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 다음원소를사용할때에주소를원소의크기만큼증가시킴 연세대학교컴퓨터정보통신어셈블리언어 39
인덱스피연산자 피연산자유효주소 (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] ; AX = 1000h ; alternate format 인덱스피연산자로사용하는 register 32-bit mode: general purpose registers (cf) SS:EBP 16-bit mode: SI, DI, BX, BP (cf) SS:BP 연세대학교컴퓨터정보통신어셈블리언어 40
인덱스배율 (Index Scaling) 피연산자유효주소 (EA) = const + reg*scale 형식 : const[reg*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 mov ptrw, arrayw ; OK ; 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 의내용에의하여정해짐 연세대학교컴퓨터정보통신어셈블리언어 45
JMP 명령어 JMP label 동작 : label 위치의명령어로 jump 함 (EIP label 주소 ) 예 top: jmp top ; code label 연세대학교컴퓨터정보통신어셈블리언어 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주소 다음명령어주소 label relative offset loop 연세대학교컴퓨터정보통신어셈블리언어 47
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) relative offset 의범위 : -128 +127 (8-bit signed 정수 ) relative offset 이지정된범위를벗어나면어셈블할때에오류발생 연세대학교컴퓨터정보통신어셈블리언어 48
연습 AX 의결과? mov ax,6 mov ecx,4 L1: inc ax loop L1 10 반복횟수? mov ecx,0 X2: inc ax loop X2 2 32 = 4,294,967,296 연세대학교컴퓨터정보통신어셈블리언어 49
중첩된 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 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 연세대학교컴퓨터정보통신어셈블리언어 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의합계산 연세대학교컴퓨터정보통신어셈블리언어 51
문자열복사 source 문자열을 target 으로복사 source BYTE "This is the source string",0 target BYTE SIZEOF source DUP(0) good use of SIZEOF mov esi,0 mov ecx,sizeof source L1: mov al,source[esi] mov target[esi],al inc esi loop L1 ; index register ; loop counter ; get char from source ; store it in the target ; move to next character ; repeat for entire string 연습 indexed addressing 대신에 indirect addressing 을사용하여수정 연세대학교컴퓨터정보통신어셈블리언어 52