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.
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
xxxxxxis the nasm version number in the archive. At time of writing, that was
Unpack the archive.
./configure. This shell script will find the best C compiler to use and set up Makefiles accordingly.
maketo build the
make installto install
/usr/local/binand 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
ld binaries in your
PATH environment variable.
Using any editor or IDE, create a simple
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!