Computer Security

#9 x86구조 (주소지정방식) 본문

컴퓨터구조&어셈블리어

#9 x86구조 (주소지정방식)

쿠리 Kuri 2022. 5. 21. 18:30

주소지정방식(addressing mode)

-주소지정방식은 명령어의 피연산자를 지정하기 위한 방법들을 의미한다. 피연산자(Operand)는 크게 레지스터, 즉시 값, 메모리가 될 수있다.

-8086은 레지스터, 즉시 값에 접근하는 방식과 메모리에 접근하는 6가지 방식까지 총 8개 주소지정방식을 제공한다.

 

 

레지스터 주소지정

-레지스터 피연산자를 지정하는 방식이다. AH, AL, AX, BX와 같이 8비트와 16비트 레지스터에 접근할 수 있는 이름을 제공한다.

 

MOV DX, WORD_MEM     ; 첫 번째 피연산자에 레지스터

MOV WORD_MEM, CX     ; 두 번째 피연산자에 레지스터

MOV DX, BX      ;  두 개 피연산자에 레지스터 

 

즉시 주소지정

-명령어에 피연산자(상수 값이나 식)을 포함하는 방식

 

ex)

SUB BYTE_VAL , 50  ; 즉시 값을 메모리에  대입해서 SUB(뺄샘) 빼준다.

MOV AX, 0245H  ; 즉시 값을 레지스터에 대입해서 더해준다.

 

H: 0x 랑 같은 의미

 

 

직접 메모리 주소지정

-피연산자의 메모리 주소(오프셋)를 직접 참조

-메모리 데이터를 주소지정하기 위해 기본적으로 데이터 세그먼트 레지스터인 DS와 연관된다.

 

ex)

ADD BYTE_VAL, DL ; 레지스터를 메모리에 더한다.

MOV BX, WORD_VAL ; 메모리 데이터를 레지스터에 적재한다.

 

직접-오프셋 메모리 주소지정

-직접 메모리 주소지정방식의 변형이다.

-직접 주소로부터 떨어진 오프셋을 명시한다.

-산술 연산자를 사용하여 주소를 변경한다.

 

ex)

;변수 정의

BYTE_TBL DB 12, 15, 16, 22, ...   ; 바이트 배열

WORD_TBL DW 163, 227, 485 , .... ;  워드 배열

 

; 코드

     MOV CL, BYTE_TBL[2]

     MOV CL, BYTE_TBL+2   이 두개는 동일한 연산이다.

 

 

간접 메모리 주소지정

-베이스 레지스터 BX와 BP, 인덱스 레지스터 DI, SI에 저장된 피연산자의 주소 값을 간접 참조한다.

-대괄호 기호는 메모리 참조를 나타낸다.

 

ex)

; 변수 정의

DATA_VAL DB 50

 

; 코드

    LEA BX, DATA_VAL   ; DATA_VAL의 오프셋 주소를 BX에 적재

    MOV [BX], CL ; CL의 값을 DATA_VAL에 저장

 

 

베이스 변위 주소지정

-베이스 레지스터BX, BP와 인덱스 레지스터 DI, SI를 사용하나, 유효주소(effective address)를 생성하기 위해서 변위(오프셋 주소와 구분하기 위해 변위(displacement)라는 값과 결합된다.

-즉, 피연산자의 베이스 주소를 담고 있는 레지스터 값에 변위를 더하는 방식이다.

 

ex)

; 변수 정의

DATA_TBL  DB 365 DUP(?)   ; 초기화되지 않은 365  바이트 배열 정의

 

; 코드

      LEA BX, DATA_TBL

      MOV BYTE PTR   [BX+2], 0    //BX 로부터 2칸뒤로 떨어져있는 메모리상의 위치에 0이라는값 저장

 

     ADD CL, [DI+12]   ;   12[DI]라고도 가능

     SUB DATA_TBL[SI], 25

     MOV DATA_TBL[DI], DL

 

 

베이스-인덱스 주소지정

-유효 주소를 생성하기 위해 베이스 레지스터(BX, BP)와 인덱스 레지스터(DI,SI)를 결합한다.

-2차원 배열을 주소지정 하는 데 일반적으로 사용된다.

 

ex)    MOV AX, [BX+SI]

        ADD [BX+DI], CL

 

 

변위를 갖는 베이스-인덱스 주소지정

-베이스-인덱스 주소지정방식의 변형이다.

-유효 주소를 생성하기 위해 베이스 레지스터, 인덱스 레지스터, 변위를 결합한다.

 

ex)   MOV  AX, [BX+DI+10]     ;  또는 10[BX+DI]

      MOV CL, DATA_TBL[BX+DI]     ;  또는 [BX+DI+DATA_TBL]

Comments