일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Leviathan
- wargame
- radare2
- 시스템 프로그래밍
- 리눅스
- kernel
- 커널
- css
- 리눅스커널
- pwncollege
- 리버싱
- 알고리즘
- Bandit
- 드론
- pwn.college
- px4
- 워게임
- 시그널
- C++
- 어셈블리어
- 시스템해킹
- 시스템프로그래밍
- Pwnable.kr
- 취약점
- 프로그래밍
- C언어
- 컴퓨터구조
- write up
- 리눅스 커널
- 시스템
- Today
- Total
Computer Security
#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]
'컴퓨터구조&어셈블리어' 카테고리의 다른 글
#11 컴퓨터의 데이터 표현 (0) | 2022.05.25 |
---|---|
#10 x86 구조 (어셈블리 프로그램의 구성) (0) | 2022.05.22 |
#8 x86 구조 (레지스터 구조) (0) | 2022.05.20 |
#7 x86의 구조 (역사) (0) | 2022.05.19 |
#6 컴퓨터구조와 명령어 (0) | 2022.05.16 |