Array-1

Array(배열)
배열은 메모리 상의 연속된 데이터들의 목록을 말한다.
개개의 원소들은 같은 형이며, 메모리 상에서 같은 크기의 바이트를 사용하여야 한다.
그렇기 때문에 배열에서는 index를 통해 원소에 효율적으로 접근할 수 있다.
    define array
data & bss에서 정의하기
data세그먼트에서는 db, dw등의 지시어를 사용하여 정의한다.
NASM에서는 TIMES라는 지시어를 제공한다.
bss세그먼트에서는 resb, resw등의 지시어를 사용하여 정의한다.
segment .data
;1,2,...,10 까지 10개의 더블워드들로 구성된 배열을 정의
a1 dd 1,2,3,4,5,6,7,8,9,10
;10개의 0으로 워드들로 구성된 배열 정의
a2 dw 0,0,0,0,0,0,0,0,0,0
;TIMES를 이용하여 위와 같은 작업
a3 times 10 dw 0
;200개의 0과 100개의 1로 구성된 바이트 배열 정의
a4 times 200 db 0
times 100 db 1
segment .bss
;10개의 원소를 가지는 초기화 안된 배열 정의
a5 resd 10
;100개의 원소를 가지는 초기화 안된 배열 정의
a6 resw 100
배열을 스택에서 정의하기
직접적으로 ESP에 필요한 메모리 바이트 수를 계산하여 빼거나 ENTER 명령을 이용한다.
단 ESP에서 빼지는 더블워드값은 반드시 4의 배수여야 한다.(ESP는 항상 더블워드 경계에 놓여야 한다.)
    배열의 원소에 접근하기
어셈블리에서는 C에서의 [] 연산자가 없다.
따라서 어셈블리에서는 원소의 주소가 계산되어야 한다.
array1 db 5,4,3,2,1 ;바이트 배열
array2 dw 5,4,3,2,1 ;워드 배열
위의 배열에 접근하는 예
mov al,[array1] ;al=array1[0]
mov al,[array1+1] ;al=array1[1]
mov [array+3],al ;array1[3]=al
mov ax,[array2] ;ax=array2[0]
mov ax,[array2+2] ;ax=array2[1] (array2[2]가 아니다!)
mov [array2+6],ax ;array2[3]=ax
mov ax,[array2+1] ;array2[0]의 1바이트와 array2[1]의 1바이트
array1의 합을 구하는 코드
ver1
mov ebx,array1 ;ebx=array1의 주소
mov dx,0 ;dx에 합이 저장된다.
mov ah,0
mov ecx,5
lp:
mov al,[ebx] ;al=*ebx
add dx,ax ;dx+=ax
inc ebx ;bx++
loop lp
ver2
mov ebx,array1
mov dx,0
mov ecx,5
lp:
add dl,[ebx] ;dl+=*ebx
jnc next ;캐리가 없다면 next로 분기
inc dh ;dh 1 증가
next:
inc ebx
loop lp
ver3
mov ebx,array1
mov dx,0
mov ecx,5
lp:
add dl,[ebx] ;dl+=*ebx
adc dh,0 ;dh+=캐리플래그+0
inc ebx
loop lp
간접 주소 지정
[ base reg + factor*index reg + constat ]
위와 같은 형태로 배열에선 간접 주소 지정도 종종 이용된다.

base reg(베이스 레지스터)는 EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI 중 하나이다.
factor(인수)는 1,2,4,8 중 하나이다.(1이면 생략)
index reg(인덱스 레지스터)는 EAX,EBX,ECX,EDX,EBP,ESI,EDI중 하나이다.(ESP는 안됨)
constant(상수)는 32비트 상수이다. 라벨 혹은 라벨 식(label expression)이 사용될 수 있다.
lea ebx, [4*eax+eax] //올바른 간접 주소 지정 형태이여야 한다. 4대신 6사용 X