Учебники

Сборка — Константы

NASM предоставляет несколько директив, определяющих константы. Мы уже использовали директиву EQU в предыдущих главах. Мы будем особенно обсуждать три директивы —

  • EQU
  • % правопреемник
  • % определяют

Директива EQU

Директива EQU используется для определения констант. Синтаксис директивы EQU следующий:

CONSTANT_NAME EQU expression

Например,

TOTAL_STUDENTS equ 50

Затем вы можете использовать это постоянное значение в вашем коде, например:

mov  ecx,  TOTAL_STUDENTS 
cmp  eax,  TOTAL_STUDENTS

Операндом оператора EQU может быть выражение —

LENGTH equ 20
WIDTH  equ 10
AREA   equ length * width

Выше сегмент кода будет определять AREA как 200.

пример

Следующий пример иллюстрирует использование директивы EQU —

Live Demo

SYS_EXIT  equ 1
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1
section	 .text
   global _start    ;must be declared for using gcc
	
_start:             ;tell linker entry point
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg1         
   mov edx, len1 
   int 0x80                
	
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg2         
   mov edx, len2 
   int 0x80 
	
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg3         
   mov edx, len3 
   int 0x80
   
   mov eax,SYS_EXIT    ;system call number (sys_exit)
   int 0x80            ;call kernel

section	 .data
msg1 db	'Hello, programmers!',0xA,0xD 	
len1 equ $ - msg1			

msg2 db 'Welcome to the world of,', 0xA,0xD 
len2 equ $ - msg2 

msg3 db 'Linux assembly programming! '
len3 equ $- msg3

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Hello, programmers!
Welcome to the world of,
Linux assembly programming!

Директива% assign

Директива % assign может использоваться для определения числовых констант, таких как директива EQU. Эта директива допускает переопределение. Например, вы можете определить постоянную ВСЕГО как

%assign TOTAL 10

Позже в коде вы можете переопределить его как —

%assign  TOTAL  20

Эта директива чувствительна к регистру.

% Определяет директиву

Директива % define позволяет определять как числовые, так и строковые константы. Эта директива похожа на #define в C. Например, вы можете определить постоянную PTR как —

%define PTR [EBP+4]

Приведенный выше код заменяет PTR на [EBP + 4].

Эта директива также допускает переопределение и учитывает регистр.