* Operand
ⓐ offset operator
- OFFSET variable
- segment 시작부터 변수까지의 거리
(data segment 시작주소로부터 떨어진거리)
※ 주소는 4Byte이기 때문에 4Byte register(reg32)에 넣어준다.
ⓑ ALIGN directive
- byte, word, dword, 단락의 경계를 정렬
- ALIGN bound
- bound의 값은 1,2 or 4가 될 수 있다.
- CPU가 홀수보다 짝수 저장소에 접근을 더빨리 하기 때문에 사용한다.
ex) bval BYTE ? ; offset 00401000
ALIGN 2 ; 2byte씩 데이터 간격을 늘린다.
wVal word ? ; offset 00401002 (Align이 default였으면 byte의 데이터 크기인 1의 offset이 증가
; but, 004101001이 아닌 00401002부터 시작되는 것을 볼 수 있다.
bVal2 BYTE ? ; offset 00401004
ALIGN 4 ; bVal2에게 4byte의 공간을 차지하는 것처럼 보이게 한다.
dVal dword ? ; 00401008
ⓒ PTR operator
- 변수의 default size를 override 해준다.
ex)
.data
wordList word abcdh, 1234h
dval dword 1232abcdh
.code
; mov ax, dval size error
mov ax, word ptr dval ; ax = abcdh / dval의 뒷부분 word 크기만큼 가져온다.
; 이러한 결과는 little indian방식의 저장법을 쓰기 때문이다.
mov ax, word ptr [dval+2] ; ax =1232h
mov eax, dword ptr wordList ; eax = 1232abcdh
; 이 또한 little indian방식에 의한 결과 값
ⓓ TYPE operator
- 각 변수의 크기를 BYTE단위로 return한다.
ⓔ LengthOf operator
- 배열 요소 개수를 return 해준다.
ex) str1 byte "123" , 0
lengthof str1 ; return 4, str1을 byte단위로 끈어서 return
ⓕ SizeOf operator
- 배열 초기 설정자에 의한 바이트 수를 return 한다.
- lengthOf * type
ⓖ label directive
- 용량을 잡고 있지 않음
- 이후에 오는 것을 Size만큼 덮는다.
ex)
LongVal LABEL DWORD
val1 word 1234h
val2 word abcdh
* Indirect addressing
- 주소 연산에 register가 포함 되 있다.
ⓐ Indirect operand
- [reg32]를 사용해 offset 값으로 접근
- 어떤 데이터의 offset값을 포함하고 있다.
ⓑ array
- 배열의 시작 offset 값을 [reg32]에 넣은 후 이를 이용해 값을 가져온다.
ex)
.data
array BYTE 10h,20h
.code
mov esi, OFFSET array
mov al, [esi] ; al = 10h
inc esi ; 주소값 증가
mov al, [esi] ; al = 20h
※ inc [esi] error!! > 이 주소가 가르키는 값의 size를 모르게 때문에 불가능하다.
> 이 경우에는 inc BYTE PTR [esi] ; 정확한 size 값을 알려줘야 한다.
ⓒ Indexed Operand
- 유효주소를 만들기 위해 상수를 레지스터에 더한다.
- constant [reg]
[constant + reg] ; constant = 주소 or 숫자
ex)
.data
array BYTE 10h,20h
.code
mov esi, OFFSET array
mov al, [esi] ; al = 10h
mov al, [esi+1] ; al = 20h
ⓓ Pointer
- 다른 변수의 주소값을 가지고 있다.
1) NEAR 포인터 : 데이터 세그먼트의 시작부터 16(16모드)/32(32모드)bit offset값을 가지고 있음
2) Far 포인터 : 32bit 세그먼트 offset 주소(16모드)/48bit segment offset address(32모드)를 가지고 있음
* JMP & LOOP
ⓐ JMP
- JMP targetLabel
- target Label의 offset값이 IP(instruction pointer)로 이동되어 언제든지 사용가능
ⓑ Loop
- Loop destination
- ECX가 counter로 작용되어 ECX가 0이 될때까지 해당 Label로 점프를 실시한다.
(Jump시 ECX는 1씩 감소한다.)
- 일반적 error
> 시작하기 전에 ecx를 0으로 초기화
> Jump label이 너무 멀어도 error
ex)
.code
mov ax, 0
mov ecx , 5
Li: ; label
inc ax
loop Li ; jump 5
; result ax is 5