Netwide Assembler (NASM) on Linux
The Netwide Assembler (NASM) is a portable and modular assembler for x86-64 architectures. It makes use of syntax that is easy to read and understand. It also enables support for macros and a wide range of x86 architecture extensions. NASM supports a wide range of formats.
It is available for almost every x86-based operating system (including macOS), and also accessible as a cross-platform assembler on other platforms. It employs Intel syntax, but differs from others in that it emphasises its own macro language, which allows for constructing more complicated expressions from simpler definitions, allowing new instructions to be created.
Install nasm
On Kali, nasm is installed by default. To install nasm
on most other distros (if it is not available):
Get the latest version of nasm from the netwide assembler (NASM) website.
Download the Linux source archive
nasm-xxxxxx.tar.gz
, wherexxxxxx
is the nasm version number in the archive. At time of writing, that wasnasm-2.16.01.tar.gz
.Unpack the archive.
cd
tonasm-xxxxxx
and type./configure
. This shell script will find the best C compiler to use and set up Makefiles accordingly.Type
make
to build thenasm
andndisasm
binaries.Type
make install
to installnasm
andndisasm
in/usr/local/bin
and to install the man pages.
On CentOS, Fedora, and Red Hat, you can use an RPM distribution and double-click the RPM file.
Editing, assembling, and running a NASM source file
Set the path of nasm
and ld
binaries in your PATH
environment variable.
Using any editor or IDE, create a simple hello.asm
:
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;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
msg db 'Hello, world!', 0xa ;string to be printed
len equ $ - msg ;length of the string
To assemble the program:
┌──(kali㉿kali)-[~/Development]
└─$ nasm -f elf hello.asm
┌──(kali㉿kali)-[~/Development]
└─$ ls
hello.asm hello.o
If there is any error, you will be prompted about it. Otherwise, an object file of the program named hello.o
will be created.
To link the object file and create an executable file:
┌──(kali㉿kali)-[~/Development]
└─$ ld -m elf_i386 -s -o hello hello.o
┌──(kali㉿kali)-[~/Development]
└─$ ls
hello hello.asm hello.o
Execute the program:
┌──(kali㉿kali)-[~/Development]
└─$ ./hello
Hello, world!