An Assembly program to read in decimal inputs repeatedly untill a zero value is read, At this point it should print out the sum of the numbers read in so far

By | March 22, 2014

Now we will write another Assembly program to read  in decimal inputs repeatedly untill a zero value is read, At this point it should print out the sum of the numbers read in so far.

Let’s identify variables needed for this program.
First variables will be holding the Messages “ENTER NO.BETN (0-9) & (ENTER ZERO TO STOP) ” and “TOTAL SUM OF NUMBERS IS “ to be printed for the User, So in all  Two variables.
The identified variables are MSG1 and MSG2.

First Line – DATA SEGMENT

DATA SEGMENT is the starting point of the Data Segment in a Program and DATA is the name given to this segment and SEGMENT is the keyword for defining Segments, Where we can declare our variables.

Next Line – MSG1 DB 10,13,”ENTER NO.BETN (0-9) & (ENTER ZERO TO STOP) : $”
     MSG2 DB 10,13,”TOTAL SUM OF NUMBERS IS : $”

MSG1 DB 10,13,”ENTER NO.BETN (0-9) & (ENTER ZERO TO STOP) : $” this line is a declaration of Charater Array initialized with “ENTER NO.BETN (0-9) & (ENTER ZERO TO STOP) : $”. 10,13, works as New Line Character if this is not present All the Messages will be printed on the same line and $ is used as (\n) NULL character in C program. (A Character is of a BYTE Hence we have to use only DB Define Byte ) and Similarly to MSG1 and MSG2. 

Next Line – DATA ENDS

DATA ENDS is the End point of the Data Segment in a Program. We can write just ENDS But to differentiate the end of which segment it is of which we have to write the same name given to the Data Segment.

Now, Selection of data type is DB data type the character array so DB is sufficient.

 DATA SEGMENT
     NUM1 DB ?
     NUM2 DB ?
     MSG1 DB 10,13,"ENTER FIRST NUMBER TO COMPARE : $"
     MSG2 DB 10,13,"ENTER SECOND NUMBER TO COMPARE : $"  
     MSG3 DB 10,13,"SMALLER NUMBER IS : $"
ENDS

 In Assembly programming, the variable are all defined by bytes only.

DB – Define Byte  (Size – 1 Byte)

DW – Define Word  (Size – 2 Byte)

DD – Define Double word  (Size -  4 Bytes)

DQ – Define Quad word  (Size – 8 Bytes)

DT – Define Ten Bytes  (Size – 10 Bytes)

NUMBER SYSTEM in Assembly Programming is Decimal, Octal, Hexadecimal, Binary.

In the Program, We are entering the values for the variables and Do arithmetical Operations like Addition, Subtraction, Multiplication and Division So the Computer should understand which kind of Number is entered. Hence there is a different letters for different Number Systems. O or o stands for Octal, H or h stands for Hexadecimal, B or b stands for Binary, D or d stands for Decimal. By default type of numbering system is Decimal. If you do not specify any letter then the number is understood to be Decimal (By default).

DATA SEGMENT
     MSG1 DB 10,13,"ENTER NO.BETN (0-9) & (ENTER ZERO TO STOP) : $"
     MSG2 DB 10,13,"TOTAL SUM OF NUMBERS IS : $"
DATA ENDS
CODE SEGMENT
    ASSUME DS:DATA CS:CODE
START:
      MOV AX,DATA
      MOV DS,AX
     
      MOV BL,0
     
INPUT:LEA DX,MSG1     
      MOV AH,9
      INT 21H
    
      MOV AH,1
      INT 21H
     
      CMP AL,30H
      JE EXIT
     
      SUB AL,30H
      ADD AL,BL
      MOV BL,AL
          
      JMP INPUT    
    
EXIT: LEA DX,MSG2     
      MOV AH,9
      INT 21H
     
      MOV AL,BL
      AAM
     
      ADD AX,3030H
      MOV BX,AX
     
      MOV DL,BH
      MOV AH,2
      INT 21H
     
      MOV DL,BL
      MOV AH,2
      INT 21H
     
      MOV AH,4CH
      INT 21H    
CODE ENDS
END START

Explanation : 

In this Assembly Language Programming, A single program is divided into four Segments which are 1. Data Segment, 2. Code Segment, 3. Stack Segment, and 4. Extra  Segment. Now, from these one is compulsory i.e. Code Segment if at all you don’t need variable(s) for your program.if you need variable(s) for your program you will need two Segments i.e. Code Segment and Data Segment.

Next Line –CODE SEGMENT

CODE SEGMENT is the starting point of the Code Segment in a Program and CODE is the name given to this segment and SEGMENT is the keyword for defining Segments, Where we can write the coding of the program.

Next Line –     ASSUME DS:DATA CS:CODE

In this Assembly Language Programming, their are Different Registers present for Different Purpose So we have to assume DATA is the name given to Data Segment register and CODE is the name given to Code Segment register (SS,ES are used in the same way as CS,DS )

Next Line – START:

START is the label used to show the starting point of the code which is written in the Code Segment. : is used to define a label as in C programming.

Next Line – MOV AX,DATA
MOV DS,AX

