임베디드 혹은 펌웨어 프로그래밍을 할 때 연산항(operend)으로서 어느 데이터 또는 어디에 있는 데이터를 지정하느냐는 매우 중요한 사항인데 이와 같은 데이터 지정 방식을 어드레싱(addressing)이라고 한다.
일반적으로 명령어의 연산항은 데이터 주소를 저장된다. 또는 연산 처리 되길 원하는 상수의 값을 담기도 한다.
데이터 지정 방식에는 크게 3분류로 나눌 수 있다.
아래 예시의 MOV AX, [0020] 진행 과정을 살펴보자.
20비트의 데이터 주소를 만들기 위해 DS ( Data Segment Register ) 에 저장된 1010에 좌측으로 4비트 shift ( x16 ) 하여 10100을 만들고 논리 주소 0020과 덧셈 연산을 진행해서 최종적으로 실제 물리 주소를 구한다. 그리고 실제 물리 주소 10120에 담겨있는 B437을 AX에 저장한다.
( B437이 추출되는 과정은 상위 주소인 10121의 B4를 먼저 쓰고 하위 주소인 10120의 37을 뒤에 붙여 B437을 만든다.
8086은 짝수, 홀수주소의 16비트 데이터 값을 동시에 읽을 수 있기 때문이다. )
LEA BX, DATA1은 DATA1의 주소값 0018을 BX에 저장하고 BX는 주소값 0018을 의미하게 된다.
0018에는 데이터 1010이 담겨있고 MOV AX, [BX]는 BX의 주소값을 참조하여 데이터를 추출해서 AX에 담으라는 뜻이므로 AX에는 최종적으로 1010이 담긴다.
MOV DI,2 에서 2를 DI에 저장한다.
MOV AL, [DATA + DI]에서 DATA의 값 0020과 0002를 더하여 [0022]가 나오고 0022의 데이터값 34가 최종적으로 AL에 저장된다.
여기서 주목할 점은 최종적으로 구해진 001C, 001D의 값을 합칠 때 상위 주소인 001D의 값 00을 먼저 붙여 0014를 만든다는 것이다.
8086에서 어셈블리 명령어는 대게 2byte를 기본으로 표현한다고 했고 상황에 따라 최대 6byte까지 표현 가능하다.
구성 요소로는 명령 코드, 레지스터 종류, 주소지정방식 등이 있다.