Variables & Constants
Variables
To create variables the format is
[ variable-name ] define-directive initial-value [ ,initial-value ]...
There are five basic forms of the define directive −
Directive | Purpose | Storage Space |
---|---|---|
DB | Define Byte | allocates 1 byte |
DW | Define Word | allocates 2 bytes |
DD | Define Doubleword | allocates 4 bytes |
DQ | Define Quadword | allocates 8 bytes |
DT | Define Ten Bytes | allocates 10 bytes |
Since assembly doesn’t have variable types we need to define the amount of space required to store the variable.
choice DB 'y'
number DW 12345
neg_number DW -12345
big_number DQ 123456789
real_number1 DD 1.234
real_number2 DQ 123.456
Keep in mind that
- Each byte of character is stored as its ASCII value in hexadecimal.
- Each decimal value is automatically converted to its 16-bit binary equivalent and stored as a hexadecimal number.
- Processor uses the little-endian byte ordering.
- Negative numbers are converted to its 2’s complement representation.
- Short and long floating-point numbers are represented using 32 or 64 bits, respectively.
You can also reserve space for unitialised variables.
Directive | Purpose | |
---|---|---|
RESB | Reserve a Byte | |
RESW | Reserve a Word | |
RESD | Reserve a Doubleword | |
RESQ | Reserve a Quadword | |
REST | Reserve a Ten Bytes |
The TIMES directive allows multiple initializations to the same value. For example, an array named marks of size 9 can be defined and initialized to zero using the following statement −
marks TIMES 9 DW 0
The TIMES directive is useful in defining arrays and tables.
Constants
EQU
The EQU
directive is used for defining constants. The syntax of the EQU directive is as follows −
CONSTANT_NAME EQU expression
For example,
TOTAL_STUDENTS equ 50
You can then use this constant value in your code, like −
mov ecx, TOTAL_STUDENTS
cmp eax, TOTAL_STUDENTS
The operand of an EQU statement can be an expression −
LENGTH equ 20
WIDTH equ 10
AREA equ length * width
Above code segment would define AREA as 200.
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
%assign
The %assign directive can be used to define numeric constants like the EQU directive. This directive allows redefinition. For example, you may define the constant TOTAL as −
%assign TOTAL 10
Later in the code, you can redefine it as −
%assign TOTAL 20
This directive is case-sensitive.
%define
The %define directive allows defining both numeric and string constants. This directive is similar to the #define in C. For example, you may define the constant PTR as −
%define PTR [EBP+4]
The above code replaces PTR by [EBP+4].
This directive also allows redefinition and it is case-sensitive.
- Previous
- Next