After Assuming DATA and CODE Segment, Still it is compulsory to initialize Data Segment to DS register.  MOV is a keyword to move the second element into the first element. But we cannot move DATA Directly to DS due to MOV commands restriction, Hence we move DATA to AX and then from AX to DS. AX is the first and most important register in the ALU unit. This part is also called INITIALIZATION OF DATA SEGMENT and It is important so that the Data elements or variables in the DATA Segment are made accessable. Other Segments are not needed to be initialized, Only assuming is enhalf.

Next Line – INPUT: LEA DX,MSG1      
      MOV AH,9
      INT 21H

The above three line code is used to print String or Message present in the character Array till $  symbol which tells the compiler to stop.

Now, lets understand line by line

INPUT: is a LABEL and all the words ending in colon (:). LEA DX,MSG1  in this LEA stands for LOAD EFFECTIVE ADDRESS and it loads the effective address of second element into the first element.  This same code can be interchangably written as MOV DX, OFFSET MSG1 where OFFSET  means effective address and MOV means move  second element into the first element.

MOV AH,9
INT 21H

The above two line code is used to PRINT the String or Message of the address present in DX register.

Standard Input and Standard Output related Interupts are found in INT 21H which is also called as DOS interrupt. It works with the value of AH register, If the Value is 9 or 9h, That means PRINT the String or Message of the address present in DX register.

Next Line – MOV AH,1
      INT 21H

The above Four line code is used to Read a Character from Console and save the value entered in variable NUM1 in its ASCII form. When you enter 5 we see 35H,So by comparing 30H or 35H we get ASCII value unchanged as we have to print the smaller back to console.

Standard Input and Standard Output related Interupts are found in INT 21H which is also called as DOS interrupt. It works with the value of AH register, If the Value is 1 or 1h, That means READ a Character from Console, Echo it on screen and save the value entered in AL register.

Next Line – CMP AL,30H
      JE EXIT

The above two line code is used to Compare and Jump if AL is Zero.

CMP AL,30h is used to Compare entered value i.e. AL register with Zero. JE EXIT is used to Jump to Label EXIT if if AL is Zero when compared with CMP instruction prior to this one.

 Next Line – SUB AL,30H
      ADD AL,BL
      MOV BL,AL

SUB AL,30H is used to convert ASCII value to DECIMAL value. ADD AL,BL is used to SUM UP the values in the LOOP. MOV BL,AL is used to preserve the total in BL register.

Next Line – JMP INPUT

The above line code is used to Jump to Label INPUT without any condition check. This jump will basically Continue the Loop execution.

Next Line – EXIT: LEA DX,MSG2
      MOV AH,9
      INT 21H 

EXIT: is a LABEL and all the words ending in colon (:).

The above two line code is used to PRINT the String or Message of the address present in DX register i.e. for MSG2.

 Next Line – MOV AL,BL
      AAM

 The first line is just to transfer BL register to AL register which is the Total Sum to printed later. The above two line code is used to split result in AH and AL after AAM in BCD form. AAM means ASCII Adjust after Multiplication. AAM Instruction has NO Operands or values attached to it. If we are adding two BCD numbers the Result is saved in AL register in HEXadecimal form. What AAA exactly does is it converts the result into BCD form and first digit is saved in AH register and second digit is saved in AL register.

Next Line – ADD AX,3030H
      MOV BX,AX

ADD AX,3030H is to move 3030H to AX register as we want to convert BCD form value to its ASCII equvalent by adding 30H to AH and AL registers.MOV BX,AX is used to preserve the ASCII equvalent in BX register which will be printed later.

Next Line – MOV DL,BH
      MOV AH,2
      INT 21H

The above line code is used to Write a Character on Console present in DL register i.e. BH register value.

Standard Input and Standard Output related Interupts are found in INT 21H which is also called as DOS interrupt. It works with the value of AH register, If the Value is 2 or 2h, That means WRITE a Character on Console present in DL register hence the value to be printed is moved to DL register. Here we are printing BH register value. Which is the First digit of Total Sum printed. 

Next Line – MOV DL,BL
      MOV AH,2
      INT 21H

The above Three line code is used to Write a Character on Console present in DL register i.e. BL register value. Which is the Second digit of Total Sum printed. 

 Next Line – MOV AH,4CH
      INT 21H

The above two line code is used to exit to dos or exit to operating system. Standard Input and Standard Output related Interupts are found in INT 21H which is also called as DOS interrupt. It works with the value of AH register, If the Value is 4ch, That means Return to Operating System or DOS which is the End of the program.

Next Line – CODE ENDS

CODE ENDS is the End point of the Code Segment in a Program. We can write just ENDS But to differentiate the end of which segment it is of which we have to write the same name given to the Code Segment.

Last Line – END START

END START is the end of the label used to show the ending point of the code which is written in the Code Segment.

Note :- In this Assembly Language Programming, We have Com format and EXE format. We are Learning in EXE format only which simple then COM format to understand and Write. We can write the program in lower or upper case, But i prepare Upper Case.

Screen Shots :-

 Asm_program_Add_Nos_Untill_Zero

Output After Execution :-

 Asm_program_Add_Nos_Untill_Zero_Output

Note :- To see the variable and its value you have to click vars button in the emulator.

Leave a Reply