어셈블리-주소 지정 모드

대부분의 어셈블리 언어 명령어에는 피연산자가 처리되어야합니다. 피연산자 주소는 처리 할 데이터가 저장되는 위치를 제공합니다. 일부 명령어에는 피연산자가 필요하지 않은 반면 다른 명령어에는 피연산자가 1 개, 2 개 또는 3 개 필요할 수 있습니다.

명령어에 두 개의 피연산자가 필요한 경우 첫 번째 피연산자는 일반적으로 레지스터 또는 메모리 위치의 데이터를 포함하는 대상이고 두 번째 피연산자는 소스입니다. 소스에는 전달할 데이터 (즉시 주소 지정) 또는 데이터 주소 (레지스터 또는 메모리)가 포함됩니다. 일반적으로 소스 데이터는 작업 후에도 변경되지 않습니다.

주소 지정의 세 가지 기본 모드는 다음과 같습니다.

  • 주소 등록
  • 즉각적인 주소 지정
  • 메모리 주소 지정

주소 등록

이 주소 지정 모드에서 레지스터에는 피연산자가 포함됩니다. 명령어에 따라 레지스터는 첫 번째 피연산자, 두 번째 피연산자 또는 둘 다일 수 있습니다.

예를 들면

MOV DX, TAX_RATE   ; Register in first operand
MOV COUNT, CX	   ; Register in second operand
MOV EAX, EBX	   ; Both the operands are in registers

레지스터 간의 데이터 처리에는 메모리가 필요하지 않으므로 데이터 처리 속도가 가장 빠릅니다.

즉각적인 주소 지정

즉치 피연산자에는 상수 값 또는 표현식이 있습니다. 두 개의 피연산자가있는 명령어가 즉시 주소 지정을 사용하는 경우 첫 번째 피연산자는 레지스터 또는 메모리 위치가 될 수 있고 두 번째 피연산자는 즉시 상수입니다. 첫 번째 피연산자는 데이터의 길이를 정의합니다.

예를 들면

BYTE_VALUE  DB  150    ; A byte value is defined
WORD_VALUE  DW  300    ; A word value is defined
ADD  BYTE_VALUE, 65    ; An immediate operand 65 is added
MOV  AX, 45H           ; Immediate constant 45H is transferred to AX

직접 메모리 주소 지정

피연산자가 메모리 주소 지정 모드에서 지정되면 주 메모리 (일반적으로 데이터 세그먼트에 대한 직접 액세스)가 필요합니다. 이러한 주소 지정 방법으로 인해 데이터 처리 속도가 느려집니다. 메모리에서 데이터의 정확한 위치를 찾으려면 일반적으로 DS 레지스터에있는 세그먼트 시작 주소와 오프셋 값이 필요합니다. 이 오프셋 값은effective address.

직접 주소 지정 모드에서 오프셋 값은 일반적으로 변수 이름으로 표시되는 명령어의 일부로 직접 지정됩니다. 어셈블러는 오프셋 값을 계산하고 프로그램에서 사용되는 모든 변수의 오프셋 값을 저장하는 기호 테이블을 유지합니다.

직접 메모리 주소 지정에서 피연산자 중 하나는 메모리 위치를 참조하고 다른 피연산자는 레지스터를 참조합니다.

예를 들면

ADD	BYTE_VALUE, DL	; Adds the register in the memory location
MOV	BX, WORD_VALUE	; Operand from the memory is added to register

직접 오프셋 주소 지정

이 주소 지정 모드는 산술 연산자를 사용하여 주소를 수정합니다. 예를 들어, 데이터 테이블을 정의하는 다음 정의를 살펴보십시오.

BYTE_TABLE DB  14, 15, 22, 45      ; Tables of bytes
WORD_TABLE DW  134, 345, 564, 123  ; Tables of words

다음 작업은 메모리의 테이블에서 레지스터로 데이터에 액세스합니다.

MOV CL, BYTE_TABLE[2]	; Gets the 3rd element of the BYTE_TABLE
MOV CL, BYTE_TABLE + 2	; Gets the 3rd element of the BYTE_TABLE
MOV CX, WORD_TABLE[3]	; Gets the 4th element of the WORD_TABLE
MOV CX, WORD_TABLE + 3	; Gets the 4th element of the WORD_TABLE

간접 메모리 주소 지정

이 주소 지정 모드는 컴퓨터의 Segment : Offset 주소 지정 기능을 활용합니다 . 일반적으로 메모리 참조를 위해 대괄호 안에 코딩 된 기본 레지스터 EBX, EBP (또는 BX, BP) 및 인덱스 레지스터 (DI, SI)가이 용도로 사용됩니다.

간접 주소 지정은 일반적으로 배열과 같은 여러 요소를 포함하는 변수에 사용됩니다. 어레이의 시작 주소는 예를 들어 EBX 레지스터에 저장됩니다.

다음 코드 스 니펫은 변수의 여러 요소에 액세스하는 방법을 보여줍니다.

MY_TABLE TIMES 10 DW 0  ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE]     ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110          ; MY_TABLE[0] = 110
ADD EBX, 2              ; EBX = EBX +2
MOV [EBX], 123          ; MY_TABLE[1] = 123

MOV 지침

우리는 이미 한 저장 공간에서 다른 저장 공간으로 데이터를 이동하는 데 사용되는 MOV 명령어를 사용했습니다. MOV 명령어는 두 개의 피연산자를 사용합니다.

통사론

MOV 명령어의 구문은 다음과 같습니다.

MOV  destination, source

MOV 명령어는 다음 5 가지 형식 중 하나를 가질 수 있습니다.

MOV  register, register
MOV  register, immediate
MOV  memory, immediate
MOV  register, memory
MOV  memory, register

유의하십시오-

  • MOV 연산의 두 피연산자는 크기가 같아야합니다.
  • 소스 피연산자의 값은 변경되지 않습니다.

MOV 명령어는 때때로 모호성을 유발합니다. 예를 들어, 진술을보십시오-

MOV  EBX, [MY_TABLE]  ; Effective Address of MY_TABLE in EBX
MOV  [EBX], 110	      ; MY_TABLE[0] = 110

해당 바이트 또는 숫자 110에 해당하는 단어를 이동할 것인지 여부는 명확하지 않습니다. 이러한 경우 다음을 사용하는 것이 좋습니다. type specifier.

다음 표는 일반적인 유형 지정자 중 일부를 보여줍니다.

유형 지정자 처리 된 바이트
바이트 1
워드 2
DWORD 4
QWORD 8
TBYTE 10

다음 프로그램은 위에서 설명한 몇 가지 개념을 보여줍니다. 메모리의 데이터 섹션에 'Zara Ali'라는 이름을 저장 한 다음 그 값을 프로그래밍 방식으로 'Nuha Ali'라는 다른 이름으로 변경하고 두 이름을 모두 표시합니다.

section	.text
   global _start     ;must be declared for linker (ld)
_start:             ;tell linker entry point
	
   ;writing the name 'Zara Ali'
   mov	edx,9       ;message length
   mov	ecx, name   ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	[name],  dword 'Nuha'    ; Changed the name to Nuha Ali
	
   ;writing the name 'Nuha Ali'
   mov	edx,8       ;message length
   mov	ecx,name    ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	eax,1       ;system call number (sys_exit)
   int	0x80        ;call kernel

section	.data
name db 'Zara Ali '

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Zara Ali Nuha Ali