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