프로그래밍[Univ]/하드웨어

[IA-32] Operator & Directive

Cloud Travel 2012. 5. 27. 11:01

* 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