어셈블리-변수

NASM은 다양한 define directives변수에 대한 저장 공간을 예약합니다. 정의 어셈블러 지시문은 스토리지 공간 할당에 사용됩니다. 하나 이상의 바이트를 예약하고 초기화하는 데 사용할 수 있습니다.

초기화 된 데이터를위한 저장 공간 할당

초기화 된 데이터에 대한 저장 할당 문 구문은 다음과 같습니다.

[variable-name]    define-directive    initial-value   [,initial-value]...

여기서 variable-name 은 각 저장 공간의 식별자입니다. 어셈블러는 데이터 세그먼트에 정의 된 각 변수 이름에 대한 오프셋 값을 연결합니다.

정의 지시문에는 다섯 가지 기본 형식이 있습니다.

지령 목적 저장 공간
DB 바이트 정의 1 바이트 할당
DW 단어 정의 2 바이트 할당
DD 더블 워드 정의 4 바이트 할당
DQ 쿼드 워드 정의 8 바이트 할당
DT 10 바이트 정의 10 바이트 할당

다음은 정의 지시어를 사용하는 몇 가지 예입니다-

choice		DB	'y'
number		DW	12345
neg_number	DW	-12345
big_number	DQ	123456789
real_number1	DD	1.234
real_number2	DQ	123.456

유의하십시오-

  • 문자의 각 바이트는 16 진수의 ASCII 값으로 저장됩니다.

  • 각 10 진수 값은 해당하는 16 비트 2 진수로 자동 변환되어 16 진수로 저장됩니다.

  • 프로세서는 리틀 엔디안 바이트 순서를 사용합니다.

  • 음수는 2의 보수 표현으로 변환됩니다.

  • 짧은 부동 소수점 숫자와 긴 부동 소수점 숫자는 각각 32 비트 또는 64 비트를 사용하여 표시됩니다.

다음 프로그램은 정의 지시어의 사용을 보여줍니다-

section .text
   global _start          ;must be declared for linker (gcc)
	
_start:                   ;tell linker entry point
   mov	edx,1		  ;message length
   mov	ecx,choice        ;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
choice DB 'y'

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

y

초기화되지 않은 데이터를위한 저장 공간 할당

예약 지시문은 초기화되지 않은 데이터를위한 공간을 예약하는 데 사용됩니다. 예약 지시문은 예약 할 공간 단위 수를 지정하는 단일 피연산자를 사용합니다. 각 정의 지시문에는 관련 예약 지시문이 있습니다.

예비 지침에는 다섯 가지 기본 형식이 있습니다.

지령 목적
RESB 바이트 예약
RESW 단어 예약
RESD 더블 워드 예약
RESQ 쿼드 워드 예약
쉬다 10 바이트 예약

다중 정의

프로그램에 여러 데이터 정의 명령문이있을 수 있습니다. 예를 들면-

choice	  DB 	'Y' 		 ;ASCII of y = 79H
number1	  DW 	12345 	 ;12345D = 3039H
number2    DD  12345679  ;123456789D = 75BCD15H

어셈블러는 여러 변수 정의에 대해 연속 메모리를 할당합니다.

다중 초기화

TIMES 지시문은 동일한 값에 대한 여러 초기화를 허용합니다. 예를 들어, 크기가 9 인 mark라는 배열은 다음 문을 사용하여 정의하고 0으로 초기화 할 수 있습니다.

marks  TIMES  9  DW  0

TIMES 지시문은 배열과 테이블을 정의하는 데 유용합니다. 다음 프로그램은 화면에 9 개의 별표를 표시합니다.

section	.text
   global _start        ;must be declared for linker (ld)
	
_start:                 ;tell linker entry point
   mov	edx,9		;message length
   mov	ecx, stars	;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
stars   times 9 db '*'

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

*********