어셈블리-변수
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 '*'
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
*********