SYS_EXIT  equ 1
SYS_READ  equ 3
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1

segment .data 

   msg1 db "Enter a digit ", 0xA,0xD 
   len1 equ $- msg1 

   msg2 db "Please enter a second digit", 0xA,0xD 
   len2 equ $- msg2 
   
  msg3 db"Please enter a third digit", 0xA,0xD 
   len3 equ $- msg3 
   
    msg4 db "Please enter a fourth digit", 0xA,0xD 
   len4 equ $- msg4
   
    msg5 db "Please enter a fifth digit", 0xA,0xD 
   len5 equ $- msg5
   
   msg6 db "The sum is: "
   len6 equ $- msg6

segment .bss

   num1 RESt 1
   num2 RESt 1
   num3 RESt 1
   num4 RESt 1
   num5 RESt 1
   res RESt 1

section	.text
   global _start    ;must be declared for using gcc
	
_start:             ;tell linker entry point
inc esi
inc eax
inc ebx
inc ecx
inc edx





   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg1     
    mov edx, len1 
   int 0x80                

   mov eax, SYS_READ 
   mov ebx, STDIN  
   mov ecx, num1 
   mov edx, 2
   int 0x80            

       mov eax, SYS_WRITE        
   mov ebx, STDOUT         
   mov ecx, msg2          
   mov edx, len2         
   int 0x80

   mov eax, SYS_READ  
   mov ebx, STDIN  
   mov ecx, num2 
   mov edx, 2
   int 0x80    
     mov eax, SYS_WRITE        
   mov ebx, STDOUT         
   mov ecx, msg3         
   mov edx, len3        
   int 0x80

   mov eax, SYS_READ  
   mov ebx, STDIN  
   mov ecx, num3
   mov edx, 2
   int 0x80    
  mov eax, SYS_WRITE        
   mov ebx, STDOUT         
   mov ecx, msg4
   mov edx, len4
   int 0x80

   mov eax, SYS_READ  
   mov ebx, STDIN  
   mov ecx, num4
   mov edx, 2
   int 0x80    
     mov eax, SYS_WRITE        
   mov ebx, STDOUT         
   mov ecx, msg5
   mov edx, len5
   int 0x80

   mov eax, SYS_READ  
   mov ebx, STDIN  
   mov ecx, num5
   mov edx, 2
   int 0x80    
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg6   
   mov edx, len6   
   int 0x80

   ; moving the first number to eax register and second number to ebx
   ; and subtracting ascii '0' to convert it into a decimal number
	
   mov  esi, [num1]
   sub esi, '0'
   mov eax, [num2]
   sub eax, '0'
  mov ebx, [num3]
   sub ebx, '0'
   mov ecx, [num4]
   sub ecx, '0'
   mov edx, [num5]
   sub edx, '0'
  
   ; add eax and ebx
   add  esi, eax
   add  esi, ebx
   add  esi, ecx
   add  esi, edx
   ; add '0' to to convert the sum from decimal to ASCII
   add esi, '0'

   ; storing the sum in memory location res
   mov [res], esi

   ; print the sum 
   mov eax, SYS_WRITE        
   mov ebx, STDOUT
   mov ecx, res         
   mov edx, 1        
   int 0x80

exit:    
   
   mov eax, SYS_EXIT   
   xor ebx, ebx 
   int 0x80 

Assembly Online Compiler

Write, Run & Share Assembly code online using OneCompiler's Assembly online compiler for free. It's one of the robust, feature-rich online compilers for Assembly language. Getting started with the OneCompiler's Assembly compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as Assembly and start coding.

About Assembly

Assembly language(asm) is a low-level programming language, where the language instructions will be more similar to machine code instructions.

Every assembler may have it's own assembly language designed for a specific computers or an operating system.

Assembly language requires less execution time and memory. It is more helful for direct hardware manipulation, real-time critical applications. It is used in device drivers, low-level embedded systems etc.

Syntax help

Assembly language usually consists of three sections,

  1. Data section

    To initialize variables and constants, buffer size these values doesn't change at runtime.

  2. bss section

    To declare variables

  3. text section

    _start specifies the starting of this section where the actually code is written.

Variables

There are various define directives to allocate space for variables for both initialized and uninitialized data.

1. To allocate storage space to Initialized data

Syntax

variable-name    define-directive    initial-value 
Define DirectiveDescriptionAllocated Space
DBDefine Byte1 byte
DWDefine Word2 bytes
DDDefine Doubleword4 bytes
DQDefine Quadword8 bytes
DTDefine Ten Bytes10 bytes

2. To allocate storage space to un-initialized data

Define DirectiveDescription
RESBReserve a Byte
RESWReserve a Word
RESDReserve a Doubleword
RESQReserve a Quadword
RESTReserve a Ten Bytes

Constants

Constants can be defined using

1. equ

  • To define numeric constants
CONSTANT_NAME EQU regular-exp or value

2. %assign

  • To define numeric constants.
%assign constant_name value

3. %define

  • To define numeric or string constants.
%define constant_name value

Loops

Loops are used to iterate a set of statements for a specific number of times.

mov ECX,n
L1:
;<loop body>
loop L1

where n specifies the no of times loops should iterate.

Procedures

Procedure is a sub-routine which contains set of statements. Usually procedures are written when multiple calls are required to same set of statements which increases re-usuability and modularity.

procedure_name:
   ;procedure body
   ret