#9 x86구조 (주소지정방식)
주소지정방식(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]